2014-12-16 4 views
129

Ich schaute auf den Quellcode um http://referencesource.microsoft.com/, und es scheint, der gesamte Quellcode ist in C#.In welcher Sprache wird der C# -Compiler geschrieben?

Ich schaute auch auf den Quellcode für die neue C# -Compiler-Plattform (Roslyn), und es ist auch in C#. Wie ist das möglich? Wird der C# -Sprachen-Compiler in C# geschrieben? Oder fehlt mir etwas Offensichtliches? Wenn C# -Compiler in C# geschrieben wird, wie funktioniert es dann?

+10

Viele Compiler sind in der Sprache geschrieben, die sie kompilieren - Google [bootstrapping] (http://en.wikipedia.org/wiki/Bootstrapping_%28compilers%29), um mehr zu erfahren. –

+17

Ich denke, der _original_ Compiler wurde in C++ geschrieben. – PoweredByOrange

+36

Nun kann ein Hammer mit einem anderen Hammer geschmiedet werden. Vorherige Version davon ... –

Antwort

206

Der ursprüngliche C# -Compiler wurde nicht in C# geschrieben, sondern in C und C++. Der neue Roslyn-Compiler wurde in C# geschrieben, wurde aber ursprünglich mit dem alten Compiler kompiliert. Sobald der neue Compiler fertig war, konnte er seinen eigenen Quellcode kompilieren: das heißt bootstrapping.

+2

Wenn also eine Änderung am "ursprünglichen Compiler" vorgenommen werden muss, muss das mit dem alten Compiler * (geschrieben in C, C++) * übersetzt werden? – CriketerOnSO

+10

Es würde keine Notwendigkeit geben, den "ursprünglichen Compiler" zu ändern, die neueren Versionen würden – Pseudonym

+1

@CriketerOnSO geändert werden, der neue Compiler wird den alten ersetzen, so dass es keine Notwendigkeit geben wird, den alten zu modifizieren. Aber wenn MS das tun wollte, würden sie den alten Compiler mit einem C++ - Compiler wie zuvor kompilieren. –

31

Compiler sind Hilfsprogramme - sie wandeln Programmiersprachen in Maschinencode um. Wenn die Programmiersprache Software beschreibt, die gerade ein Compiler ist ...

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

Compiler 2.0 muss in einer Sprache geschrieben Compiler 1.0 kann verarbeiten, aber es 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, dann erreichen wir einen Punkt, wo wir keinen Compiler haben - die allererste Iteration einer Hochsprache. Dann müssen wir die Bleistifte herausholen und die Bücher opcodieren und die erste in der Versammlung schreiben. Wie haben wir den ersten Assembler geschrieben? Direkte Maschinencodeeingabe, wahrscheinlich auf gelochtes Papierband oder umschaltbare Schalter an der Frontplatte.

+8

Und das Papierband dreht nur Schalter über Löcher im Papier. :-) –

+2

Papierklebeband als Speichertechnologie wird * nie * abheben. Es ist einfach zu komplex und fehleranfällig, außerdem brennt es leicht, wenn ein Kurzschluss im Lesegerät auftritt und das Programm komplett zerstört wird. –

14

Ein Compiler ist nur ein Programm wie jedes andere Programm. Es gibt nichts Magisches oder Besonderes. Es braucht etwas Input und produziert etwas Output. In diesem speziellen Fall ist die Eingabe zufällig C# und die Ausgabe ist zufällig CIL, aber das unterscheidet sich nicht von der Eingabe als eine Reihe von Steuererklärungen und die Ausgabe ist ein Bericht.

+8

Es ist anders - es ist viel einfacher, -). –

+3

@PeterSchneider: Leute mögen es, Compiler als mythische magische Kreaturen zu gießen, aber am Ende sind sie nur Programme, die Input in Output umwandeln. So ziemlich jedes Programm auf dem Planeten analysiert einige Eingaben, versucht sie zu verstehen und macht daraus eine Ausgabe. In gewisser Hinsicht ist jede Eingabe ein Programm, das in irgendeiner Sprache geschrieben ist, jedes Programm ist ein Compiler. –

+3

Ich könnte mehr nicht zustimmen. Alles, was ich sagen wollte, ist, dass Steuergesetze ein schreckliches Durcheinander sind. Im Gegensatz dazu sind formale Sprachen typischerweise auf eine Weise definiert, die für eine Automatisierung geeignet ist. Das macht einen einfachen Compiler wohl einfacher zu schreiben als ein Programm, das sich mit Steuern beschäftigt. Obwohl Eric Lippert sich geweigert haben könnte, den C# -Compilern zu widersprechen, vgl. http://blogs.msdn.com/b/ericlippert/archive/2010/02/04/how-many-passes.aspx. Lange Weg von One-Pass-C-Compiler. –