compiler-construction - 用自己的语言编写编译器

标签 compiler-construction bootstrapping

直观上,语言 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/

相关文章:

c++ - VS2008 c++ 编译器会优化以下 if 语句吗?

python - Python 的 AoT 编译器

grails - 引导完成后,Grails执行服务方法

javascript - AngularJS 在引导后添加依赖项

javascript - 合并 GWT 生成的文件

ios - 无法向引导服务器注册 [...]

c - YACC 未从后继节点获取值

visual-c++ - 编译 x64 代码时, "x86_amd64"和 "amd64"有什么区别?

c++ - 为什么可变参数类模板最多只能有一个参数包?

bootstrapping - Quantlib bootstrapping 错误,99 次迭代后未达到收敛