Wenn ein Compiler in C++ geschrieben wurde, muss doch der Compiler ebenfalls compiliert werden?

...komplette Frage anzeigen

7 Antworten

Du schreibst einen neuen C++-Compiler in C++. Dann nimmst Du einen anderen, bereits bestehenden C++-Compiler und übersetzt damit Deinen neuen Compiler. Wenn Du Lust hast, kannst Du Deinen neuen Compiler danach noch einmal "sich selbst" übersetzen lassen.

Wenn Du einen C++-Compiler für eine neue Architektur herausbringen möchtest, schreibst Du ihn in C++ und übersetzt ihn zunächst für eine Architektur, für die es bereits einen C++-Compiler gibt. Dann nimmst Du das Resultat und übersetzt mit dem neuen Compiler auf der neuen Architektur.

Den ersten Compiler für C++ hat man sehr wahrscheinlich in einer anderen Hochsprache geschrieben. Es gab auch vor C++ (und auch vor C) bereits höhere Programmiersprachen.

Irgendein Hochsprachencompiler musste mal "der erste" sein. Den hat man dann wohl tatsächlich in Assemblersprache geschrieben und den ersten Assembler tatsächlich in Maschinensprache.

Auch wenn Du den Compiler selbst in einer Hochsprache schreibst, musst Du Dich mit der Maschinensprache der Zielarchitektur auskennen, um den Compiler entwickeln zu können, schließlich wird das Backend ja Maschinenbefehle für die jeweilige Zielarchitektur "emittieren".

Fishmeaker 04.07.2017, 09:47

Gut geschrieben und schön erklärt! Das hier ist genau die "richtige" Antwort.

Ich bin nur öfter zu faul um solche Romane zu schreiben. "hust"

2

Zur Illustration des Gesagten hier zwei Einträge aus der Entwicklungsgeschichte des Free-Pascal-Compilers

2 May 2004
The first 64-bit port has arrived. Tonight, FPC compiled
itself for the first time on a 64-bit system. The system was of the
AMD64 type.
[...]

24 September 2002
During the last days, the 1.0.x compiler compiled itself for the
first time. The job was done on a 50 MHz Mac IIci (68030), under
NetBSD, and the compilation took over 3 hours.
It seems that the multiplatform FPC compiler is finally starting to
become reality.


https://www.freepascal.org/news.var

Schau auch mal hier (die englische Version ist ausführlicher):

https://de.wikipedia.org/wiki/Bootstrapping_(Programmierung)

Maschinencode kann heutzutage kaum noch jemand, aber Assembler ist im Prinzip das selbe, nur das die einzelnen Maschinencode-befehle (x86)

 (C7 45 FC 02 in hexadezimal oder 11000111010001011111110000000010 in binär wäre in C++ z.B. int a =2

in einigermaßen lesbare Abkürzungen übersetzt wurden 

(mov DWORD PTR [rbp-4], 2; für obiges Beispiel)

Aber in Assembler arbeitet man immer noch direkt auf dem Prozessor mit dem ihm eigenen Befehlssatz, das heißt der 'Assembler' (Assembler = Compiler für Maschinennahe Sprachen) muss nur die Worte in Maschinencode übersetzen, welche im Prozessor fest eingespeichert sind.

Das bedeutet jetzt, man nimmt eine einfache Aufgabe von C++ und schreibt in Assembler den Compiler. Nun hat man einen Compiler und kann in der nächsthöheren ebene komplexere Aufgaben angehen usw. Und man kann mit den erlernten Befehlen dann in C++ arbeiten, bis man schließlich und endlich eine grafische Oberfläche in der selben Sprache erstellen kann. Das wäre aber so ziemlich der aufwendigste Weg.

Eine andere Möglichkeit wäre es, einen C++ Compiler in einer anderen Sprache zu schreiben.

Das ist auch der Grund, warum es für viele Sprache unterschiedliche und auch unterschiedlich gute Compiler gibt bzw. manche für bestimmte Aufgaben besser geeignet sind

Das ganze nennt sich Bootstrapping

Ich hoffe mein Informatikkurs an der FH ist noch nicht so lange her, das ich etwas Komplet falsches erzählt habe

Gruß

Ja. Du nimmst halt immer die alte Compilerversion um die nächste Compilerversion zu übersetzen.

LeonardM 04.07.2017, 09:21

ich denke die frage ist woraus diese ursprung compilerversion entstanden ist bzw wie :D

1
Tuxgamer2 04.07.2017, 09:39
@LeonardM

Die "erste" Version wird wohl ein Assembler-Compiler gewesen sein. Der tatsächlich logisch in Machinensprache geschrieben worden ist. Aber eben ziemlich primitiv und einfach.

Danach hat man sich eben historisch immer weiter hochgearbeitet ;). Dann eben irgendwann C - und würde vermuten, dass es auch Sinn macht einen ursprünglichen C++-Compiler in C zu schreiben. 

2

Grundsätzlich richtig. Wenn du dich eine Ebene "tiefer" einlesen willst erkundige dich einmal nach Assembler(sprache).

Eine typische Ei-Henne-Ei Frage.

Die Antwort ist die gleiche:

Evolution. Angefangen hat es mit einem in Assembler geschriebenen Parser, einem einfachen Texteditor und einem Linker.

Damit wurde dann die nächste Version entwickelt...

...usw usf...

TeeTier 04.07.2017, 16:17

Eine typische Ei-Henne-Ei Frage.

Genau genommen ist es eine Henne-Ei-Henne Frage. ;)

1

Klar. Irgendwer muss den Prozessor ja auch mal gebaut haben.

Was möchtest Du wissen?