it-swarm-eu.dev

Wie könnte der erste C ++ - Compiler in C ++ geschrieben werden?

Stroustrup behauptet, dass Cfront, der erste C++ - Compiler, in C++ geschrieben wurde ( Stroustrup FAQ ).

Wie ist es jedoch überhaupt möglich, dass der erste C++ - Compiler in C++ geschrieben wird?

Der Code, aus dem der Compiler besteht, muss ebenfalls kompiliert werden, und daher konnte der erste C++ - Compiler nicht in C++ geschrieben werden, oder?

48
Pacerier

Der Schlüssel ist genau hier:

Der erste C++ - Compiler (Cfront) wurde in C++ geschrieben. Um das zu erstellen, habe ich zuerst C verwendet, um einen "C mit Klassen" -zu-C-Präprozessor zu schreiben. "C mit Klassen" war ein C-Dialekt, der der unmittelbare Vorfahr von C++ wurde. Dieser Präprozessor übersetzte "C mit Klassen" -Konstrukte (wie Klassen und Konstruktoren) in C. Es war ein traditioneller Präprozessor, der nicht die gesamte Sprache verstand, den größten Teil der Typprüfung für den C-Compiler überließ und einzelne übersetzte Konstrukte ohne vollständiges Wissen. Ich habe dann die erste Version von Cfront in "C with Classes" geschrieben.

Die erste Version von Cfront wurde also nicht in C++ geschrieben, sondern in der Zwischensprache. Die Möglichkeit, C-Compiler und Präprozessoren direkt in C zu erstellen, führte zu vielen Neuerungen (und massive Sicherheitslücken ) in C. Sie schreiben also Ihren neuen Präprozessor, der Ihren Code "C mit Klassen" in Straight umwandelt C (weil gerade C alles kann) und dann verwenden Sie "C mit Klassen", um einen C++ - Compiler zu schreiben (nicht, dass Sie es in C nicht tun könnten, es würde nur eine Weile dauern) und dann verwenden Sie diesen C++ - Compiler zum Schreiben Ein effizienterer/vollständigerer Compiler in C++. Ich habs?

58

Es wurde gebootet. Sobald eine C++ - Funktion zu cfront hinzugefügt wurde, konnte cfront diese Funktion ab diesem Zeitpunkt auch verwenden (jedoch nicht, um genau diese Funktion zu implementieren). Dies funktionierte, weil cfront C++ - Code in C-Code konvertieren konnte. Wenn also eine neue Plattform herauskommt, können Sie cfront auf einer anderen Plattform verwenden, um cfront von C++ nach C zu konvertieren, und dann den C-Compiler der neuen Plattform verwenden, um die Kompilierung von C zu Objektcode abzuschließen.

17
David Schwartz

Ich denke, B.S. beantwortet diese Frage:

Der erste C++ - Compiler (Cfront) wurde in C++ geschrieben. Um das zu erstellen, habe ich zuerst C verwendet, um einen "C mit Klassen" -zu-C-Präprozessor zu schreiben. "C mit Klassen" war ein C-Dialekt, der der unmittelbare Vorfahr von C++ wurde. Dieser Präprozessor übersetzte "C mit Klassen" -Konstrukte (wie Klassen und Konstruktoren) in C. Es war ein traditioneller Präprozessor, der nicht die gesamte Sprache verstand, den größten Teil der Typprüfung für den C-Compiler überließ und einzelne übersetzte Konstrukte ohne vollständiges Wissen.

Ich habe dann die erste Version von Cfront in "C with Classes" geschrieben. Cfront war ein traditioneller Compiler, der die vollständige Syntax und semantische Überprüfung der C++ - Quelle durchführte. Zu diesem Zweck verfügte es über einen vollständigen Parser, erstellte Symboltabellen und erstellte eine vollständige interne Baumdarstellung für jede Klasse, Funktion usw. Vor der Ausgabe von C wurde auch eine Optimierung der internen Baumstruktur von C++ - Konstrukten durchgeführt generiertes C, stützte sich bei keiner Typprüfung auf C. Es wurde einfach C als Assembler verwendet. Der resultierende Code war kompromisslos schnell.

Zuerst erstellte er etwas, das er "C mit Klassen" nannte und das von einem einfachen Präprozessor in C implementiert wurde. Es war im Grunde C++, aber der Präprozessor überprüfte nur wenig oder gar nicht. Anschließend schrieb er damit Cfront, die leistungsstärkere Version des Übersetzers von C++ in C, einschließlich Typprüfung, Symboltabellen usw.

9
Mike Dunlavey

Ich werde diese Antwort hinzufügen, da keine Antwort diesen Aspekt abdeckte.

Sie benötigen technisch keine Software, um Code zu kompilieren. Solange Sie über die erforderlichen Compilerspezifikationen verfügen, können Sie die eigentliche Kompilierung manuell durchführen. So wurde der erste C++ - Compiler nicht kompiliert. Ich sage nur, dass es möglich ist.

Vergleiche mit Assemblersprache. Als sie in den frühen Tagen verwendet wurden, gab es keine Assembler-Software, um den Assembly-Code in Maschinencode zu konvertieren. Es wurde von Hand gemacht, aber die Assemblersprache gab den Programmierern einen besseren Überblick.

2
klutt