Kompilieren Sie eine Programmiersprache mit sich selbst

10

Ich bin ein Informatikstudent. Ich möchte meine eigene Programmiersprache erstellen (eine Basissprache mit wenigen Anweisungen).

Ich weiß, wie man einen syntaktischen Analysator macht, ich habe es bereits in Perl gemacht. In einem Artikel habe ich etwas über den Compiler gelesen, ein Compiler ist an sich gemacht.

Zum Beispiel ist der C-Compiler in C geschrieben. Wie ist das möglich? Ich kann meine eigene Sprache erstellen, weiß aber nicht, wie ich sie ausführen kann. Irgendeine Idee?

Es ist wirklich eine gute Frage und ich kann einen Blog über das Projekt schreiben.

BaptisteL
quelle
Die Leute haben erklärt, wie man bootstrap, aber warum müssen Sie? Es gibt keinen Grund, warum Sie Ihre Sprache nicht mit einem in C, Perl oder etwas anderem geschriebenen Compiler kompilieren können. Sicher, es wäre schön, wenn ein Compiler für Ihre Sprache in sich selbst geschrieben wäre, aber das wäre eine Menge Arbeit - Sie müssten mindestens zwei Compiler schreiben, um das zu bekommen (einer in C / Perl / was auch immer, einer in Ihre Sprache).
David Richerby
Hmm .. Ich denke, ich werde meinen ersten Compiler in C schreiben und eine Sekunde in meiner Sprache schreiben. Es ist wirklich interessant, eine kleine Programmiersprache zu erstellen, wir können viel Informatik lernen
BaptisteL

Antworten:

13

Der Trick ist Bootstrapping . Sie schreiben zuerst einen Compiler für Ihre Sprache (oder eine Teilmenge davon) in einer anderen Sprache. Dann schreiben Sie einen Compiler für Ihre Sprache (oder eine große Teilmenge derjenigen, die Sie bereits verarbeiten können) in Ihrer Sprache. Sie verwenden den früheren Compiler, um den neuen Compiler zu kompilieren, und dann kann der neue Compiler sich selbst kompilieren.

Yuval Filmus
quelle
Also kann ich meinen ersten Compiler mit C erstellen und beim nächsten Mal werde ich meinen Compiler v2 mit v1 kompilieren? Aber es gibt ein Problem. Woher weiß ich, dass der Compiler kein Problem hat? Ich muss meinen Quellcode in Assembler konvertieren. Oder in einer anderen Sache?
BaptisteL
2
Wie kann ich wissen, dass der Compiler kein Problem hat? Im Allgemeinen haben Sie ein Programm geschrieben. Woher weißt du, dass es keine Fehler gibt? Das tust du nicht. Sie schreiben einige Tests und hoffen auf das Beste. Muss ich meinen Quellcode in Assembly konvertieren? Definitiv nicht. Sie können dem C-Compiler vertrauen. Sie machen dasselbe, aber die Assembly wird durch C (oder eine andere Sprache Ihrer Wahl) ersetzt.
Yuval Filmus
Okay, ich muss auf meine Fähigkeiten vertrauen ^^ Ich wollte den Prozess bitten, den Compiler zu machen. Ich verstehe wirklich nicht, was ein Compiler macht, syntaxischer und lexikalischer Analysator okay, aber als nächstes?
BaptisteL
Dann generieren Sie Code. Wenn Sie nicht auf die Details des Generierens von Maschinencode eingehen möchten, können Sie Code immer in einer anderen Sprache generieren, z. B. C-Code, und einen externen Compiler verwenden, um diesen in Maschinencode zu kompilieren. (Oder Sie könnten eine interpretierte Sprache verwenden und einen Dolmetscher ausführen.)
Yuval Filmus
Hummm Nein, ich mache es lieber so: Meine Sprache in enter -> Maschinencode. Ich möchte meine Sprache nicht in eine andere konvertieren (dasselbe gilt für das erstmalige Kompilieren). Ist das möglich?
BaptisteL
2

Ein Compiler, der seine eigenen Quellen kompilieren kann, wird als selbsthostender Compiler bezeichnet. Frühe Compiler wurden in einer anderen Sprache geschrieben. Zum Beispiel wurde der erste C-Compiler wahrscheinlich in Assembler geschrieben. Der ganze Trick bei der Verwendung eines früheren Compilers niedrigerer Ebene heißt Bootstrapping.

Bartosz Przybylski
quelle