Может ли кто-нибудь помочь мне понять взаимосвязь между некоторыми новыми технологиями компилятора? Что такое LLVM и clang, и как они относятся к gcc/g ++?Понимание g ++ vs clang vs llvm
ответ
GCC - большой пакет программного обеспечения. Типичный процесс, как я понимаю, заключается в интерфейсе GCC для lex и анализе кода, преобразовании в внутренний язык переноса GCC, а затем для резервного копирования для записи собственного кода.
Таким образом, один типичный поток: C-код ---> Интерфейс CCC ---> RTL ---> серверный сервер GCC --- x86 машинный код.
GCC поддерживает несколько интерфейсов: C, C++, Java, Objective C, Go и Fortran.
GCC поддерживает несколько движков: 32-битный x86, 64-разрядную версию x86, ARM немного младшего, младший большой ARM, MIPS, SPARC, PowerPC и т.д.
Фронтэндов преобразования текста в RTL, движки преобразовать RTL в машину код какого-то типа.
LLVM - это среднеуровневое машинное вычисление, сходное по концепции с RTL GCC. Это своего рода система и набор инструкций, промежуточная форма (IF). Если я правильно понимаю, IFL LLVM более насыщен, более выразителен и гораздо более гибким, чем RTL от GCC, что дает много преимуществ. Компиляторы для LLVM для разных языков могут быть скомпилированы до LLVM IF. Это можно использовать для «обычных» языков, таких как C, C++, Java и т. Д., Но также может использоваться для «нетрадиционных» задач программирования, таких как графические шейдеры.
LLVM, возможно, это две вещи. LLVM-the-machine, которая является системой типов и набором команд, которая, вероятно, лучше всего называется «LLVM IF»; и LLVM-the-API, который является программным обеспечением для управления кодом в LLVM IF, например компилятором LLVM JIT или, возможно, бэкендом машинного кода LLVM x86.
Clang - это интерфейс для LLVM, который обрабатывает языки C-семейства: C, C++, Objective C, Objective C++. Clang преобразует C/C++/etc в LLVM IF, LLVM выполняет оптимизацию на IF, а бэкенд LLVM x86 записывает код машины x86 для выполнения.
Несмотря на название, LLVM не является виртуальной машиной в традиционном смысле - это модель и представление вычислений, которые хорошо поддаются задаче манипулирования кодом.
Популярность LLVM основывается на том, что это полностью reified API компилятора. Его можно использовать для выполнения статического анализа кода («используется ли этот код когда-либо случайно неинициализированной памяти?»), Оптимизации, разбора кода (например, для создания IDE). Внутренние компоненты GCC очень сильно связаны, и поэтому использование GCC таким образом невероятно сложно. Одним из примеров является то, что интерфейсы GCC выполняют некоторые оптимизации во время синтаксического анализа, поэтому невозможно всегда получить идеальное представление кода в виде, например, для сообщений об ошибках и выполнения подсветки синтаксиса с использованием синтаксиса, поскольку некоторая информация могла бы быть потерял.
Как я понимаю, Кланг сохраняет неоптимизированный синтаксис синтаксического анализа, позволяя сторонним инструментам использовать его вывод и приравнивать преобразования к исходному тексту, особенно сообщения об ошибках Клана гораздо полезнее, поскольку они могут выделить точная часть линии, о которой идет речь.
- 1. Clang, LLVM и g ++
- 2. g ++ vs intel/clang аргумент прохождение?
- 3. LLVM (3.5+) PassManager vs LegacyPassManager
- 4. C++ g ++ llvm-clang компилятор профилирования
- 5. Установка LLVM и Clang: apt-get vs. manual install
- 6. g: include vs g: render
- 7. VC++ vs. G ++, соиЬ
- 8. clang-3.8 и compiler-rt vs libgcc
- 9. Язык вывода компилятора - LLVM IR vs C
- 10. Python performance: Clang vs gcc
- 11. что установить cordova -g vs phonegap -g
- 12. Понимание IIS vs Service
- 13. Различия в компиляторах в g ++ 4.7.2 и Intel 13.0.1 vs clang ++ 3.2 и g ++ 4.8
- 14. Параметры iptables -j vs. -g
- 15. запретить встроенную сборку в g ++ (gcc) или clang (llvm)
- 16. ссылка не работает с clang/llvm, используя g ++
- 17. Квадратный корень комплексных чисел - g ++ vs icpc
- 18. Понимание простейшей LLVM IR
- 19. Windows.h и clang (LLVM)
- 20. llvm clang installation failed
- 21. clang/llvm ARM instrinics
- 22. Использование Clang и LLVM
- 23. Генератор понимание Vs массива понимания
- 24. Понимание статистики теста нагрузки VS
- 25. Понимание VS Module Window 2010
- 26. Понимание kafka broker vs zookeper
- 27. Понимание угловых контроллеров Vs директивы
- 28. Mingw + clang vs Boost под Windows: разные ошибки
- 29. LLVM: увязка ошибки в VS 2015
- 30. LLVM Промежуточное представление: fptoui vs. fptosi
Они являются обратными и передними концами их соответствующих систем, и они не имеют никакого отношения друг к другу. – Mehrdad
@ Mehrdad, что было не очень полезно. Что является бэкэнд (я предполагаю, что это значит генерация кода и привязка), который является интерфейсом (я предполагаю, что это означает драйвер компилятора), и какова мотивация для них по сравнению с существующими фронтами и бэкендами?Я также думаю, что, хотя в исполняемом файле gcc строго сказано только интерфейс, также принято называть всю инструментальную цепочку от источника до исполняемого «gcc». Не так ли было и с другими компиляторами? –