10

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

看了wiki上的一些文章,据说数字机器码是最低级的语言,但是必须有一个编译器来编译这个机器码。该编译器是用什么语言编写的?

4

4 回答 4

15

通常,编译器作者采用以下两种方法之一:

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

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

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

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

于 2013-07-11T20:25:45.547 回答
9

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

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

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

给定语言的编译器通常是用相同的语言编写的。例如,C 编程语言就是这种情况。这有点巧合,因为谁知道一种语言足够好,敢为它编写编译器,很可能在他最喜欢的语言中使用这种语言进行编程。虽然这只是一个典型案例,但没有必要,因为有很多语言可供选择,包括特别适合编译器构建的语言。

于 2013-07-11T20:17:34.733 回答
6

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

例如,从您引用的 wiki 文章中: For example, on the Zilog Z80 processor, the machine code 00000101, which causes the CPU to decrement the B processor register, would be represented in assembly language as DEC B.

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

于 2013-07-11T20:16:47.897 回答
2

数字机器码代表电路的一系列关闭和开启状态,是所有电子数据的最低级别。对于这种低级语言,没有“编译器”,而是将计算机中的电路组合和结构化,以便通过读取由高或低电状态实现的代码中的通断来“解释”它们。无论如何,这些高电平或低电平状态会导致不同的门/电路打开或关闭,通常表现不同。查看更多关于电子门的信息。

于 2013-07-11T20:21:32.370 回答