Compiler construction 编译编译器

Compiler construction 编译编译器,compiler-construction,Compiler Construction,可能重复: 编译器本身是用高级语言编写的。那么计算机是如何理解编译器的呢?它们将HLL转换为机器级代码,但是计算机如何理解它们本身呢?一个编译器是用机器代码编写的。其余的可以只使用它或其他已经编译的编译器(包括它自己的未来版本,它可以使用已经存在的版本来重新编译新版本) p.S.请注意,大多数编译器不会将“高级代码”编译成机器代码,它们有两个组件和。前端将代码编译为中间语言,后端将中间语言编译为机器代码 这确保了如果您有n语言和m体系结构,那么您只需要n+m组件,而不需要n*m,如果您的每种语

可能重复:


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

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

p.S.请注意,大多数编译器不会将“高级代码”编译成机器代码,它们有两个组件和。前端将代码编译为中间语言,后端将中间语言编译为机器代码


这确保了如果您有
n
语言和
m
体系结构,那么您只需要
n+m
组件,而不需要
n*m
,如果您的每种语言/每台机器都有一个编译器,则需要用汇编代码编写一个版本。然后,您可以使用此编译器编译其他程序,包括其他编译器


然而,一篇有趣的论文/观察是编译人员可以学习的。也就是说,您可以删除部分源代码,但仍然保留功能;)一个例子是解析
\n
字符。下面的文章很好地说明了这一点

编译器对于语言X,用编写的语言Y(X和Y可能是,也可能不是同一种语言)必须用语言Y的编译器编译成机器代码(或者,如果要解释Y,则编译器必须由Y解释器执行)。真的,这是没有办法的。除非Y是装配体。i、 你在汇编中编写X编译器

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

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

  • 然后,用X编写X编译器,并用Y语言编写的X编译器(即步骤1中编写的编译器)进行编译

  • 如果新的X编译器足够完整,它应该能够编译自身的副本(因为它们毕竟是X源代码)


  • 这叫做。

    例如,您可以从一个用汇编语言编写的编译器开始。一个编译器是用机器代码编写的。其余的可以使用它(包括它自己的未来版本,可以使用它来重新编译新版本)。“这有一个术语,但我忘了它是什么了。@MikeChristensen Bootstrapping.@delnan-啊,就是它.”。。或者自托管编译器虽然前端/后端分离对于实际编译器构造确实至关重要,但我不认为OP的措辞与此相矛盾:编译器作为一个整体包,确实从一种语言转换到另一种语言。IRs只在你把野兽掏出来并查看其内部结构时才起作用。它不需要是汇编程序。它可能是另一种现有的语言。是的,它是“第一个编译器”。