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