Compiler construction 编译成机器代码的编译器是否需要在汇编中编写?

Compiler construction 编译成机器代码的编译器是否需要在汇编中编写?,compiler-construction,programming-languages,low-level,machine-code,Compiler Construction,Programming Languages,Low Level,Machine Code,不包括将一种高级语言转换为另一种语言的编译器,任何编译成机器代码的编译器都需要用汇编语言编写吗?编译器的源代码不需要用汇编语言编写。例如,CPython编译器(技术上是解释器)的(很好的一部分)是用C编写的: 在一开始,在编译器出现之前,第一个编译器必须用汇编语言编写。但是后来有人用这个编译器来编译他们自己的编译器。然后其他人使用这个编译器来编译他们自己的编译器。等等等等 这就提出了“自举”的概念。引导编译器是用它打算编译的语言编写的编译器。CLAN编译器可以编译C++代码,但是编译器本身是用

不包括将一种高级语言转换为另一种语言的编译器,任何编译成机器代码的编译器都需要用汇编语言编写吗?

编译器的源代码不需要用汇编语言编写。例如,CPython编译器(技术上是解释器)的(很好的一部分)是用C编写的:

在一开始,在编译器出现之前,第一个编译器必须用汇编语言编写。但是后来有人用这个编译器来编译他们自己的编译器。然后其他人使用这个编译器来编译他们自己的编译器。等等等等


这就提出了“自举”的概念。引导编译器是用它打算编译的语言编写的编译器。CLAN编译器可以编译C++代码,但是编译器本身是用C++编写的!这是怎么回事?第一个clang编译器是由另一个编译器编译的(可能是g++)。当clang编译器足够成熟后,它就能够编译自己的代码了。现在,对clang编译器所做的任何更改都可以由clang编译器重新编译到另一个clang编译器中!整洁,是吗?

编译器不是一个特殊的、神奇的程序。如果你斜视它,编译器只是一个程序,它将一个文本文件转换成另一个文本文件(好的,是二进制文件)


关于程序可以用什么语言实现,只有一个限制。如果您正在用一种语言编写程序,那么该语言必须已经实现了编译器或解释器。因此,语言X的第一个编译器/解释器不能用X编写(至少如果您希望能够使用它的话),但这对编译器/解释器来说并不特殊;除非有人实现了X,否则你不能用X写任何有用的东西。

不,你认为为什么需要这样做?制造汽车的机器人必须用汽车制造吗?不可以。许多语言都可以编写包含位的文件。任何可以写入内存或包含位的文件的语言都可以用来生成机器代码(只是内存或文件中的一些位)。以tiny cc为例,它是直接编译机器代码的一个例子。我以前听说过这种事情,但我还没有上过编译器课程。我一直认为有些编译器可以自己编译是非常有趣的(目前还令人困惑)。我仍在寻找一门好的编译器构造入门课程。谢谢你的回答。编译是一种乐趣。如果你找不到一门编译器课程,我仍然建议你拿起一本书来玩玩。背景中有太多的事情在快速而安静地进行着,我们认为这是理所当然的。