Как влияет на скорость компиляция в байт-код LLVM, затем в машинный код и т. Д.? - PullRequest
3 голосов
/ 30 сентября 2011

Я спрашиваю, потому что с растущей популярностью мобильных вычислений на устройствах ARM, постоянной потребностью в обратно совместимых устройствах X86 и новых технологиях, таких как квантовые вычисления, которые будут иметь совершенно разные архитектуры, промежуточный язык кажется лучшим выборомдля разработчика компилятора.Как двойная компиляция влияет на качество сгенерированного машинного кода?

Ответы [ 3 ]

3 голосов
/ 08 октября 2011

Все компиляторы используют низкоуровневое внутреннее представление (LIR) для выполнения низкоуровневых оптимизаций. В GCC это называется "GIMPLE"; в LLVM это называется «LLVM IR». Другими словами, подход LLVM ничем не отличается от других компиляторов в этом отношении.

На самом деле, большинство интерфейсных приложений далее используют некоторое высокоуровневое внутреннее представление (HIR) для выполнения некоторых оптимизаций (особенно в циклах), которые гораздо труднее применить на уровне LIR (или невозможно из-за потери информация).

Поэтому обычно программа проходит не 2, а 3 этапа «компиляции»: C -> HIR -> LIR -> ASM.

Что касается оставшейся части вашего вопроса, то, как уже упоминали другие люди, LIR не предназначен для переносимости между разными архитектурами, а между разными экземплярами одной и той же (или похожей) архитектуры. Есть много причин для этого:

  • Код C больше не является переносимым после таких шагов, как предварительная обработка или оценка различных размеров.

  • в зависимости от целевых приложений требуются различные оптимизации, некоторые из которых выполняются на уровне HIR (например, внутри Clang); было бы слишком поздно откатываться после преобразования в LLVM IR.

  • в любом случае, когда вы оптимизировали код C, он обычно сильно зависит от цели.

В любом случае, если вы заинтересованы в переносимости, вам также следует взглянуть на PTX ISA от NVidia. Это виртуальный ISA, общий для всех графических процессоров NVIdia, который компилируется драйвером графического процессора во время установки в машинный код.

0 голосов
/ 01 октября 2011

LLVM так же независима от платформы, как и ваш язык, т. Е. Она может быть независимой от платформы, но недостаточно высокого уровня, чтобы представлять язык C независимо.

Итак, если у вас нет типов и т. Д., Которые зависят от таких вещей, как «размер указателя», то вы, вероятно, в порядке. «Двойная компиляция» - это просто замечательно, потому что это означает, что вы можете скомпилировать точное оборудование во время выполнения / доставки / и т. Д. Именно для того процессора, который вам нужен. Недостатком является то, что ваш язык должен быть независимым от платформы или вам нужен битовый код для различных платформ.

0 голосов
/ 30 сентября 2011

LLVM предназначен для генерации высокопроизводительного кода из LLVM IR; если вы пишете новый компилятор, вы получите гораздо лучшую производительность при гораздо меньших усилиях, если будете использовать IR, а не писать собственный генератор кода. В некотором смысле можно сказать, что «двойная компиляция» фактически улучшает сгенерированный код, поскольку в LLVM имеются мощные оптимизаторы для LLVM IR.

http://www.aosabook.org/en/llvm.html могут представлять интерес.

...