Чому LLVM має інфрачервоний подібний ІЧ, а не деревоподібний ІК? Або: чому проекти націлені на LLVM IR замість AST кланг?


14

Чому саме проміжне представлення LLVM (LLVM IR) схоже, ніж деревоподібне?

Крім того, чому мовні реалізації орієнтуються на LLVM IR, а не на AST кланг?

Я не намагаюся задавати два різні питання одразу, якщо це здається саме таким. Мені просто здається, що і клієнтські, і бібліотечні програмісти дійшли єдиної думки, що API LLVM, не більше і нічого менше, очевидно, хороший дизайн програмного забезпечення, і моє питання "чому?".

Причина, яку я запитую, полягає в тому, що, здається, LLVM міг би забезпечити більше функціональних можливостей для фронтендів, якщо це ІК було схожим на AST, тому що тоді інструменти на основі AST могли використовуватися для будь-якого фронтенда. Крім того, мови, націлені на ІР LLVM, могли б отримати більшу функціональність, якби вони націлили AST кланг.

Кланг має класи та функції для створення та роботи з ASTs, і це єдиний передній проект, який сильно пов'язаний з проектом LLVM, тому чому AST-функціональність зовнішня для LLVM?

Зверху голови я знаю, що Rust (rustc), D (ldc) та Haskell (GHC) можуть використовувати LLVM як бекенд, але вони не використовують Clang AST (наскільки я знаю, я міг би помилятися). Я не знаю всіх внутрішніх деталей цих компіляторів, але, принаймні, Руст і D, звичайно, здаються, що їх можна було скласти до кластера AST. Можливо, Haskell теж міг, але я в цьому набагато менш впевнений.

Це через історичні причини (LLVM спочатку був "віртуальною машиною низького рівня", і хлопок з'явився згодом)? Це тому, що інші фронтенди хочуть мати якомога більше контролю над тим, чим вони харчуються для LLVM? Чи є фундаментальні причини того, що AST Кланг є невідповідним для мов, які не схожі на С?

Я не маю на увазі, що це питання є вправою розумного розуміння. Я просто хочу, щоб він був корисним для тих із нас, хто цікавиться, але ще не вільно розробив дизайн компілятора. Оскільки проекти LLVM та clang розробляються публічно, я сподіваюся, що хтось, хто знайомий з розвитком цих проектів, може відповісти або що відповідь є очевидною для деяких складових дурнів, на які вони почувають себе досить впевнено.


Щоб попередньо викласти кілька очевидних, але незадовільних відповідей:

Так, має вузол типу IR дає більше контролю , хто вироби ІК (можливо X Ланг краще кодової бази і AST формат , ніж брязкіт) , але якщо це єдина відповідь, то питання стає «чому LLVM тільки є assembly- як ІЧ замість ІР високого рівня, як ІЧ, і ІЧ низького рівня? ".

Так, не так важко розібрати мову програмування на AST (принаймні, порівняно з іншими кроками компіляції). Навіть так, навіщо використовувати окремі AST? Якщо нічого іншого, використання того ж AST дозволяє використовувати інструменти, що працюють на AST (навіть просто прості речі, такі як принтери AST).

Так, я сильно згоден , що бути більш модульним це хороша річ, але якщо це єдина причина, то чому інші реалізації мови , як правило, цільової LLVM IR замість AST дзвоном в?

Ці попередження можуть бути помилковими або пропускати деталі, тому не соромтесь давати ці відповіді, якщо у вас є більше деталей або мої припущення помиляються.


Для тих, хто хоче відповісти на більш остаточно відповідне запитання: які переваги та недоліки складеного ІЧ-інтерфейсу проти ІК-дерева, подібного до дерева?


1
Я не експерт з LLVM, але думаю, що з вашого боку є невелике непорозуміння. LLVM не має такого, як IR. Насправді його ІЧ більше нагадує графік, ніж дерево. Я припускаю, що під "asm-like" ви посилаєтесь на читаний для людини ІК (* .ll файли), якщо так, то це робиться просто для зручності. Але, будемо чекати справжнього експерта, який зможе дати більш вичерпну відповідь :)
AlexDenisov

1
Одним з важливих аспектів може бути історія: LLVM спочатку був розроблений для того, щоб від'єднати компіляторні пакети від фронтендів компілятора. Ідея полягала в тому, що виробники компіляторів змагатимуться за мовні оптимізації, а постачальники процесорів змагатимуться за оптимізацію низького рівня. Наприклад, Microsoft і Apple змагатимуться між собою, компілятор C якого виробляє "найкращий" бітовий код з C, а Intel та AMD змагатимуться один з одним, чий сервер LLVM створює "найкращий" машинний код з біт-коду. Постачальники додатків доставлять свої додатки у біткоді, а остаточна компіляція буде здійснена у користувача…
Jörg W Mittag

1
… Машина. LLVM стартував у той час, коли зовсім не було зрозуміло, що всі будуть використовувати Intel. Apple все ще була на PowerPC, Intel все ще штовхала Itanium тощо. AFAIK, Apple все ще використовує LLVM таким чином у деяких своїх 3D-рамках, де код надсилається як біткод, а потім компілюється для nVidia або ATI залежно від того, яка карта встановлена.
Йорг W Міттаг

1
Пробачте, але що таке ІЧ?
Адам Коплі

Відповіді:


13

Тут є ряд взаємопов’язаних питань, я спробую їх відокремити якнайкраще.

Чому інші мови будуються на ІР LLVM, а не на клацанні AST?

Це просто тому, що кланг - це передній кінець C / C ++, а AST, який він виробляє, щільно пов'язаний з C / C ++. Інша мова могла б використовувати її, але вона потребує майже однакової семантики деякому підмножину C / C ++, що дуже обмежує. Як ви зазначаєте, розбір на AST є досить простим, тому обмеження вашого семантичного вибору навряд чи вартує невеликих заощаджень.

Однак якщо ви пишете інструментарій для C / C ++, наприклад, статичних аналізаторів, то повторне використання AST має багато сенсу, оскільки працювати з AST набагато простіше, ніж із сировинним текстом, якщо ви працюєте з C / C ++ .

Чому LLVM IR така форма?

LLVM IR була обрана як відповідна форма для написання оптимізацій компілятора. Таким чином, його основна особливість полягає в тому, що він знаходиться у формі SSA . Це досить низький рівень інфрачервоного зв'язку, тому він застосовний до широкого кола мов, наприклад, він не вводить пам'ять, оскільки це дуже різниться між мовами.

Зараз трапляється так, що оптимізація компілятора є досить спеціалізованим завданням і часто є ортогональним для мовної функції дизайну. Однак швидкість роботи компільованої мови є досить загальною вимогою. Крім того, перетворення з LLVM IR в ASM є досить механічним і загалом не цікавим для дизайнерів мови.

Тому зниження мови до ІР LLVM дає мовному дизайнеру багато "безкоштовних речей", що дуже корисно на практиці, залишаючи їм сконцентруватися на самій мові.

Буде корисний інший ІР (гаразд, не запитують, але це мається на увазі)?

Абсолютно! AST досить хороші для певних перетворень у структурі програми, але їх дуже важко використовувати, якщо ви хочете трансформувати потік програми. Форма SSA, як правило, краще. Однак LLVM IR дуже низький рівень, тому багато структури на високому рівні втрачається (спеціально, тому це більш загальноприйнято). Тут може бути корисним ІР між AST та низьким рівнем ІЧ. І Іржа, і Свіфт застосовують такий підхід і мають високий рівень ІЧ між ними.


Haskell має ряд ІР, перш ніж потрапити до LLVM.
DylanSp

1
@ ДіланСп Дійсно. Це стає фактично найкращою практикою для складних мов. Наприклад, Руст цього не робив спочатку і відреставрував включити ІР високого рівня. Я також вважаю, що було багато розмов про те, щоб зробити це для клангу, але я не впевнений, куди це пішло.
Олексій
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.