代码之家  ›  专栏  ›  技术社区  ›  froadie

一种语言的编译器怎么能用这种语言编写?[复制品]

  •  17
  • froadie  · 技术社区  · 14 年前

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

    如何用与编写编译器所用语言相同的语言编写编译器?这不是递归的吗?

    编辑 : 这可能会被删除,否则…:

    怎么 引导:

    为什么? 引导:

    6 回复  |  直到 14 年前
        1
  •  27
  •   Michael Mrozek    14 年前

    通常,编译器的第一个版本是用不同的语言编写的,然后每个后续版本都用该语言编写,并用旧版本进行编译。一旦你编译了版本 x 带版本 x-1 ,可以使用新生成的版本 X 为了重新编译自己,利用版本引入的任何新优化;gcc以这种方式发布它的版本。

        2
  •  13
  •   plinth    14 年前

    它是。您通常需要从另一种语言编译或解释该语言的引导版本。

    几年前,我读过一本帕斯卡编译器的历史,它是作为一个研究生项目写的。它用Pascal编写,并用系统内置的Pascal编译器编译。最终,它足以取代系统内置的Pascal编译器。不幸的是,他们在代码生成中发现了一个bug,但是代码生成器的修复在编译器中触发了这个bug,生成了一个坏的编译器。要修复它,需要从已安装的编译器手动修补二进制文件,然后将修补程序应用到源代码以替换自身。

        3
  •  6
  •   eemz    14 年前

    对于第一个版本来说,这只是个问题。一旦我让1.0版的编译器运行起来,我就可以用我的语言编写2.0版,并使用1.0版的编译器来编译它。然后我可以编写v3.0并使用v2.0来编译它,使用v3.0来编译v4.0等等。

        4
  •  1
  •   Lazarus    14 年前

    编译器的第一遍通常是用其他语言编写的,直到语言的格式足够好,能够编译它自己的编译器为止,然后就可以进入到x中了,它是用x编写的。

        5
  •  1
  •   ShinTakezou    14 年前

    一开始,这种语言真正的第一个编译器,当然不是用那种语言写的。第二个可以用那种语言写。此外,给定一种语言的规范,您可以在引导编译器中实现一个基本核心,然后使用“引导”编译器理解的子集用该语言编写完全兼容的编译器。第二代编译器也可以忘记“引导”编译器。

        6
  •  1
  •   Michael Borgwardt    14 年前

    在某种程度上,您需要一个用不同语言编写的编译器(或解释器)。但它不需要高效,可以用一种使解析和原型化变得容易的语言来完成(Lisp很流行)。一旦您使用它来编译“自编译器”,就可以放弃它并使用结果。