直观上,语言 Foo
的编译器本身似乎不能用 Foo 编写。更具体地说,语言 Foo
的第一个编译器不能用 Foo 编写,但任何后续编译器都可以为 Foo
编写。
但这真的是真的吗?我有一些非常模糊的内存,读到过一种语言,它的第一个编译器是用“它自己”编写的。这可能吗?如果可能的话,如何实现?
最佳答案
这称为“引导”。您必须首先使用其他语言(通常是 Java 或 C)为您的语言构建编译器(或解释器)。完成后,您可以用 Foo 语言编写新版本的编译器。您使用第一个引导编译器来编译该编译器,然后使用此编译后的编译器来编译其他所有内容(包括其自身的 future 版本)。
大多数语言确实是以这种方式创建的,部分原因是语言设计者喜欢使用他们正在创建的语言,而且还因为一个不平凡的编译器通常可以作为衡量语言“完整”程度的有用基准。
Scala 就是一个例子。它的第一个编译器是用 Pizza 创建的,这是 Martin Odersky 的实验语言。从 2.0 版本开始,编译器完全用 Scala 重写。从那时起,旧的 Pizza 编译器可以被完全丢弃,因为新的 Scala 编译器可以用于编译自身以供将来的迭代使用。
关于compiler-construction - 用自己的语言编写编译器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/193560/