2014-07-19 2 views
12

Может ли кто-нибудь помочь мне понять взаимосвязь между некоторыми новыми технологиями компилятора? Что такое LLVM и clang, и как они относятся к gcc/g ++?Понимание g ++ vs clang vs llvm

+0

Они являются обратными и передними концами их соответствующих систем, и они не имеют никакого отношения друг к другу. – Mehrdad

+0

@ Mehrdad, что было не очень полезно. Что является бэкэнд (я предполагаю, что это значит генерация кода и привязка), который является интерфейсом (я предполагаю, что это означает драйвер компилятора), и какова мотивация для них по сравнению с существующими фронтами и бэкендами?Я также думаю, что, хотя в исполняемом файле gcc строго сказано только интерфейс, также принято называть всю инструментальную цепочку от источника до исполняемого «gcc». Не так ли было и с другими компиляторами? –

ответ

37

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 выполняют некоторые оптимизации во время синтаксического анализа, поэтому невозможно всегда получить идеальное представление кода в виде, например, для сообщений об ошибках и выполнения подсветки синтаксиса с использованием синтаксиса, поскольку некоторая информация могла бы быть потерял.

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

+3

Узел LLVM обычно называется IR (промежуточное представление), а не IF. – keltar

+0

Спасибо. Я почти ничего не понял. – sapy

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