Warum ist die LLVM-Intermediate-Representation (LLVM-IR) nicht wie ein Baum, sondern wie eine Assembly?
Warum zielen Sprachimplementierungen alternativ eher auf LLVM-IR als auf Clangs AST?
Ich versuche nicht, zwei verschiedene Fragen gleichzeitig zu stellen, wenn es so scheint. Mir scheint, dass sowohl Client- als auch Bibliotheksprogrammierer zu dem Konsens gekommen sind, dass die LLVM-API nicht mehr und nicht weniger ein gutes Softwaredesign ist und meine Frage lautet "Warum?".
Der Grund, den ich frage, ist, dass LLVM anscheinend mehr Funktionen für Frontends bereitstellen könnte, wenn es sich um ein AST-ähnliches IR handelt, da dann die AST-basierten Tools von Clang für jedes Frontend verwendet werden könnten. Alternativ könnten Sprachen, die auf LLVM-IR abzielen, mehr Funktionalität erhalten, wenn sie auf Clangs AST abzielen.
Clang hat Klassen und Funktionen zum Erstellen und Arbeiten mit ASTs und es ist die einzige Frontend-Projekt, das eng mit dem LLVM-Projekt verknüpft ist. Warum ist die AST-Funktionalität von Clang also außerhalb von LLVM?
Ich weiß, dass Rust (rustc), D (ldc) und Haskell (GHC) LLVM als Backend verwenden können, aber sie verwenden nicht den Clang AST (soweit ich weiß, dass ich es könnte) falsch liegen). Ich kenne nicht alle internen Details dieser Compiler, aber zumindest scheinen Rust und D so zu sein, als könnten sie zu Clangs AST kompiliert werden. Vielleicht könnte Haskell das auch, aber da bin ich mir viel weniger sicher.
Liegt dies an historischen Gründen (LLVM war ursprünglich eine "virtuelle Maschine auf niedriger Ebene" und klirrte später)? Liegt das daran, dass andere Frontends so viel Kontrolle wie möglich darüber haben möchten, was sie an LLVM weitergeben? Gibt es fundamentale Gründe, warum Clangs AST für "nicht C-ähnliche" Sprachen ungeeignet ist?
Ich beabsichtige nicht, dass diese Frage eine Übung zum Gedankenlesen ist. Ich möchte nur, dass es für diejenigen von uns hilfreich ist, die neugierig sind, aber das Compiler-Design noch nicht fließend beherrschen. Da die LLVM- und Clang-Projekte öffentlich entwickelt werden, hoffe ich, dass jemand, der mit der Entwicklung dieser Projekte vertraut ist, antworten kann oder dass die Antwort für einige Compiler-Nerds so offensichtlich ist, dass sie sich sicher genug fühlen, zu antworten.
Um einige offensichtliche, aber unbefriedigende Antworten vorwegzunehmen:
Ja, mit einem Montageartigen gibt IR mehr Kontrolle wer die IR - Handwerk (vielleicht X lang hat ein besseres Code - Basis und AST - Format als Klappern) , aber wenn das die einzige Antwort ist, dann wird die Frage „warum LLVM nur eine montage- hat wie IR anstelle einer baumähnlichen IR auf hoher Ebene und einer assemblierungsähnlichen IR auf niedriger Ebene? "
Ja, es ist nicht so schwer, eine Programmiersprache in einen AST zu zerlegen (zumindest im Vergleich zu den anderen Schritten des Kompilierens). Warum jedoch separate ASTs verwenden? Wenn Sie denselben AST verwenden, können Sie Tools verwenden, die auf ASTs ausgeführt werden (auch auf einfachen Dingen wie AST-Druckern).
Ja, ich stark darüber einig , dass mehr modular ist eine gute Sache ist, aber wenn das der einzige Grund ist, warum dann tut andere Sprache Implementierungen neigt LLVM IR statt AST von Klirren zielen?
Diese Vorannahmen können fehlerhaft sein oder Details übersehen. Geben Sie diese Antworten, wenn Sie weitere Details haben oder meine Annahmen falsch sind.
Für alle, die eine eindeutig beantwortbare Frage beantworten möchten: Welche Vor- und Nachteile hat eine assemblierungsähnliche IR gegenüber einer baumähnlichen IR?