У меня есть вопрос относительно llvm, clang и gcc на OS X.
В чем разница между llvm-gcc 4.2, llvm 2.0 и clang? Я знаю, что все они строятся на llvm, но как они отличаются?
Помимо более быстрого компиляции, в чем преимущество llvm над gcc?
У меня есть вопрос относительно llvm, clang и gcc на OS X.
В чем разница между llvm-gcc 4.2, llvm 2.0 и clang? Я знаю, что все они строятся на llvm, но как они отличаются?
Помимо более быстрого компиляции, в чем преимущество llvm над gcc?
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, хотя со временем это улучшается.
Здесь есть две разные вещи.
LLVM - это бэкэнд-компилятор, предназначенный для сборки компиляторов поверх него. Он посвящен оптимизации и созданию кода, адаптированного к целевой архитектуре.
CLang - это интерфейс, который анализирует код C, С++ и Objective C и преобразует его в представление, подходящее для LLVM.
llvm gcc была исходной версией компилятора С++ на основе llvm на основе gcc 4.2, который теперь устарел, поскольку CLang может анализировать все, что он может анализировать, и многое другое.
Наконец, основное отличие между CLang и gcc заключается не в готовом коде, а в подходе. Хотя gcc является монолитным, CLang был построен как набор библиотек. Эта модульная конструкция позволяет использовать большие возможности повторного использования для IDE или инструментов завершения, например.
В настоящий момент код, созданный gcc 4.6, обычно немного быстрее, но CLAN закрывает пробел.
llvm-gcc-4.2 использует интерфейс GCC для анализа вашего кода, затем генерирует скомпилированный вывод с использованием LLVM.
"llvm compiler 2.0" использует интерфейс clang для анализа вашего кода и генерирует скомпилированный вывод с использованием LLVM. "clang" на самом деле является просто именем этого front-end, но часто используется как имя для компилятора в целом.