LLVM против Clang на OS X - PullRequest
       37

LLVM против Clang на OS X

124 голосов
/ 19 апреля 2011

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

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

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

Ответы [ 3 ]

185 голосов
/ 19 апреля 2011

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 имеют преимущество в том, что было протестировано намного больше кода и работает над GCC-вариантом C;есть некоторые специфичные для компилятора расширения, которые есть только в GCC, и в некоторых местах стандарт позволяет изменять реализацию, но код зависит от одной конкретной реализации.Скорее всего, если вы получите большой объем унаследованного кода C, он будет работать в GCC, чем в Clang, хотя со временем это улучшается.

49 голосов
/ 19 апреля 2011

Здесь есть 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 голосов
/ 19 апреля 2011

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

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

...