Для написания компилятора, каковы преимущества и недостатки использования LLVM IR против C для целевого языка? Я знаю, что оба используются, и я думаю, что конечный машинный код был бы аналогичным, если бы я использовал clang для компиляции C. Так что же еще нужно учитывать?Язык вывода компилятора - LLVM IR vs C
ответ
Я использовал LLVM IR для нескольких задних концов компилятора и работал с компиляторами, использующими C в качестве задней части. Одна вещь, которую я обнаружил, дал преимущество LLVM IR в том, что она напечатана. Трудно сделать полностью плохо сформированный вывод, не получая ошибок из библиотек LLVM.
На мой взгляд, также легче поддерживать тесную корреляцию между исходным кодом и IR для отладки.
Кроме того, вы получаете все классные инструменты командной строки LLVM для анализа и обработки IR, который испускает ваш передний конец.
Архитектуры и ОС, для которых нет CLANG, очевидно, или для которых он находится в экспериментальном состоянии.
C более широко принят, но LLVM IR позволяет вам загружать LLVM в двигатель. Не все пути к IR равны.
Я сомневаюсь, что вы можете осуществить надлежащую поддержку отладки для вашего языка при ориентации C.
Именно по этой причине я искал эту тему. Я не вижу, как могут быть «исходные карты» на символах отладки, потому что в генераторах отладочных символов компиляторов C есть обратные несоответствующие изменения. Нужно было бы обновить программное обеспечение для сопоставления символов отладки при каждой смене поддерживаемых компиляторов C. –
LLVM преимущества:
- JIT - вы можете скомпилировать и запустить свой код динамически. Конечно же, это возможно с C (например, с использованием встроенного
tcc
), но это гораздо менее надежный и портативный вариант. - Вы можете запускать собственные проходы оптимизации по генерируемому IR.
- Отражение бесплатно - проверка сгенерированного кода намного проще с LLVM.
- Библиотека LLVM не такая большая, как большинство компиляторов C (не считая
tcc
, конечно).
LLVM недостатки:
- код не является портативным, вы должны изменить его немного в зависимости от вашей цели. Существует несколько портативных подмножеств LLVM, но это по-прежнему хитроумная практика.
- Зависимость времени выполнения от библиотек C++ может быть немного проблемой.
вы забыли: если вы хотите C interop (на каком языке нет?), Вам нужно закодировать все эти неприятные C ABI сами, потому что llvm не делает этого сам по себе (он разделяет эту работу 50/50 с clang) – cap
- 1. C++ для LLVM IR
- 2. LLVM IR getelementptr LLVM C API эквивалент
- 3. LLVM IR Lambda Functions
- 4. Возможна автоматическая генерация кода llvm C++ api из LLVM-IR?
- 5. Отладка LLVM IR
- 6. Способ создания LLVM IR
- 7. LLVM IR вставки
- 8. Понимание простейшей LLVM IR
- 9. вставки инструкции LLVM IR
- 10. Как разобрать LLVM IR
- 11. LLVM IR печать номер
- 12. Как GCC IR отличается от LLVM IR?
- 13. LLVM-IR назначение указатель массива
- 14. преобразование LLVM IR в код другого языка
- 15. Как преобразовать llvm IR в код c?
- 16. Выполнить LLVM IR-код в C
- 17. Как вызвать функцию C++ в LLVM IR?
- 18. LLVM IR getelementptr недопустимые индексы
- 19. Отключение отладочного вывода LLVM IR при использовании Numba?
- 20. Загрузочный язык на LLVM
- 21. Перевод на LLVM IR напрямую или через C/Clang
- 22. Как испустить LLVM-IR от Cargo
- 23. Приращение ptr в llvm ir
- 24. ошибка сегментации в llvm ir
- 25. Найти llvm.pow.f64 в llvm IR
- 26. Инструкции Phi на LLVM IR
- 27. ошибка сегментации с llvm-ir
- 28. Замена инструкций в LLVM IR
- 29. Приращение переменной в LLVM IR
- 30. Оптимизация LLVM IR вложенных функций
Что означает, что набирается ИК? Не набирается ли C? – Dan
Справа, C набирается. Но вы не получите сообщение об ошибке, пока не попытаетесь скомпилировать код C. При использовании LLVM IR вы получаете указание на ошибку при генерации IR. Гораздо проще отлаживать. –