Kann jemand ein kurzes Codebeispiel für Compiler-Bootstrapping bereitstellen? [geschlossen]

geschlossen . Diese Frage muss stärker fokussiert sein . Derzeit werden keine Antworten akzeptiert.

Kommentare

Antwort

Nehmen wir an, Sie schreiben eine neue Programmiersprache mit dem Namen „XYZ“. Der erste Schritt besteht darin, einen Compiler für diese Sprache zu schreiben. Da diese neue Sprache noch nicht existiert, schreiben Sie den Compiler in … sagen wir Java. Wir nennen es jxyz. Dieser Vorgang ist eine typische Klasse im College .

Jetzt haben Sie ein Java-Programm (jxyz), das eine XYZ-Quelldatei nimmt und erstellt eine ausführbare Datei. Es ist dann möglich, einen Compiler für XYZ in XYZ zu schreiben, der von jxyz erfüllt wird.

Zu diesem Zeitpunkt haben Sie einen Complier für XYZ, der von jxyz erfüllt wurde. Nennen Sie dieses Programm „xyzFromJ“.

„xyzFromJ“ sollte in der Lage sein, sich selbst als Eingabe zu verwenden und sich selbst zu kompilieren und alles, was von jxyz erstellt wurde, vollständig aus den Abhängigkeiten und der Definition der Sprache zu entfernen. Ab diesem Zeitpunkt können alle Änderungen an der XYZ-Sprache auf dem in XYZ geschriebenen und mit sich selbst kompilierten Compiler vorgenommen werden.

Antwort

Schritt 1. Schreiben Sie Ihren Compiler in einer anderen Sprache.
Schritt 2. Kompilieren Sie den Code aus Schritt 1.
Schritt 3. Schreiben Sie Ihren Compiler in derselben Sprache.
Schritt 4. Kompilieren Sie den Code aus Schritt 3.

Wiederholen Sie die Schritte 3-4 für weitere Aktualisierungen Ihres Compilers.

Beachten Sie, dass die Schritte 1 und 3 gleichzeitig oder in einer anderen Reihenfolge ausgeführt werden können.

Ich gebe zu, dass dies eine zu starke Vereinfachung ist.

Kommentare

  • @RobertHarvey: In Schritt 4 habe ich nicht angegeben, welcher Compiler verwendet werden soll absichtlich, damit " Wiederholen Sie die Schritte 3-4 " sinnvoller.
  • Gewonnen ' t Schritt 4 funktioniert nur, wenn Sie einen Compiler verwenden, der die neue Sprache erkennt?
  • @RobertHarvey: Ja, aber ich habe absichtlich nicht ' t specif y es so, dass " Schritte wiederholen 3-4 " bedeutete nicht, dass " die Compiler aus Schritt 1 ", da dies den Zweck der Übung zunichte machen würde. Ich nahm an, dass es selbstverständlich ist, dass Sie den Compiler aus Schritt 1 bei der ersten Iteration verwenden sollten (es ist ' der einzige Compiler, den Sie haben) und den Compiler, der aus der vorherigen Iteration von Schritt generiert wurde 3 bei jeder weiteren Iteration.

Antwort

Im Gegensatz zu einigen anderen Antworten, die vorschlagen, den Compiler in einer anderen Sprache zu schreiben (Vermutlich einer, der auf demselben Computer ausgeführt wird, auf den Sie abzielen), ist es auch möglich (eigentlich vorzuziehen), den Compiler von Anfang an in der Zielsprache zu schreiben.

Angenommen, Sie möchten einen Compiler für C schreiben für einen ARM-Prozessor. Sie haben bereits einen C-Compiler, der unter Windows ausgeführt wird (Intel-Architektur). Sie schreiben Ihren neuen Compiler in C, sowohl im Front-End (lexikalische Analyse und Analyse) als auch im Back-End (Codegenerierung). Das Backend ist natürlich so geschrieben, dass es Code für den ARM generiert, nicht für Intel.

Anschließend kompilieren Sie die Quelle für den neuen Compiler mit dem vorhandenen Compiler. Sobald Sie zufrieden sind, generiert der Compiler gültigen Code für den ARM, nehmen Sie den kompilierten ARM-Code und führen ihn auf der Ziel-ARM-Architektur aus. Sie haben jetzt die Quelle für den neuen Compiler, die geändert und in die ausführbare Datei des Compilers eingespeist werden kann, um eine neue Version zu generieren.

Dieser Prozess wird als Cross-Compiling bezeichnet. Der Vorteil besteht darin, dass Sie nur haben um den Compiler einmal zu schreiben.

Antwort

aus einer anderen Antwort:

Step 1. Write your compiler in a different language. Step 2. Compile the code from Step 1. Step 3. Write your compiler in the same language. Step 4. Compile the code from step 3. 

Die Schritte 1 und 2 werden nur für den „allerersten“ Compiler für eine neue Sprache benötigt. Es gibt viele Variationen der Schritte 3 und 4, sodass Sie beispielsweise den Codegenerator für eine neue Architektur schreiben können. Cross Compile, dann führen Sie den gleichen Compiler auf einem neuen Computer aus.Sie können Ihren Compiler auch erweitern, um neue Syntax und Konstrukte zu verarbeiten, ohne eine der Erweiterungen zu verwenden, und dann den Compiler neu schreiben, um die Erweiterungen zu verwenden und sich selbst zu kompilieren.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.