LLVM против clang OS X

У меня есть вопрос относительно llvm, clang и gcc на OS X.

В чем разница между llvm-gcc 4.2, llvm 2.0 и clang? Я знаю, что все они строятся на llvm, но как они отличаются?

Помимо более быстрого компиляции, в чем преимущество llvm над gcc?

Ответ 1

LLVM изначально стоял за "низкоуровневую виртуальную машину", хотя теперь он просто выступает за себя, поскольку он стал чем-то иным, чем традиционной виртуальной машиной. Это набор библиотек и инструментов, а также стандартизованное промежуточное представление, которое может использоваться для создания компиляторов и компиляторов "точно в срок". Он не может самостоятельно компилировать ничего, кроме своего собственного промежуточного представления; для этого требуется интерфейс для конкретного языка. Если люди просто обращаются к LLVM, они, вероятно, означают только библиотеку и инструменты низкого уровня. Некоторые люди могут неправильно ссылаться на Clang или llvm-gcc как на "LLVM", что может вызвать некоторую путаницу.

llvm-gcc - это модифицированная версия GCC, которая использует LLVM в качестве бэкэнд вместо GCC. В настоящее время он устарел, в пользу DragonEgg, который использует новую систему плагинов GCC, чтобы сделать то же самое без разветвления GCC.

Clang - это целый новый компилятор C/С++/ Objective-C, который использует свой собственный интерфейс и LLVM в качестве бэкэнд. К преимуществам, которые он предоставляет, относятся лучшие сообщения об ошибках, более быстрое время компиляции и более простой способ подключения других инструментов к процессу компиляции (например, отладчик LLDB и Clang static analyzer). Он также достаточно модульный и поэтому может использоваться как библиотека для другого программного обеспечения, которое должно анализировать код C, С++ или Objective-C.

Каждый из этих подходов (простой GCC, GCC + LLVM и Clang) имеет свои преимущества и недостатки. Последние несколько наборов тестов, которые я видел, показали, что GCC производит немного более быстрый код в большинстве тестовых случаев (хотя у LLVM было небольшое преимущество в нескольких), в то время как LLVM и Clang дали значительно лучшие времена компиляции. GCC и GCC/LLVM-комбо имеют то преимущество, что намного больше кода было проверено и работает на GCC-вкус C; существуют некоторые расширения для компилятора, которые имеют только GCC, и некоторые места, где стандарт позволяет изменять реализацию, но код зависит от одной конкретной реализации. Гораздо более вероятно, если вы получите большой код унаследованного кода C, который он будет работать в GCC, чем тот, который будет работать в Clang, хотя со временем это улучшается.

Ответ 2

Здесь есть две разные вещи.

LLVM - это бэкэнд-компилятор, предназначенный для сборки компиляторов поверх него. Он посвящен оптимизации и созданию кода, адаптированного к целевой архитектуре.

CLang - это интерфейс, который анализирует код C, С++ и Objective C и преобразует его в представление, подходящее для LLVM.

llvm gcc была исходной версией компилятора С++ на основе llvm на основе gcc 4.2, который теперь устарел, поскольку CLang может анализировать все, что он может анализировать, и многое другое.

Наконец, основное отличие между CLang и gcc заключается не в готовом коде, а в подходе. Хотя gcc является монолитным, CLang был построен как набор библиотек. Эта модульная конструкция позволяет использовать большие возможности повторного использования для IDE или инструментов завершения, например.

В настоящий момент код, созданный gcc 4.6, обычно немного быстрее, но CLAN закрывает пробел.

Ответ 3

llvm-gcc-4.2 использует интерфейс GCC для анализа вашего кода, затем генерирует скомпилированный вывод с использованием LLVM.

"llvm compiler 2.0" использует интерфейс clang для анализа вашего кода и генерирует скомпилированный вывод с использованием LLVM. "clang" на самом деле является просто именем этого front-end, но часто используется как имя для компилятора в целом.