Язык вывода компилятора — LLVM IR против C

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


person Dan    schedule 22.04.2012    source источник


Ответы (5)


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

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

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

person Richard Pennington    schedule 22.04.2012
comment
Что значит IR набирается? Разве C тоже не типизирован? - person Dan; 23.04.2012
comment
Правильно, C набрано. Но вы не получите указания на ошибку, пока не попытаетесь скомпилировать код C. С LLVM IR вы получаете указание об ошибке при создании IR. Гораздо легче отлаживать. - person Richard Pennington; 23.04.2012

Преимущества ЛЛВМ:

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

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

  1. Код не является переносимым, вам нужно немного изменить его в зависимости от вашей цели. Существует несколько переносимое подмножество LLVM, но это все еще хитрая практика.
  2. Зависимость времени выполнения от библиотек C++ может быть проблемой.
person SK-logic    schedule 23.04.2012
comment
вы забыли: если вы хотите взаимодействие с C (какой язык не поддерживает?), вы должны сами закодировать все эти неприятные C ABI, потому что llvm не делает этого сам по себе (он разделяет эту работу 50/50 с помощью clang) - person ; 11.06.2015

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

person arrowd    schedule 22.04.2012
comment
Именно по этой причине я искал эту тему. Я не вижу возможности использовать исходные карты для символов отладки, потому что в генераторах символов отладки компиляторов C есть обратно несовместимые изменения. При каждом изменении поддерживаемых компиляторов C потребуется обновлять программное обеспечение для отображения символов отладки. - person polkovnikov.ph; 15.06.2015

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

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

person Marco van de Voort    schedule 22.04.2012

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

Преимущества C

  1. Кроссплатформенность
  2. Отладка (Пожалуйста, прочитайте ниже. Это частично связано с пунктом 4.)
  3. Совместимость
  4. Простота использования

Преимущества LLVM IR

  1. Представление
  2. Варианты настройки
  3. Объем памяти
  4. Строгая типизация/безопасность

С

  1. Существуют C-компиляторы для всех видов встраиваемых систем, хотя в последнее время LLVM получил больше целей. Можно утверждать, что C имеет небольшое преимущество перед LLVM IR (промежуточное представление) в этой категории.

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

  3. Третий пункт. Интероперабельность более суетливая. Однако C имеет стандартизированный бинарный интерфейс приложения. Таким образом, проще писать библиотеки и связывать эти библиотеки с другими программами, написанными на C и/или C+. Тем не менее, многие языки, такие как Java, предоставляют стандартизированные интерфейсы для C.

  4. Можно утверждать, что легче начать работу и заставить что-то работать, нацелившись на C.

LLVM

  1. C - язык довольно высокого уровня, и если он не написан, идиоматически, производительность может ухудшиться (в зависимости от целевого компилятора и от того, какие предположения делает указанный компилятор). Есть некоторые документы, такие как Бэкэнд llVM для GHC, который иллюстрирует некоторые недостатки C и преимущества LLVM IR как целевого языка.

  2. Поскольку LLVM (фреймворк) построен как набор повторно используемых модулей, легко написать проходы для конкретного целевого языка для вашего конкретного целевого языка. Также проще написать собственный сборщик мусора (по состоянию на 2020 год для этого есть некоторая поддержка) . В случае C это также возможно, и есть некоторые сборщики мусора, такие как Boehm GC. Однако C не предназначен для использования в качестве промежуточного языка.

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

  4. В то время как C является слабо типизированным языком. LLVM IR является строго типизированным. Поэтому можно утверждать, что безопаснее ориентироваться на LLVM IR.

person JKRT    schedule 22.07.2020