编译器如何编译编译器



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

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

通常,编译器作者采用两种途径之一:

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

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

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

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

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

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

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

一种给定语言的编译器通常是用同一种语言编写的。例如,C编程语言就是这样。这在某种程度上不仅仅是巧合,因为谁知道一种足够好的语言,敢于为它编写编译器,谁可能会把这种语言作为他最喜欢的编程语言之一。不过,这只是一个典型的例子,没有必要,因为有很多语言可供选择,包括那些特别适合编译器构建的语言。

数值机器代码是二进制的。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",反之亦然。

数控机床代码表示电路的一系列关断和接通状态,是所有电子数据处于最低级别的状态。这种低级语言没有"编译器",相反,计算机中的电路是以这样一种方式组合和结构化的,即通过读取由高或低电状态实现的代码中的开和关来"解释"它们。无论如何,这些高电平或低电平状态导致不同的门/电路打开或关闭,通常表现不同。查看更多关于电子门的信息。

最新更新