Ich studiere Bootstrapping von Red Dragon Book Compilern und fand das T-Diagramm für Cross Compiler ziemlich verwirrend. Ich kann nicht verstehen, was unter "Compiler1 bis Compiler2 ausführen" zu verstehen ist. Kann jemand eine bessere Erklärung, Analogie oder ein Beispiel für einen realen Compiler liefern?
Zuerst eine Notation. Mit meine ich einen Compiler für Sprache , der in Sprache geschrieben ist und die Ausgabesprache / Maschinencode . Dies ist ein Grabstein oder T-Diagramme .
Kompilieren eines Compilers
Angenommen, wir haben einen Cross-Compiler für eine neue Sprache L in der Implementierungssprache S, die Code für Maschine N generiert.
Angenommen, wir haben auch einen vorhandenen S-Compiler, der auf Maschine M ausgeführt wird und Code für Maschine M implementiert:
Führen Sie LSN über SMM aus, um LMN zu erstellen
Compilerkonstruktion
quelle
Antworten:
Die T-Diagramme (die Sie in der Originalversion Ihrer Frage weggelassen haben) sind entscheidend für das Verständnis dieser Art von Frage. Schauen wir uns das letzte T-Diagramm an.
Das erste T beschreibt einen in S geschriebenen Compiler von L bis N.
Das zweite T beschreibt einen Compiler von S nach M, der in M geschrieben ist (oder auf M läuft). Dies wird Ihr Compiler-Compiler sein .
Durch Anwenden des zweiten T auf das erste T wird das erste T so kompiliert, dass es auf Maschine M ausgeführt wird. Das Ergebnis ist somit ein Compiler von L bis N, der auf Maschine M ausgeführt wird.
Die Tatsache, dass das zweite T auch auf Maschine M ausgeführt wird, erfasst, dass Sie den Compiler-Compiler auf der Maschine ausführen, auf der Sie den Compiler ausführen, anstatt einen Cross-Compiler verwenden zu müssen (was der Fall wäre, wenn das untere M anders wäre ).
quelle
Dies bedeutet, dass wir LSN mit SMM kompilieren, dh den Quellcode von LSN über SMM ausführen.
Wenn SMM einen Quellcode kompiliert, wird eine ausführbare Datei für Maschine M erstellt. Wenn wir also LSN mit SMM kompilieren, erhalten wir LMN - eine ausführbare Datei, die L Quelldateien auf Maschine M kompiliert, um ausführbare Dateien für Maschine N zu erstellen.
Vielleicht wäre es einfacher, dies mit einer Analogie zu verstehen. Angenommen, wir haben einen C-Compiler,
cc
der in Fortran geschrieben ist und ARM-Code generiert. Angenommen, wir haben auch einen Fortran-Compilerfc
auf unserem x64-Computer. Wenn wircc
Quellcode mit kompilieren, erhaltenfc
wir ein Programm, das auf x64 läuft, C-Programme kompiliert, aber ausführbare Dateien für ARM erstellt.quelle
Um es einfach zu machen ...
Hinweis: Denken Sie daran, dass der Compiler nur in einer einfachen Sprache ausgeführt werden kann.
Im ersten Diagramm ist der Compiler in HLL (High Level Langg) geschrieben, damit auf einem Computer die Implementierungssprache des Compilers in LLL ausgeführt werden kann.
Im zweiten Diagramm wird die Implementierungssprache des Compilers auf einem selbst residenten Compiler ausgeführt, sodass der Zielcode auf einem eigenen Computer ausgeführt werden kann.
Wenn der Compiler beide kombiniert, wird er auf einem Computer mit langg - M ausgeführt
Eingabesprache - L.
Ausgabe Langg - N.
quelle