Wie kann sich ein Compiler selbst kompilieren?

168

Ich recherchiere CoffeeScript auf der Website http://coffeescript.org/ und es hat den Text

Der CoffeeScript-Compiler ist selbst in CoffeeScript geschrieben

Wie kann sich ein Compiler selbst kompilieren oder was bedeutet diese Aussage?

AlexanderRD
quelle
14
Ein anderer Begriff für einen Compiler, der sich selbst kompilieren kann, ist ein self-hostingCompiler. Siehe programmers.stackexchange.com/q/263651/6221
oɔɯǝɹ
37
Warum sollte ein Compiler nicht in der Lage sein, sich selbst zu kompilieren?
user253751
48
Es sind mindestens zwei Kopien des Compilers beteiligt. Eine bereits vorhandene erstellt eine neue Kopie. Der neue kann mit dem alten identisch sein oder nicht.
BDSL
12
Sie könnten auch an Git interessiert sein: Der Quellcode wird natürlich in einem Git-Repository verfolgt.
Greg d'Eon
7
Dies ist ungefähr so, als würde man fragen: "Wie kann ein Xerox-Drucker die Schaltpläne für sich selbst drucken?" Compiler kompilieren Text zu Bytecode. Wenn der Compiler zu einem verwendbaren Bytecode kompilieren kann, können Sie den Compilercode in der jeweiligen Sprache schreiben und den Code dann durch den Compiler leiten, um die Ausgabe zu generieren.
RLH

Antworten:

219

Die erste Ausgabe eines Compilers kann nicht maschinell aus einer bestimmten Programmiersprache generiert werden. Ihre Verwirrung ist verständlich. Eine spätere Version des Compilers mit mehr Sprachfunktionen (wobei die Quelle in der ersten Version der neuen Sprache neu geschrieben wurde) könnte vom ersten Compiler erstellt werden. Diese Version könnte dann den nächsten Compiler kompilieren und so weiter. Hier ist ein Beispiel:

  1. Der erste CoffeeScript-Compiler ist in Ruby geschrieben und produziert Version 1 von CoffeeScript
  2. Der Quellcode des CS-Compilers wird in CoffeeScript 1 neu geschrieben
  3. Der ursprüngliche CS-Compiler kompiliert den neuen Code (in CS 1 geschrieben) in Version 2 des Compilers
  4. Am Compiler-Quellcode werden Änderungen vorgenommen, um neue Sprachfunktionen hinzuzufügen
  5. Der zweite CS-Compiler (der erste in CS geschrieben) kompiliert den überarbeiteten neuen Quellcode in Version 3 des Compilers
  6. Wiederholen Sie die Schritte 4 und 5 für jede Iteration

Hinweis: Ich bin mir nicht sicher, wie die CoffeeScript-Versionen genau nummeriert sind. Dies war nur ein Beispiel.

Dieser Vorgang wird normalerweise als Bootstrapping bezeichnet . Ein weiteres Beispiel für einen Bootstrapping-Compiler ist rustcder Compiler für die Rust-Sprache .

Ben N.
quelle
5
Die andere Möglichkeit zum Bootstrapping eines Compilers besteht darin, einen Interpreter für (eine Teilmenge) Ihrer Sprache zu schreiben.
Aron
Als eine weitere Alternative zum Bootstrapping mit einem Compiler oder Interpreter, der in einer anderen Sprache geschrieben ist, besteht die sehr alte Route darin, die Compilerquelle von Hand zusammenzustellen. Chuck Moore erklärt in Kapitel 9, "Programme, die booten", am Ende der Programmierung einer problemorientierten Sprache ( web.archive.org/web/20160327044521/www.colorforth.com/POL), wie dies für einen Forth-Interpreter gemacht wird .htm ), basierend darauf, dass es zweimal zuvor von Hand gemacht wurde. Die Codeeingabe erfolgt hier über eine Frontplatte, über die Werte direkt in Speicheradressen gespeichert werden können, die über Kippschalter für Bits gesteuert werden.
Jeremy W. Sherman
59

Ken Thompson, einer der Urheber von Unix, schreibt in dem Artikel Reflections on Trusting Trust einen faszinierenden (und leicht lesbaren) Überblick darüber, wie sich der C-Compiler selbst kompiliert. Ähnliche Konzepte können auf CoffeeScript oder eine andere Sprache angewendet werden.

Die Idee eines Compilers, der seinen eigenen Code kompiliert, ähnelt vage einem Quine : Quellcode, der bei seiner Ausführung den ursprünglichen Quellcode als Ausgabe erzeugt. Hier ist ein Beispiel für eine CoffeeScript-Quine. Thompson gab dieses Beispiel einer C-Quine:

char s[] = {
    '\t',
    '0',
    '\n',
    '}',
    ';',
    '\n',
    '\n',
    '/',
    '*',
    '\n',
    … 213 lines omitted …
    0
};

/*
 * The string s is a representation of the body
 * of this program from '0'
 * to the end.
 */

main()
{
    int i;

    printf("char\ts[] = {\n");
    for(i = 0; s[i]; i++)
        printf("\t%d,\n", s[i]);
    printf("%s", s);
}

Als nächstes fragen Sie sich vielleicht, wie dem Compiler beigebracht wird, dass eine Escape-Sequenz wie '\n'ASCII-Code 10 darstellt. Die Antwort lautet, dass es irgendwo im C-Compiler eine Routine gibt, die Zeichenliterale interpretiert und einige Bedingungen wie diese enthält, um Backslash-Sequenzen zu erkennen:

…
c = next();
if (c != '\\') return c;        /* A normal character */
c = next();
if (c == '\\') return '\\';     /* Two backslashes in the code means one backslash */
if (c == 'r')  return '\r';     /* '\r' is a carriage return */
…

Also können wir dem obigen Code eine Bedingung hinzufügen ...

if (c == 'n')  return 10;       /* '\n' is a newline */

… Um einen Compiler zu erstellen, der weiß, dass '\n'er ASCII 10 darstellt. Interessanterweise "kennen" dieser Compiler und alle nachfolgenden Compiler, die von ihm kompiliert wurden , diese Zuordnung, sodass Sie in der nächsten Generation des Quellcodes diese letzte Zeile in ändern können

if (c == 'n')  return '\n';

… Und es wird das Richtige tun! Das 10kommt vom Compiler und muss nicht mehr explizit im Quellcode des Compilers definiert werden. 1

Dies ist ein Beispiel für eine C-Sprachfunktion, die in C-Code implementiert wurde. Wiederholen Sie diesen Vorgang nun für jedes einzelne Sprachfeature, und Sie haben einen "selbsthostenden" Compiler: einen C-Compiler, der in C geschrieben ist.


1 Der in diesem Artikel beschriebene Plot Twist besteht darin, dass dem Compiler, da er solche Fakten "lernen" kann, auch falsch gelehrt werden kann, trojanische ausführbare Dateien auf eine Weise zu generieren, die schwer zu erkennen ist, und ein solcher Sabotageakt fortbestehen kann in allen vom verdorbenen Compiler produzierten Compilern.

200_Erfolg
quelle
7
Dies ist zwar eine interessante Information, aber ich glaube nicht, dass sie die Frage beantwortet. Ihre Beispiele setzen voraus, dass Sie bereits einen Bootstrap-Compiler haben, oder in welcher Sprache ist der C-Compiler geschrieben?
Arturo Torres Sánchez
9
@ ArturoTorresSánchez Verschiedene Erklärungen funktionieren gut für verschiedene Leute. Ich möchte nicht wiederholen, was in anderen Antworten gesagt wurde. Ich finde eher, dass die anderen Antworten auf einer höheren Ebene sprechen, als ich gerne denke. Ich persönlich bevorzuge eine konkrete Darstellung, wie ein einzelnes Feature hinzugefügt wird, und lasse den Leser daraus extrapolieren, anstatt eine flache Übersicht.
200_erfolg
5
OK, ich verstehe deine Perspektive. Es ist nur so, dass die Frage eher lautet: "Wie kann sich ein Compiler selbst kompilieren, wenn der Compiler zum Kompilieren des Compilers nicht vorhanden ist?" Und weniger: "Wie kann man einem Bootstrap-Compiler neue Funktionen hinzufügen?".
Arturo Torres Sánchez
17
Die Frage selbst ist mehrdeutig und offen. Es scheint, dass einige Leute es so interpretieren, dass es "wie kann sich ein CoffeeScript-Compiler selbst kompilieren?" Bedeutet. Die flippige Antwort, wie in einem Kommentar gegeben, lautet: "Warum sollte es nicht in der Lage sein, sich selbst zu kompilieren, so wie es irgendeinen Code kompiliert?" Ich interpretiere es als "Wie kann ein selbsthostender Compiler entstehen?" Und habe veranschaulicht, wie ein Compiler über eine seiner eigenen Sprachfunktionen unterrichtet werden kann. Es beantwortet die Frage auf eine andere Art und Weise, indem es auf niedriger Ebene veranschaulicht, wie sie implementiert wird.
200_erfolg
1
@ ArturoTorresSánchez: "[I] n in welcher Sprache ist der C-Compiler geschrieben?" Vor langer Zeit habe ich den ursprünglichen C-Compiler beibehalten, der im alten K & R-Anhang (der für IBM 360) aufgeführt ist. Viele Leute wissen, dass es zuerst BCPL, dann B und C eine verbesserte Version von B gab. Tatsächlich gab es viele Teile dieses alten Compilers, die noch in B geschrieben und nie in C umgeschrieben worden waren. Die Variablen hatten die Form eines einzelnen Buchstabens / einer einzelnen Ziffer, es wurde nicht angenommen, dass die Zeigerarithmetik automatisch skaliert wurde usw. Dieser alte Code bezeugte das Bootstrapping von B nach C. Der erste "C" -Compiler wurde in B geschrieben
Eliyahu Skoczylas
29

Sie haben bereits eine sehr gute Antwort erhalten, aber ich möchte Ihnen eine andere Perspektive bieten, die Sie hoffentlich aufklären wird. Lassen Sie uns zunächst zwei Tatsachen feststellen, auf die wir uns beide einigen können:

  1. Der CoffeeScript-Compiler ist ein Programm, das in CoffeeScript geschriebene Programme kompilieren kann.
  2. Der CoffeeScript-Compiler ist ein in CoffeeScript geschriebenes Programm.

Ich bin sicher, Sie können zustimmen, dass sowohl # 1 als auch # 2 wahr sind. Schauen Sie sich nun die beiden Aussagen an. Sehen Sie jetzt, dass es für den CoffeeScript-Compiler völlig normal ist, den CoffeeScript-Compiler kompilieren zu können?

Dem Compiler ist es egal, was er kompiliert. Solange es sich um ein in CoffeeScript geschriebenes Programm handelt, kann es kompiliert werden. Und der CoffeeScript-Compiler selbst ist zufällig ein solches Programm. Dem CoffeeScript-Compiler ist es egal, dass es sich um den CoffeeScript-Compiler handelt, den er selbst kompiliert. Alles, was es sieht, ist ein CoffeeScript-Code. Zeitraum.

Wie kann sich ein Compiler selbst kompilieren oder was bedeutet diese Aussage?

Ja, genau das bedeutet diese Aussage, und ich hoffe, Sie können jetzt sehen, wie diese Aussage wahr ist.

Jörg W Mittag
quelle
2
Ich weiß nicht viel über Kaffeeskript, aber Sie könnten Punkt 2 klarstellen, indem Sie angeben, dass es in Kaffeeskript geschrieben wurde, aber seitdem kompiliert wurde und dann Maschinencode ist. Und wie auch immer, könnten Sie dann bitte das Henne-Ei-Problem erklären? Wenn der Compiler in einer Sprache geschrieben wurde, für die noch kein Compiler geschrieben wurde, wie kann der Compiler dann überhaupt ausgeführt oder kompiliert werden?
Barlop
6
Ihre Aussage 2 ist unvollständig / ungenau und sehr irreführend. da, wie die erste Antwort sagt, die erste nicht in Kaffeeskript geschrieben wurde. Das ist so relevant für seine Frage. Und zu "Wie kann sich ein Compiler selbst kompilieren oder was bedeutet diese Aussage?" Sie sagen "Ja", ich nehme an (obwohl meine Gedanken etwas klein sind), ich sehe, dass es verwendet wird, um frühere Versionen von sich selbst zu kompilieren, anstatt sich selbst. Aber wird es auch verwendet, um sich selbst zu kompilieren? Ich nahm an, dass es sinnlos wäre.
Barlop
2
@barlop: Ändern Sie Anweisung 2 in " Heute ist der CoffeeScript-Compiler ein in CoffeeScript geschriebenes Programm." Hilft Ihnen das, es besser zu verstehen? Ein Compiler ist "nur" ein Programm, das eine Eingabe (Code) in eine Ausgabe (Programm) übersetzt. Wenn Sie also einen Compiler für die Sprache Foo haben, schreiben Sie den Quellcode für einen Foo-Compiler in der Sprache Foo selbst und geben Sie diese Quelle an Ihren ersten Foo-Compiler weiter. Sie erhalten einen zweiten Foo-Compiler als Ausgabe. Dies geschieht in vielen Sprachen (zum Beispiel sind alle mir bekannten C-Compiler in… C geschrieben).
DarkDust
3
Der Compiler kann sich nicht selbst kompilieren. Die Ausgabedatei ist nicht dieselbe Instanz wie der Compiler, der die Ausgabedatei erstellt. Ich hoffe, Sie können jetzt sehen, wie falsch diese Aussage ist.
Pabrams
3
@pabrams Warum nimmst du das an? Die Ausgabe könnte durchaus mit dem Compiler identisch sein, mit dem sie erstellt wurde. Wenn ich beispielsweise GCC 6.1 mit GCC 6.1 kompiliere, erhalte ich eine Version von GCC 6.1, die mit GCC 6.1 kompiliert wurde. Und wenn ich das zum Kompilieren von GCC 6.1 verwende, erhalte ich auch eine mit GCC 6.1 kompilierte Version von GCC 6.1, die identisch sein sollte (Dinge wie Zeitstempel werden ignoriert).
user253751
9

Wie kann sich ein Compiler selbst kompilieren oder was bedeutet diese Aussage?

Es bedeutet genau das. Zunächst einige Dinge zu beachten. Es gibt vier Objekte, die wir betrachten müssen:

  • Der Quellcode eines beliebigen CoffeScript-Programms
  • Die (generierte) Assemblierung eines beliebigen CoffeScript-Programms
  • Der Quellcode des CoffeScript-Compilers
  • Die (generierte) Assembly des CoffeScript-Compilers

Nun sollte es offensichtlich sein, dass Sie die generierte Assembly - die ausführbare Datei - des CoffeScript-Compilers verwenden können, um ein beliebiges CoffeScript-Programm zu kompilieren und die Assembly für dieses Programm zu generieren.

Jetzt ist der CoffeScript-Compiler selbst nur ein beliebiges CoffeScript-Programm und kann daher vom CoffeScript-Compiler kompiliert werden.

Es scheint , dass Ihre Verwirrung rührt von der Tatsache , dass , wenn Sie Ihre eigene neue Sprache erstellen, die Sie nicht haben einen Compiler noch können Sie Ihre Compiler kompilieren. Das sieht doch nach einem Hühnerei-Problem aus , oder?

Führen Sie den Prozess namens Bootstrapping ein .

  1. Sie schreiben einen Compiler in einer bereits vorhandenen Sprache (im Fall von CoffeScript wurde der ursprüngliche Compiler in Ruby geschrieben), der eine Teilmenge der neuen Sprache kompilieren kann
  2. Sie schreiben einen Compiler, der eine Teilmenge der neuen Sprache in der neuen Sprache selbst kompilieren kann. Sie können nur Sprachfunktionen verwenden, die der Compiler aus dem obigen Schritt kompilieren kann.
  3. Sie verwenden den Compiler aus Schritt 1, um den Compiler aus Schritt 2 zu kompilieren. Dadurch erhalten Sie eine Assembly, die ursprünglich in einer Teilmenge der neuen Sprache geschrieben wurde und eine Teilmenge der neuen Sprache kompilieren kann.

Jetzt müssen Sie neue Funktionen hinzufügen. whileAngenommen, Sie haben nur -loops implementiert, möchten aber auch for-loops. Dies ist kein Problem, da Sie jede for-schleife so umschreiben können , dass es sich um eine while-schleife handelt. Dies bedeutet, dass Sie nur while-loops im Quellcode Ihres Compilers verwenden können, da die vorhandene Assembly nur diese kompilieren kann. Sie können jedoch Funktionen in Ihrem Compiler erstellen, formit denen Sie -loops pasen und kompilieren können. Anschließend verwenden Sie die bereits vorhandene Assembly und kompilieren die neue Compilerversion. Und jetzt haben Sie eine Assembly eines Compilers, der auch for-loops analysieren und kompilieren kann! Sie können jetzt zur Quelldatei Ihres Compilers zurückkehren und alle while-loops, die Sie nicht möchten, in for-loops umschreiben.

Spülen und wiederholen, bis alle gewünschten Sprachfunktionen mit dem Compiler kompiliert werden können.

whileund waren fornatürlich nur Beispiele, aber dies funktioniert für jede neue Sprachfunktion, die Sie wollen. Und dann sind Sie in der Situation, in der sich CoffeScript gerade befindet: Der Compiler kompiliert sich selbst.

Es gibt viel Literatur da draußen. Überlegungen zum Vertrauen Vertrauen ist ein Klassiker, den jeder, der sich für dieses Thema interessiert, mindestens einmal lesen sollte.

Polygnom
quelle
5
(Der Satz "Der CoffeeScript-Compiler ist selbst in CoffeeScript geschrieben" ist wahr, aber "Ein Compiler kann sich selbst kompilieren" ist falsch.)
pabrams
4
Nein, es ist völlig wahr. Der Compiler kann sich selbst kompilieren. Es macht einfach keinen Sinn. Angenommen, Sie haben die ausführbare Datei, mit der Version X der Sprache kompiliert werden kann. Sie schreiben einen Compiler, der Version X + 1 kompilieren kann, und kompilieren ihn mit dem Compiler, den Sie haben (Version X). Am Ende erhalten Sie eine ausführbare Datei, mit der Version X + 1 der Sprache kompiliert werden kann. Jetzt können Sie diese neue ausführbare Datei verwenden, um den Compiler neu zu kompilieren. Aber zu welchem ​​Zweck? Sie haben bereits haben die ausführbare Datei das tut , was Sie wollen. Der Compiler kann jedes gültige Programm kompilieren , so dass er sich vollständig selbst kompilieren kann!
Polygnome
1
In der Tat ist es nicht ungewöhnlich, einige Male zu bauen, iirc modern freepascal baut den Compiler insgesamt fünfmal.
Plugwash
1
@pabrams Das Schreiben von "Nicht berühren" und "Heißes Objekt. Nicht berühren" macht keinen Unterschied für die beabsichtigte Nachricht der Phrase. Solange die beabsichtigte Zielgruppe der Nachricht (Programmierer) die beabsichtigte Nachricht der Phrase versteht (ein Build des Compilers kann seine Quelle kompilieren), unabhängig davon, wie sie geschrieben ist, ist diese Diskussion sinnlos. Nach heutigem Stand ist Ihr Argument ungültig. Wenn Sie nicht nachweisen können, dass die Zielgruppe der Nachricht Nicht-Programmierer sind, sind Sie nur dann richtig.
DarkDestry
2
@pabrams 'Gutes Englisch' ist Englisch, das dem Zielpublikum Ideen klar und auf die vom Autor oder Sprecher beabsichtigte Weise vermittelt. Wenn das beabsichtigte Publikum Programmierer sind und Programmierer es verstehen, ist es gutes Englisch. Die Aussage "Licht existiert sowohl als Teilchen als auch als Wellen" entspricht im Wesentlichen "Licht existiert sowohl als Photonen als auch als elektromagnetische Wellen". Für einen Physiker bedeuten sie wörtlich dasselbe. Bedeutet das, dass wir immer die längere und klarere Haltung verwenden sollten? Nein! Weil es das Lesen erschwert, wenn die Bedeutung für das beabsichtigte Publikum bereits klar ist.
DarkDestry
7

Eine kleine aber wichtige Klarstellung

Hier beschönigt der Begriff Compiler die Tatsache, dass es sich um zwei Dateien handelt. Eine ist eine ausführbare Datei, die als in CoffeScript geschriebene Eingabedateien eine andere ausführbare Datei, eine verknüpfbare Objektdatei oder eine gemeinsam genutzte Bibliothek als Ausgabedatei erstellt. Die andere ist eine CoffeeScript-Quelldatei, die gerade das Verfahren zum Kompilieren von CoffeeScript beschreibt.

Sie wenden die erste Datei auf die zweite an und erzeugen eine dritte, die denselben Kompilierungsvorgang wie die erste ausführen kann (möglicherweise mehr, wenn die zweite Datei Funktionen definiert, die von der ersten nicht implementiert wurden), und können daher die erste ersetzen, wenn Sie dies tun so Verlangen.

nbro
quelle
4
  1. Der CoffeeScript-Compiler wurde zuerst in Ruby geschrieben.
  2. Der CoffeeScript-Compiler wurde dann in CoffeeScript neu geschrieben.

Da die Ruby-Version des CoffeeScript-Compilers bereits vorhanden war, wurde sie zum Erstellen der CoffeeScript-Version des CoffeeScript-Compilers verwendet.

Geben Sie hier die Bildbeschreibung ein Dies wird als selbsthostender Compiler bezeichnet .

Es ist sehr häufig und resultiert normalerweise aus dem Wunsch eines Autors, seine eigene Sprache zu verwenden, um das Wachstum dieser Sprache aufrechtzuerhalten.

Trevor Hickey
quelle
3

Hier geht es nicht um Compiler, sondern um die Ausdruckskraft der Sprache, da ein Compiler nur ein Programm ist, das in einer bestimmten Sprache geschrieben ist.

Wenn wir sagen, dass "eine Sprache geschrieben / implementiert ist", meinen wir tatsächlich, dass ein Compiler oder Interpreter für diese Sprache implementiert ist. Es gibt Programmiersprachen, in denen Sie Programme schreiben können, die die Sprache implementieren (sind Compiler / Interpreter für dieselbe Sprache). Diese Sprachen werden universelle Sprachen genannt .

Um dies verstehen zu können, denken Sie an eine Metalldrehmaschine. Es ist ein Werkzeug zum Formen von Metall. Mit nur diesem Werkzeug ist es möglich, ein anderes, identisches Werkzeug zu erstellen, indem seine Teile erstellt werden. Somit ist dieses Werkzeug eine universelle Maschine. Natürlich wurde der erste mit anderen Mitteln (anderen Werkzeugen) erstellt und war wahrscheinlich von geringerer Qualität. Aber der erste wurde verwendet, um neue mit höherer Präzision zu bauen.

Ein 3D-Drucker ist fast eine universelle Maschine. Sie können den gesamten 3D-Drucker mit einem 3D-Drucker drucken (Sie können nicht die Spitze bauen, die den Kunststoff schmilzt).

Paul92
quelle
Ich mag die Analogie der Drehmaschine. Im Gegensatz zur Drehmaschinenanalogie werden Unvollkommenheiten in der ersten Compiler-Iteration jedoch an alle nachfolgenden Compiler weitergegeben. In einer obigen Antwort wird beispielsweise das Hinzufügen einer for-Schleifenfunktion erwähnt, bei der der ursprüngliche Compiler nur while-Schleifen verwendet. Die Ausgabe versteht for-Schleifen, aber die Implementierung erfolgt mit while-Schleifen. Wenn die ursprüngliche Implementierung der while-Schleife fehlerhaft oder ineffizient ist, wird dies immer der Fall sein!
@ Physics-Compute das ist einfach falsch. In Abwesenheit von böswilligen Fehlern verbreiten sich diese normalerweise nicht beim Kompilieren eines Compilers.
Plugwash
Assembly-Übersetzungen werden sicherlich von Iteration zu Iteration weitergegeben, bis die Assembly-Übersetzung behoben ist. Neue Funktionen, die auf alten Funktionen aufbauen, ändern die zugrunde liegende Implementierung nicht. Denken Sie eine Weile darüber nach.
@plugwash Siehe "Reflections on Trusting Trust" von Ken Thompson - ece.cmu.edu/~ganger/712.fall02/papers/p761-thompson.pdf
3

Beweis durch Induktion

Induktiver Schritt

Die n + 1-te Version des Compilers ist in X geschrieben.

Somit kann es von der n-ten Version des Compilers kompiliert werden (auch in X geschrieben).

Basisfall

Die erste Version des in X geschriebenen Compilers muss jedoch von einem Compiler für X kompiliert werden, der in einer anderen Sprache als X geschrieben ist. Dieser Schritt wird als Bootstrapping des Compilers bezeichnet.

Guy Argo
quelle
1
Der allererste Compiler-Compiler für Sprache X kann leicht in X geschrieben werden. Möglich ist, dass dieser erste Compiler interpretiert werden kann . (Von einem X-Interpreter, der in einer anderen Sprache als X geschrieben ist).
Kaz
0

Compiler verwenden eine Spezifikation auf hoher Ebene und verwandeln sie in eine Implementierung auf niedriger Ebene, wie sie auf Hardware ausgeführt werden kann. Daher besteht außer der Semantik der Zielsprache keine Beziehung zwischen dem Format der Spezifikation und der tatsächlichen Ausführung.

Cross-Compiler wechseln von einem System zu einem anderen System. Cross-Language-Compiler kompilieren eine Sprachspezifikation in eine andere Sprachspezifikation.

Grundsätzlich ist das Kompilieren eine gerechte Übersetzung, und das Niveau ist normalerweise ein höheres Sprachniveau zu einem niedrigeren Sprachniveau, aber es gibt viele Varianten.

Bootstrapping-Compiler sind natürlich am verwirrendsten, da sie die Sprache kompilieren, in der sie geschrieben sind. Vergessen Sie nicht den ersten Schritt beim Bootstrapping, für den mindestens eine ausführbare Version erforderlich ist, die ausführbar ist. Viele Bootstrap-Compiler arbeiten zuerst an den minimalen Funktionen einer Programmiersprache und fügen künftig zusätzliche komplexe Sprachfunktionen hinzu, solange die neue Funktion mit den vorherigen Funktionen ausgedrückt werden kann. Wenn dies nicht der Fall wäre, müsste dieser Teil des "Compilers" zuvor in einer anderen Sprache entwickelt werden.

nbro
quelle