Чому саме проміжне представлення 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 дзвоном в?
Ці попередження можуть бути помилковими або пропускати деталі, тому не соромтесь давати ці відповіді, якщо у вас є більше деталей або мої припущення помиляються.
Для тих, хто хоче відповісти на більш остаточно відповідне запитання: які переваги та недоліки складеного ІЧ-інтерфейсу проти ІК-дерева, подібного до дерева?