编译器如何编译编译器?

时间:2013-07-11 20:10:50

标签: compiler-construction low-level machine-code

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

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

4 个答案:

答案 0 :(得分:11)

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

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

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

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

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

答案 1 :(得分:7)

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

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

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

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

答案 2 :(得分:6)

数字机器代码是二进制的。 1s和0s。编译意味着将它缩减为一些更低级的形式,因此它并没有真正编译。

例如,您引用的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” - 反之亦然。

答案 3 :(得分:2)

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