Cross Compiler T-Diagramm

9

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 .L.S.N.= Geben Sie hier die Bildbeschreibung einL.SN

Kompilieren eines Compilers

  1. Angenommen, wir haben einen Cross-Compiler für eine neue Sprache L in der Implementierungssprache S, die Code für Maschine N generiert.

    LSN=
    T-Diagramm für LSN

  2. Angenommen, wir haben auch einen vorhandenen S-Compiler, der auf Maschine M ausgeführt wird und Code für Maschine M implementiert:

    SMM=
    T-Diagramm für SMM

  3. Führen Sie LSN über SMM aus, um LMN zu erstellen

Compilerkonstruktion

L.M.N.=L.S.N.+S.M.M.
T-Diagramm für LMN = LSN + SMM

Raphael
quelle
Ich habe einige T-Diagramme hinzugefügt, die es eigentlich einfacher machen sollen, zu verstehen, was los ist. Hoffentlich kann jemand eine bessere Möglichkeit finden, sie zu rendern.
Dave Clarke

Antworten:

11

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.

Geben Sie hier die Bildbeschreibung ein

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 ).

Dave Clarke
quelle
5

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, ccder in Fortran geschrieben ist und ARM-Code generiert. Angenommen, wir haben auch einen Fortran-Compiler fcauf unserem x64-Computer. Wenn wir ccQuellcode mit kompilieren, erhalten fcwir ein Programm, das auf x64 läuft, C-Programme kompiliert, aber ausführbare Dateien für ARM erstellt.

Daniil
quelle
0

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.

Rock Me
quelle