编译器所编写的语言与其编译的语言是否不同?
答案1
编译器涉及三种语言:被编译的语言(源语言)、被编译成的语言(目标语言)以及编译器所用的语言(实现语言)。一般来说,实现语言要么是通用语言,如 C 或 C++,要么是源语言。目标语言可以是某种与源语言相近的语言,这种语言已经存在,也可以是汇编语言。有时会有自定义的中间语言,这样各种语言就可以有一个共同的后端。这就是 gcc 的工作方式。C、C++、Fortran、Ada 和其他语言都有前端。每个语言都被编译成相同的中间语言,然后被编译成特定于体系结构的汇编语言。
如果编译器使用与编译语言相同的语言编写,则该编译器被称为自托管。如果一种语言是新的,那么它就没有现成的编译器,这意味着它的第一个编译器不能是自托管的(否则,第一个编译器如何编译?)。因此,任何新语言编译器的第一次迭代总是用不同的语言编写的。话虽如此,自托管更方便;作者只需要精通一种语言。
答案2
理论上,你可以用任何语言编写编译器。甚至你正在编译的那个。
答案3
从我几年前(2010 年)做的一项小研究来看:
- 奥卡姆ocaml:
解析器:(o)caml
核心:C - C++g++:
解析器:C
核心:C(现在是 c++)-> 早期用 bison 生成,然后手写 - 德dmd:
解析器:C
核心:C - 哈斯克尔GHC:
解析器:haskell (+ C)
核心:Haskell
-> 以前是 LML - Cgcc:
解析器: C
核心: C
-> 以前为 BCPL / asm - 短暂聊天:
短暂聊天 - Lisp:
Lisp