LLVM проти клаксону на OS X


133

У мене є питання щодо llvm, clang та gcc в OS X.

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

Окрім швидшого збирання, яка перевага llvm над gcc?


9
llvm - це лише бекенд, не може бути окремий компілятор llvm ... для нього є лише різні фронтенди, як gcc та clang.
смерлін

4
@smerlin: "компілятор llvm" - торгове найменування 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 та статичний аналізатор Кланг ). Він також досить модульний, тому може бути використаний як бібліотека для іншого програмного забезпечення, яке потребує аналізу C, C ++ або коду Objective-C.

Кожен із цих підходів (звичайний GCC, GCC + LLVM та Clang) має свої переваги та недоліки. Останні кілька наборів орієнтирів, які я бачив, показали, що GCC виробляє трохи швидший код у більшості тестових випадків (хоча LLVM мав незначне перевагу в декількох), тоді як LLVM та Clang дали значно кращі часи компіляції. Комбінації GCC та GCC / LLVM мають перевагу в тому, що було випробувано набагато більше коду та працює на GCC аромат C; є деякі розширення для компілятора, які має лише 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

Тут є дві різні речі.

LLVM - це резервний компілятор, призначений для створення компіляторів над ним. Він стосується оптимізації та виготовлення коду, адаптованого до цільової архітектури.

CLang - це передній кінець, який розбирає C, C ++ та об'єктивний код 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 2.0" використовує фронтальний кланг для аналізу вашого коду та генерує компільований вихід за допомогою LLVM. "clang" - це фактично лише назва цього фронтального пристрою, але його часто використовують випадково як назву для компілятора в цілому.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.