LLVM против clang в OS X


133

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

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

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


9
llvm - это только бэкэнд, не может быть автономного компилятора llvm ... для него есть только разные интерфейсы, такие как gcc и clang.
smerlin

4
@smerlin: "llvm compiler" - это торговое название Apple для clang + llvm: developer.apple.com/technologies/tools/…
Стивен Кэнон

Другие подробности здесь: stackoverflow.com/a/26724886/1938163
Марко А.

Ответы:


201

Изначально 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, хотя со временем ситуация улучшается.


13
Чтобы добавить к этому замечательному ответу: clang - это также набор библиотек (называемых libclang), которые вы можете использовать для таких вещей, как анализ кода, автозаполнение, подсветка синтаксиса и т. Д. Это очень удобно для IDE.

5
При сборке для MacOS X или iOS учтите, что Clang - это программное обеспечение, которое Apple использует для создания всего своего программного обеспечения MacOS X и iOS, включая операционную систему, и что Clang - это то, что вы получаете автоматически, без усилий, и то, что каждый, кому когда-либо просить о помощи. Apple никогда не поддерживала gcc после gcc 4.2 и больше не выпускает никаких версий gcc.
gnasher729

1
@ gnasher729 Да, этот ответ был написан 3 года назад, когда Apple все еще поставляла llvm-gcc и Clang с компилятором по умолчанию llvm-gcc. С тех пор времена изменились.
Брайан Кэмпбелл

54

Здесь есть 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 закрывает пробел.


5

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.