如何用该语言编写语言编译器?

时间:2010-06-08 15:27:02

标签: compiler-construction recursion bootstrapping

  

可能重复:
  implementing a compiler in “itself”
  Bootstrapping a language

如何使用与编写该编译器的语言相同的语言编写编译器?是不是那种递归?

修改: 这可能会被删除,但除此之外......:

如何引导:

为什么来引导:

6 个答案:

答案 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很受欢迎)。一旦你用它来编译“自编译器”,就可以丢弃它并使用结果。