可能重复:
implementing a compiler in “itself”
Bootstrapping a language
如何使用与编写该编译器的语言相同的语言编写编译器?是不是那种递归?
修改: 这可能会被删除,但除此之外......:
如何引导:
为什么来引导:
答案 0 :(得分:28)
通常,编译器的第一个版本是用不同的语言编写的,然后每个后续版本都用该语言编写,并使用旧版本编译。在使用版本x
编译版本x-1
之后,您可以使用新构建的版本x
重新编译自己,利用版本引入的任何新优化; GCC以这种方式发布
答案 1 :(得分:13)
是的。您通常需要从另一种语言编译或解释的语言的引导版本。
多年前,我想了解一下作为研究生项目编写的Pascal编译器的历史。它用Pascal编写,并使用系统内置的Pascal编译器进行编译。最终,它足以取代系统内置的Pascal编译器。不幸的是,他们在代码生成中发现了一个错误,但代码生成器的修复程序触发了编译器中的错误,从而生成了错误的编译器。要修复它,需要从已安装的编译器手动修补二进制文件,然后将修补程序应用于源代码以替换自身。
答案 2 :(得分:6)
这对于第一个版本来说只是一个问题。一旦我有V1.0的编译器工作,我可以用我的语言编写V2.0并使用V1.0编译器进行编译。然后我可以编写V3.0并使用V2.0编译,使用V3.0编译V4.0等等。
答案 3 :(得分:1)
编译器的第一遍通常是用其他东西编写的,直到语言形式足以能够编译它自己的编译器,然后你可以进入x用x编写。
答案 4 :(得分:1)
最初,该语言的真正第一个编译器当然不是用那种语言编写的。非常秒可以用那种语言写成。此外,给定一种语言规范,您可以在引导编译器中实现基本核心,然后使用“bootstrap”编译器理解的子集以该语言编写完全兼容的编译器。第二代编译器也可以忘记“bootstrap”编译器。
答案 5 :(得分:1)
在某些时候,您需要使用不同语言编写的编译器(或解释器)。但它不需要高效,可以用一种语言来完成解析和原型设计(LISP很受欢迎)。一旦你用它来编译“自编译器”,就可以丢弃它并使用结果。