直观地说,似乎语言的编译器Foo本身不能用 Foo 编写。更具体地说,语言的 第一个 编译器Foo不能用 Foo 编写,但任何后续编译器都可以用Foo.
Foo
但这真的是真的吗?我对阅读第一个编译器是用“自身”编写的语言有一些非常模糊的回忆。这可能吗,如果可以,怎么办?
这称为“引导”。您必须首先用其他语言(通常是 Java 或 C)为您的语言构建编译器(或解释器)。完成后,您可以使用 Foo 语言编写新版本的编译器。你使用第一个引导编译器来编译编译器,然后使用这个编译的编译器来编译其他所有东西(包括它自己的未来版本)。
大多数语言确实是以这种方式创建的,部分原因是语言设计者喜欢使用他们正在创建的语言,还因为非平凡的编译器通常可以作为语言“完整”程度的有用基准。
Scala就是一个例子。它的第一个编译器是用 Martin Odersky 的实验性语言 Pizza 创建的。从 2.0 版开始,编译器完全用 Scala 重写。从那时起,旧的 Pizza 编译器可能会被完全丢弃,因为新的 Scala 编译器可以用于为未来的迭代进行编译。