У меня вопрос относительно 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 / C ++ / Objective-C, который использует собственный интерфейс и LLVM в качестве бэкенда. Преимущества, которые он предоставляет, - это более качественные сообщения об ошибках, более быстрое время компиляции и более простой способ для других инструментов подключиться к процессу компиляции (например, отладчик LLDB и статический анализатор Clang ). Он также имеет разумную модульную структуру и может использоваться в качестве библиотеки для другого программного обеспечения, которое должно анализировать код C, C ++ или Objective-C.
Каждый из этих подходов (простой GCC, GCC + LLVM и Clang) имеет свои преимущества и недостатки. Последние несколько наборов тестов, которые я видел, показали, что GCC создает немного более быстрый код в большинстве тестовых случаев (хотя LLVM имеет небольшое преимущество в некоторых), в то время как LLVM и Clang дают значительно лучшее время компиляции. Комбинации GCC и GCC / LLVM имеют то преимущество, что гораздо больше кода было протестировано и работает на разновидности C GCC; есть некоторые специфичные для компилятора расширения, которые есть только у GCC, и некоторые места, где стандарт позволяет варьировать реализацию, но код зависит от одной конкретной реализации. Если вы получите большой объем устаревшего кода C, вероятность того, что он будет работать в GCC, гораздо выше, чем в Clang, хотя со временем ситуация улучшается.
Здесь есть 2 разные вещи.
LLVM - это серверный компилятор, предназначенный для создания компиляторов на его основе. Он занимается оптимизацией и производством кода, адаптированного к целевой архитектуре.
CLang - это интерфейс, который анализирует код C, C ++ и Objective C и переводит его в представление, подходящее для LLVM.
llvm gcc был начальной версией компилятора C ++ на основе llvm, основанного на gcc 4.2, который теперь устарел, поскольку CLang может анализировать все, что может анализировать, и многое другое.
Наконец, основное различие между CLang и gcc заключается не в созданном коде, а в подходе. Хотя gcc является монолитным, CLang был построен как набор библиотек. Эта модульная конструкция обеспечивает большие возможности повторного использования, например, IDE или инструментов завершения.
На данный момент код, созданный gcc 4.6, обычно немного быстрее, но CLang закрывает пробел.
llvm-gcc-4.2 использует интерфейс GCC для анализа вашего кода, а затем генерирует скомпилированный вывод с помощью LLVM.
"Llvm compiler 2.0" использует интерфейс clang для анализа вашего кода и генерирует скомпилированный вывод с помощью LLVM. "clang" - это на самом деле просто название этого интерфейса, но оно часто используется как имя компилятора в целом.