Может кто-нибудь помочь мне понять взаимосвязь между некоторыми новыми технологиями компилятора? Что такое LLVM и clang, и как они относятся к gcc/g++?
Понимание g++ vs clang vs llvm
Ответ 1
GCC - большой пакет программного обеспечения. Насколько я понимаю, типичный процесс заключается в том, что внешний интерфейс GCC выполняет lex и анализирует код, преобразует его во внутренний язык передачи регистров GCC, а затем создает внутренний код для записи собственного кода.
Итак, один типичный поток: C-код ---> GCC C-интерфейс ---> RTL ---> GCC x86 backend ---> машинный код x86.
GCC поддерживает несколько интерфейсов: C, C++, Java, Objective C, Go и Fortran.
GCC поддерживает несколько бэкэндов: 32-разрядный x86, 64-разрядный x86, ARM с прямым порядком байтов, ARM с прямым порядком байтов, MIPS, SPARC, PowerPC и т.д.
Интерфейсы конвертируют текст в RTL, серверы конвертируют RTL в какой-то машинный код.
LLVM - это машинно-независимое вычислительное представление среднего уровня, концептуально сходное с GCC RTL. Это его собственная система типов и набор команд, называемый промежуточным представлением LLVM (IR). Если я правильно понимаю, LLVM IR является более богатым, выразительным и гораздо более гибким, чем GCC RTL, что дает много преимуществ. Интерфейсы компилятора для LLVM для многих разных языков могут компилироваться вплоть до LLVM IR. Это может использоваться для "обычных" языков, таких как C, C++, Java и т.д., Но также может использоваться для "нетрадиционных" задач программирования, таких как шейдеры GPU или SQL-запросы.
LLVM - это, пожалуй, две вещи. LLVM-the-machine - система типов и набор команд, которые, вероятно, лучше называть "LLVM IR"; и LLVM-the-API, который является программным обеспечением для манипулирования кодом в IR LLVM, таким как JIT-компилятор LLVM или, возможно, бэкэнд машинного кода LLVM x86.
Clang - это интерфейс для LLVM, который обрабатывает языки семейства C: C, C++, Objective C, Objective C++. Clang преобразует C/C++/etc в LLVM IR, LLVM выполняет оптимизацию IR, а бэкэнд LLVM x86 записывает машинный код x86 для выполнения.
Несмотря на название, LLVM не является Виртуальной машиной в традиционном смысле - это вычислительная модель и представление, которое хорошо подходит для задачи манипулирования кодом.
Частично популярность LLVM связана с тем, что это полностью переработанный API компилятора. Его можно использовать для выполнения статического анализа кода ("случайно ли этот код использует неинициализированную память?"), Оптимизации, разбора кода (например, для построения IDE). Внутренние компоненты GCC очень сильно связаны, поэтому использование GCC таким образом невероятно сложно. Одним из примеров является то, что во время синтаксического анализа интерфейсы GCC выполняют некоторую оптимизацию, поэтому не всегда возможно получить идеальное представление кода, набранного в виде кода, например, для сообщения об ошибках и выполнения подсветки синтаксиса строки извилистой линии, поскольку некоторая информация могла быть потерял.
Насколько я понимаю, Clang сохраняет неоптимизированный синтаксический синтаксис, позволяя сторонним инструментам использовать его выходные данные и приравнивать преобразования к исходному тексту, в частности, сообщения об ошибках Clang гораздо более полезны, поскольку они могут выделить точную часть линия, о которой идет речь.