Compiler construction 编译器如何编译编译器?

Compiler construction 编译器如何编译编译器?,compiler-construction,low-level,machine-code,Compiler Construction,Low Level,Machine Code,我来自高级编程背景,对学习低级编程很感兴趣。我想知道编译器是如何编译的 在看过wiki中的一些文章后,它被认为是最低级别的语言,但必须有一个编译器来编译这个机器代码。编译器是用什么语言编写的?数字机器码是二进制的。1和0。编译意味着将它简化为某种更低的形式,因此它不是真正编译的 例如,从您引用的wiki文章中: 例如,在Zilog Z80处理器上,导致CPU减少B处理器寄存器的机器代码00000101将用汇编语言表示为DEC B。 因此,在编写Z80汇编语言时,您会有一个编译器,指令DEC B将

我来自高级编程背景,对学习低级编程很感兴趣。我想知道编译器是如何编译的


在看过wiki中的一些文章后,它被认为是最低级别的语言,但必须有一个编译器来编译这个机器代码。编译器是用什么语言编写的?

数字机器码是二进制的。1和0。编译意味着将它简化为某种更低的形式,因此它不是真正编译的

例如,从您引用的wiki文章中:
例如,在Zilog Z80处理器上,导致CPU减少B处理器寄存器的机器代码00000101将用汇编语言表示为DEC B。


因此,在编写Z80汇编语言时,您会有一个编译器,指令DEC B将被编译成“00000101”——反之亦然。

您始终可以使用您最喜欢的编译器a编写另一个编译器,例如B。在此B中,您添加了一些额外的功能,因此它可以很容易地成为您最喜欢的编译器,您将使用它来编写编译器C

那怎么开始呢? 在过去,人们只是用原始数字填充内存,由CPU直接解释。这就是为什么源代码通常被称为代码。 一旦一个最小编译器以这种方式编程,就可以执行它来创建另一个用它编译的语言编写的编译器。 这同样可以用来创建一个更高的级别,等等

事实上,将原始指令代码填充到内存本身可以被视为一个零级编译过程,其中人就是编译器

一种给定语言的编译器通常是用同一种语言编写的。例如,C编程语言就是这样。这比coincideal要复杂得多,因为谁知道一种语言足够好,敢为它编写编译器,他很可能会把这种语言作为自己最喜欢的编程语言之一。
这只是一个典型的例子,没有必要,因为有许多语言可供选择,包括那些特别适合编译器构造的语言。

数字机器代码代表电路的一系列开关状态,是所有电子数据的最低级别。 这种低级语言没有“编译器”,相反,计算机中的电路是以这样一种方式组合和构造的,即通过读取由高或低电状态实现的代码中的开和关来“解释”它们。总之,这些高电平或低电平状态导致不同的门/电路打开或关闭,通常表现不同。
查看更多信息。

通常,编译器作者会选择以下两种方法之一:

  • 用其他现有语言编写整个编译器。这通常是最简单的选择

  • 用其他语言编写足够的代码,以获得一个可用性最低的翻译器,并使用该“脚手架”作为基础,以它打算编译的语言编写编译器。这更复杂,通常需要更长的时间,但本质上提供了通过在实际项目中测试语言来清除语言错误和弱点的机会

第一个翻译代码的程序至少部分是用机器代码编写的,机器代码是告诉CPU该做什么的实际数字。这是最低级别,因为没有真正的机器代码“编译器”;它只是以某种方式排列的数字,CPU内部有电路可以在没有外部帮助的情况下处理它们


*有一些程序可以帮助设计解释和执行指令的硬件,但可以说这超出了编译器的定义。这些程序生成硬件描述——电路图等,而不是编译器输出的直接可执行文件。

机器代码不需要编译。它由CPU直接执行。您可以使用十六进制编辑器输入。
数字机器代码(即非汇编代码)可被视为已编译和/或已编译计算机程序的最低级别表示形式。
,如文章第2段所述。是的,最低级别-没有较低级别。这就是其他语言的编译目的!你的话是说数字机器代码是程序编译的结果。没有以机器代码作为输入的编译器。是的,当然有一个编译器可以编译机器代码:指令解码器。在现代CPU(尤其是x86系列)中,解码器可能非常复杂,它将指令分解为微指令序列,然后对其进行分析(以获得相关性和潜在危险),并发布到不同的执行单元。