编译器如何编译另一个编译器?

12

作为一个高级编程背景的人,我对学习低级编程很感兴趣。我想知道编译器是如何编译的?

在查看了一些维基百科文章后,数值机器码被认为是最低级别的语言,但是必须有编译器来编译这个机器码。那么编写这个编译器的语言是什么呢?


2
机器码不需要编译。它直接由CPU执行。您可以使用十六进制编辑器输入它。 - Blorgbeard
数值机器码(即非汇编代码)可以被视为编译和/或汇编计算机程序的最低级别表示。 - wtsang02
1
是的,这是最底层 - 没有更低的层次了。其他语言都是编译成它! - Blorgbeard
1
您的报价指出,数字机器码是程序编译的结果。没有编译器以机器码作为输入。 - Blorgbeard
当然有一个编译器可以编译机器码:指令解码器。在现代CPU(特别是x86系列)中,解码器可能非常复杂,它将指令分解成微指令序列,然后进行分析(以获取依赖关系和潜在危险),并发放到不同的执行单元中。 - SK-logic
引导启动 - gonidelis
4个回答

17

通常,编译器的作者会采取以下两种方式之一:

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

  • 只需在其他语言中编写足够少的代码,以拥有最小可用的翻译器,并将其“脚手架”作为在所需编译的语言中编写编译器的基础。这样做更加复杂,通常需要更长时间,但固有地提供了通过在实际项目中测试语言来排除语言错误和弱点的机会。

第一个将代码翻译成程序的程序至少部分是用机器码编写的——实际告诉CPU该做什么的数字。 这是最低层次的,因为实际上并没有针对机器码的“编译器”;它只是按一定方式排列的数字,CPU内部有电路可以处理它们而不需要外部帮助。

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


10

你可以使用你喜欢的编译器A来写另一个编译器B。在这个B中,你添加了一些额外的功能,所以它很容易成为你最喜欢的编译器,并且你将使用它来编写编译器C...

那么该如何开始呢? 在旧日里,人们简单地用原始数字填充内存,直接由CPU进行解释。这就是为什么源代码常被称为代码。 一旦以这种方式编程了一个最小的编译器,它就可以执行以创建用它所编译语言编写的另一个编译器。 然后,它可以用于创建更高级别的编译器,依此类推。

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

通常情况下,给定语言的编译器是用同一种语言编写的。例如,这就是C编程语言的情况。这有点超出巧合,因为谁知道足够好的语言敢于为其编写编译器,很可能在他最喜欢的编程语言中之一中使用这种语言。 虽然这只是一种典型情况,但并不一定如此,因为有许多语言可以选择,包括专门用于编译器构建的语言。


6
数字机器代码是二进制的,由1和0组成。编译意味着将其缩小到一些更低的形式,因此它不是真正的编译。
例如,从您引用的维基文章中: “例如,在Zilog Z80处理器上,机器代码00000101会导致CPU减少B处理器寄存器,它在汇编语言中表示为DEC B。”
因此,在编写Z80汇编语言时,您需要一个编译器,并且指令DEC B将被编译为“00000101”,而不是相反。

2
数字机器代码代表电路中的开和关状态,是所有电子数据在最低层次上的表示方式。这种低级语言没有所谓的“编译器”,而是通过计算机中的电路以一种特定的方式组合和构造,通过读取代码中的开和关状态来“解释”它们。无论如何,这些高或低电平状态会导致不同的门/电路打开或关闭,并且通常会表现出不同的行为。
了解更多信息,请访问电子门

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接