Sind Compiler in anderen Sprachen geschrieben als die Sprache, die sie kompilieren?
In einem Compiler sind drei Sprachen enthalten: die Sprache, die kompiliert wird (Ausgangssprache), die Sprache, in die kompiliert wird (Zielsprache), und die Sprache, in der der Compiler geschrieben ist (Implementierungssprache). Im Allgemeinen ist die Implementierungssprache entweder eine Allzwecksprache wie C oder C ++ oder die Ausgangssprache . Die Zielsprache kann eine Sprache sein, die in der Nähe der bereits vorhandenen Ausgangssprache oder der Assembly geeignet ist. Manchmal gibt es eine benutzerdefinierte Zwischensprache, so dass es ein gemeinsames Backend für eine Vielzahl von Sprachen geben kann. So funktioniert gcc. Es gibt ein Frontend für C, C ++, Fortran, Ada und wahrscheinlich andere. Jedes wird in dieselbe Zwischensprache kompiliert, die dann in eine architekturspezifische Assemblersprache kompiliert wird.
Wenn der Compiler in derselben Sprache geschrieben ist wie die, die er kompiliert, wird der Compiler als Self-Hosting bezeichnet . Wenn eine Sprache neu ist, ist bereits kein Compiler für sie vorhanden. Dies bedeutet, dass der erste Compiler nicht selbst gehostet werden kann (andernfalls wie würde dieser erste Compiler kompiliert werden?). Daher wird die erste Iteration eines Compilers für eine neue Sprache immer in einer anderen Sprache geschrieben. Allerdings ist ein Selbsthosting bequemer; Die Autoren müssen nur eine Sprache beherrschen.
Sie können einen Compiler theoretisch in jeder Sprache schreiben. Sogar die, die Sie kompilieren .
Bei Stack Overflow gibt es viel mehr Informationen dazu , z. B. Was ist die beste Sprache, um einen Compiler zu schreiben? .
Mehr verwandt bei SO
Ich weiß, dass Fragen von Stack Overflow hierher verschoben werden, aber ich weiß nicht, ob es auch umgekehrt funktioniert.
quelle
Aus einer kleinen Studie, die ich vor einigen Jahren (2010) gemacht habe:
Parser: (o) Caml-
Kern: C.
Parser: C
Kern: C (jetzt c ++) -> früh mit Bison generiert, dann handgeschrieben
Parser: C
Kern: C.
Parser: Haskell (+ C)
Kern: Haskell
-> früher in LML
Parser: C
Kern: C
-> früher BCPL / asm
SmallTalk
Lisp
quelle