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