可能重复:
Bootstrapping a language
编译器本身是用高级语言编写的。那么计算机如何理解编译器呢?他们将HLL转换为机器级代码,但它们如何被计算机理解?
答案 0 :(得分:3)
一个编译器是用机器代码编写的。其余的可以使用它或其他已编译的编译器(包括其自身的未来版本,可以使用现有版本重新编译新版本。)
P.S。请注意,大多数编译器都不会将“高级代码”编译为机器代码,它们有2个组件front-end和back-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 的编译器,那么您可以这样做这样:
您使用另一种语言编写 X 语言的编译器,例如 Y ,编译器已经存在(或在汇编中)
然后在 X 中编写 X 编译器,并使用语言 Y编写的 X 编译器进行编译(您在步骤1中写的那个)。
如果新的 X 编译器足够完整,它应该能够编译自己的副本(因为它们毕竟是 X 源)。 / p>
这称为bootstrapping。