2012-04-22 4 views
8

Для написания компилятора, каковы преимущества и недостатки использования LLVM IR против C для целевого языка? Я знаю, что оба используются, и я думаю, что конечный машинный код был бы аналогичным, если бы я использовал clang для компиляции C. Так что же еще нужно учитывать?Язык вывода компилятора - LLVM IR vs C

ответ

7

Я использовал LLVM IR для нескольких задних концов компилятора и работал с компиляторами, использующими C в качестве задней части. Одна вещь, которую я обнаружил, дал преимущество LLVM IR в том, что она напечатана. Трудно сделать полностью плохо сформированный вывод, не получая ошибок из библиотек LLVM.

На мой взгляд, также легче поддерживать тесную корреляцию между исходным кодом и IR для отладки.

Кроме того, вы получаете все классные инструменты командной строки LLVM для анализа и обработки IR, который испускает ваш передний конец.

+1

Что означает, что набирается ИК? Не набирается ли C? – Dan

+3

Справа, C набирается. Но вы не получите сообщение об ошибке, пока не попытаетесь скомпилировать код C. При использовании LLVM IR вы получаете указание на ошибку при генерации IR. Гораздо проще отлаживать. –

0

Архитектуры и ОС, для которых нет CLANG, очевидно, или для которых он находится в экспериментальном состоянии.

C более широко принят, но LLVM IR позволяет вам загружать LLVM в двигатель. Не все пути к IR равны.

1

Я сомневаюсь, что вы можете осуществить надлежащую поддержку отладки для вашего языка при ориентации C.

+0

Именно по этой причине я искал эту тему. Я не вижу, как могут быть «исходные карты» на символах отладки, потому что в генераторах отладочных символов компиляторов C есть обратные несоответствующие изменения. Нужно было бы обновить программное обеспечение для сопоставления символов отладки при каждой смене поддерживаемых компиляторов C. –

2

LLVM преимущества:

  1. JIT - вы можете скомпилировать и запустить свой код динамически. Конечно же, это возможно с C (например, с использованием встроенного tcc), но это гораздо менее надежный и портативный вариант.
  2. Вы можете запускать собственные проходы оптимизации по генерируемому IR.
  3. Отражение бесплатно - проверка сгенерированного кода намного проще с LLVM.
  4. Библиотека LLVM не такая большая, как большинство компиляторов C (не считая tcc, конечно).

LLVM недостатки:

  1. код не является портативным, вы должны изменить его немного в зависимости от вашей цели. Существует несколько портативных подмножеств LLVM, но это по-прежнему хитроумная практика.
  2. Зависимость времени выполнения от библиотек C++ может быть немного проблемой.
+0

вы забыли: если вы хотите C interop (на каком языке нет?), Вам нужно закодировать все эти неприятные C ABI сами, потому что llvm не делает этого сам по себе (он разделяет эту работу 50/50 с clang) – cap

Смежные вопросы