Mit welcher Sprache werden Compiler geschrieben?

7

Sind Compiler in anderen Sprachen geschrieben als die Sprache, die sie kompilieren?

the0roamer
quelle

Antworten:

18

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.

KeithB
quelle
3

Sie können einen Compiler theoretisch in jeder Sprache schreiben. Sogar die, die Sie kompilieren .

Corey
quelle
warum theoretisch? was meinst du damit?
the0roamer
1
Ich sage das, weil ich zum Beispiel noch nie einen Compiler in Javascript gesehen habe. Es kann oder kann nicht möglich sein, da ich noch nie alles gesehen habe, was Javascript zu bieten hat.
Corey
9
Sie könnten einen C ++ - Compiler in Fortran schreiben, würden es aber sicherlich nicht wollen.
KeithB
3
Ich glaube, ich würde diesen C ++ - Compiler lieber in Fortran als in Javascript schreiben ...
Quacksalber Quijote
0

Aus einer kleinen Studie, die ich vor einigen Jahren (2010) gemacht habe:

  • Ocaml ocaml:
    Parser: (o) Caml-
    Kern: C.
  • C ++ g ++:
    Parser: C
    Kern: C (jetzt c ++) -> früh mit Bison generiert, dann handgeschrieben
  • D dmd:
    Parser: C
    Kern: C.
  • Haskell GHC:
    Parser: Haskell (+ C)
    Kern: Haskell
    -> früher in LML
  • C gcc:
    Parser: C
    Kern: C
    -> früher BCPL / asm
  • SmallTalk :
    SmallTalk
  • Lisp :
    Lisp
Ugo
quelle