Промежуточный код из C ++ - PullRequest
3 голосов
/ 10 мая 2011

Я хочу скомпилировать программу на C ++ в промежуточный код. Затем я хочу скомпилировать промежуточный код для текущего процессора со всеми его ресурсами.

Первым шагом является компиляция программы на C ++ с оптимизацией (-O2), запуск компоновщика и выполнение большей части процедуры компиляции. Этот шаг не должен зависеть от операционной системы и архитектуры.

Второй шаг - это компиляция результата первого шага без исходного исходного кода для операционной системы и процессора текущего компьютера с оптимизацией и специальными инструкциями процессора (-march = native). Второй шаг должен быть быстрым и с минимальными требованиями к программному обеспечению.

Могу ли я это сделать? Как это сделать?

Редактировать
Я хочу сделать это, потому что я хочу распространять независимую от платформы программу, которая может использовать все ресурсы процессора, без исходного исходного кода, вместо того, чтобы распространять компиляцию для каждой платформы и операционной системы. Было бы хорошо, если бы второй шаг был быстрым и легким.

Процессоры с одинаковой архитектурой могут иметь разные функции. Процессоры X86 могут иметь SSE1, SSE2 или другие, и они могут быть 32- или 64-разрядными. Если я скомпилирую для универсального X86, в нем не будет оптимизации SSE. Через много лет у процессоров появятся новые функции, и программу придется скомпилировать для новых процессоров.

Ответы [ 3 ]

7 голосов
/ 10 мая 2011

Просто предложение - Google Clang и LLVM.

3 голосов
/ 10 мая 2011

Как много вы знаете о компиляторах?Кажется, вы воспринимаете «-O2» как магический флаг.

Например, назначение регистров является типичной оптимизацией.Вам определенно нужно узнать, сколько регистров доступно.Нет смысла присваивать foo для регистрации 16, а затем на этапе 2 обнаруживается, что вы нацеливаетесь на x86.

И эти архитектурно-зависимые оптимизации могут быть довольно сложными.Встраивание критически зависит от стоимости звонка, а это, в свою очередь, зависит от архитектуры.

0 голосов
/ 11 мая 2011

Как только вы доберетесь до «специфичных для процессора» оптимизаций, все станет действительно сложно. Для конкретного платформенного компилятора действительно трудно быть по-настоящему «универсальным» при генерации объектного или «промежуточного» кода на соответствующем «уровне»: если это не что-то вроде кода «IL» (промежуточный язык) (например, C # -IL код (или Java-байт-код), для данного компилятора действительно трудно знать, «где остановиться» (поскольку оптимизация происходит повсеместно на разных уровнях компиляции, когда существует знание целевой платформы).

Еще одна мысль: как насчет компиляции в «предварительно обработанный» исходный код, как правило, с расширением «*.i», а затем с распределенной компиляцией на разных архитектурах?

Например, большинство (все) компиляторы C и C ++ поддерживают что-то вроде:

cc /P MyFile.cpp
gcc -E MyFile.cpp

... каждый генерирует MyFile.i, который является предварительно обработанным файлом. Теперь, когда файл включает ALL заголовки и другие #defines, вы можете скомпилировать этот файл *.i в целевой объектный файл (или исполняемый файл) после его распространения в других системах. (Возможно, вам придется проявить смекалку, если ваши макросы препроцессора специфичны для целевой платформы, но это должно быть довольно просто для вашей системы сборки, которая должна сгенерировать командную строку для этой предварительной обработки.)

Этот подход используется distcc для локальной обработки файла, поэтому на удаленных "фермах сборки" не нужно устанавливать какие-либо заголовки или другие пакеты. (Вы гарантированно получите один и тот же продукт сборки, независимо от того, как настроены машины в ферме сборки.)

Таким образом, аналогичным образом он будет иметь эффект централизации «конфигурации / предварительной обработки» для одного компьютера, но обеспечит кросс-компиляцию, компиляцию для конкретной платформы или поддержку фермы компоновки в распределенном режиме.

К вашему сведению - мне действительно нравится концепция distcc, но последнее обновление для этого конкретного проекта было в 2008 году. Так что я бы заинтересовался другими подобными инструментами / продуктами, если вы их найдете. (А пока пишу похожий инструмент.)

...