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