编译编译器

时间:2013-02-01 18:43:34

标签: compiler-construction

  

可能重复:
  Bootstrapping a language

编译器本身是用高级语言编写的。那么计算机如何理解编译器呢?他们将HLL转换为机器级代码,但它们如何被计算机理解?

3 个答案:

答案 0 :(得分:3)

一个编译器是用机器代码编写的。其余的可以使用它或其他已编译的编译器(包括其自身的未来版本,可以使用现有版本重新编译新版本。)

P.S。请注意,大多数编译器都不会将“高级代码”编译为机器代码,它们有2个组件front-endback-end。前端将代码编译为中间中间语言,后端将中间语言编译为机器代码。

这确保了如果您拥有n种语言和m架构,则只需要n+m个组件,而不是n*m,如果每个语言/机器都有一个编译器

答案 1 :(得分:1)

一个版本需要用汇编代码编写。然后,您可以使用此编译器编译其他程序,包括其他编译器。

然而,一篇有趣的论文/观察是编译器可以学习。也就是说,您可以删除部分源代码并仍保留其功能;)一个示例是解析\n字符。以下文章很好地展示了这一点! http://cm.bell-labs.com/who/ken/trust.html

答案 2 :(得分:1)

编译 语言 X > Y X em>和 Y 可能或可能不是同一种语言)必须使用 Y 语言的编译器编译到机器代码中(或者如果要解释 Y ,那么编译器必须由 Y 解释器执行。真的,没有办法解决这个问题。除非 Y 是汇编。即你在汇编中编写 X 编译器。

如果您想编写 语言 X 的编译器,那么您可以这样做这样:

  1. 您使用另一种语言编写 X 语言的编译器,例如 Y ,编译器已经存在(或在汇编中)

  2. 然后在 X 中编写 X 编译器,并使用语言 Y编写的 X 编译器进行编译(您在步骤1中写的那个)。

  3. 如果新的 X 编译器足够完整,它应该能够编译自己的副本(因为它们毕竟是 X 源)。 / p>

  4. 这称为bootstrapping