In welcher Sprache ist der C # -Compiler geschrieben?

148

Ich habe mir den Quellcode unter http://referencesource.microsoft.com/ angesehen und es scheint, dass der gesamte Quellcode in C # ist.

Ich habe mir auch den Quellcode für die neue C # -Compilerplattform ( Roslyn ) angesehen, und er ist auch in C #. Wie ist das möglich? Ist der C # -Sprachen-Compiler in C # geschrieben? Oder fehlt mir etwas Offensichtliches? Wenn der C # -Compiler in C # geschrieben ist, wie funktioniert er dann?

CriketerOnSO
quelle
12
Viele Compiler sind in der Sprache geschrieben, die sie kompilieren - Google Bootstrapping , um mehr zu erfahren.
Paul Roub
19
Ich denke, der ursprüngliche Compiler wurde in C ++ geschrieben.
PoweredByOrange
44
Nun, ein Hammer kann mit einem anderen Hammer geschmiedet werden. Vorherige Version davon ...
Eugene Sh.
10
Der von Ihnen gepostete Link ist der Link zum Quellcode der Framework-Bibliothek und nicht zum Compiler.
Steve

Antworten:

228

Der ursprüngliche C # -Compiler wurde nicht in C # geschrieben, sondern in C und C ++. Der neue Roslyn-Compiler wurde in C # geschrieben, aber ursprünglich mit dem alten Compiler kompiliert. Nachdem der neue Compiler fertig war, konnte er seinen eigenen Quellcode kompilieren: Dies wird als Bootstrapping bezeichnet .

Thomas Levesque
quelle
2
Wenn also eine Änderung am "ursprünglichen Compiler" vorgenommen werden muss, muss diese mit dem alten Compiler (geschrieben in C, C ++) kompiliert werden ?
CriketerOnSO
10
Es wäre nicht nötig, den "ursprünglichen Compiler" zu ändern, die neueren Versionen würden geändert
Pseudonym
1
@CriketerOnSO, der neue Compiler ersetzt den alten, sodass der alte nicht geändert werden muss. Wenn MS dies jedoch tun wollte, kompilierten sie den alten Compiler wie zuvor mit einem C ++ - Compiler.
Thomas Levesque
3
@ThomasLevesque Self-Hosting ist das Endergebnis von Boot-Strapping.
Arx
2
@SriramSakthivel, der Code des Compilers kann die neuen Schlüsselwörter nicht verwenden, zumindest nicht, bis es einen Compiler gibt, der sie versteht. Sie verwenden immer eine ältere Version des Compilers, um die neue zu erstellen.
Thomas Levesque
32

Compiler sind Hilfsprogramme - sie wandeln Programmiersprachentext in Maschinencode um. Wenn die Programmiersprache Software beschreibt, die zufällig ein Compiler ist .....

Compiler können auch Maschinencode für andere Architekturen erstellen. Apple kompiliert beispielsweise iOS mithilfe von Racks mit Intel-basierten Servern. Der Compiler muss den von ihm generierten ARM-Code nicht ausführen, sondern nur auf die Festplatte schreiben.

Compiler 2.0 muss in einer Sprache geschrieben sein, die Compiler 1.0 verarbeiten kann, aber er kann sicherlich Compiler 2.0 mit neueren Funktionen wie Optimierung erstellen. Sie können den Quellcode dann mit Compiler 2.0 neu kompilieren und eine bessere Version von sich selbst erstellen. Auch hier weiß der Compiler nicht, dass er eine andere Version von sich selbst erstellt.

Wenn wir weit genug zurück in den Nebel der Zeit gehen, erreichen wir einen Punkt, an dem wir keinen Compiler haben - die allererste Iteration einer Hochsprache. Dann müssen wir die Stifte und Opcode-Bücher herausholen und den ersten in der Montage schreiben. Wie haben wir den ersten Assembler geschrieben? Direkte Eingabe des Maschinencodes, wahrscheinlich auf gelochtem Papierband, oder Umlegen der Schalter an der Vorderseite.

paul
quelle
9
Und das Papierband kippt nur die Schalter über Löcher im Papier. :-)
Zan Lynx
2
Papierband als Speichertechnologie wird niemals abheben. Es ist einfach zu komplex und fehleranfällig. Außerdem brennt es leicht, wenn der Leser einen Kurzschluss aufweist und Ihr Programm dadurch vollständig zerstört wird.
Ein Lebenslauf vom
16

Ein Compiler ist nur ein Programm wie jedes andere Programm. Es ist nichts Magisches oder Besonderes daran. Es braucht etwas Eingabe und erzeugt etwas Ausgabe. In diesem speziellen Fall ist die Eingabe zufällig C # und die Ausgabe ist zufällig CIL. Dies unterscheidet sich jedoch nicht von der Eingabe als eine Reihe von Steuererklärungen und der Ausgabe als Bericht.

Jörg W Mittag
quelle
10
Es ist anders - es ist viel einfacher, -).
Peter - Monica
3
@PeterSchneider: Leute mögen es, Compiler als mythische magische Kreaturen zu besetzen, aber am Ende sind sie nur Programme, die Eingabe in Ausgabe umwandeln. So ziemlich jedes Programm auf dem Planeten analysiert einige Eingaben, versucht, einen Sinn daraus zu machen, und wandelt sie in eine Ausgabe um. In gewissem Sinne ist jede Eingabe ein Programm, das in einer Sprache geschrieben ist, jedes Programm ist ein Compiler.
Jörg W Mittag
3
Ich konnte nicht mehr zustimmen. Ich wollte nur sagen, dass Steuergesetze ein schreckliches Durcheinander sind. Im Gegensatz dazu sind formale Sprachen in der Regel so gut definiert, dass sie für die Automatisierung geeignet sind. Das macht einen einfachen Compiler wohl einfacher zu schreiben als ein Programm, das sich mit Steuern befasst. Obwohl Eric Lippert betteln mag, C # -Compilern nicht zuzustimmen, vgl. blogs.msdn.com/b/ericlippert/archive/2010/02/04/… . Kam weit weg von One-Pass-C-Compilern.
Peter - Monica
1
@ PeterSchneider: Ah, sorry, ich habe Ihren Kommentar um 180 ° falsch interpretiert :-D
Jörg W Mittag
Diese Antwort gefällt mir am besten, da sie den Gedanken des OP am direktesten anspricht. Es löscht den Nebel, der den "allmächtigen" Compiler umgibt.
Assaf Levy