编译器如何编译编译器?

问题描述 投票:0回答:5

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

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

compiler-construction low-level machine-code
5个回答
17
投票

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

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

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

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

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


10
投票

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

那要如何开始呢? 过去,人们只是将原始数字填充到内存中,然后由 CPU 直接解释。这就是为什么源代码通常被称为“代码”。 一旦以这种方式对最小编译器进行了编程,就可以执行它来创建用它编译的语言编写的另一个编译器。 这又可以用来创建更高级别的级别等等。 事实上,将原始指令代码填充到内存本身可以被视为零级编译过程,其中人类是编译器。

给定语言的编译器是用同一种语言编写的,这是很常见的。例如,C 编程语言就是这种情况。这在某种程度上不仅仅是巧合,因为谁对一种语言足够了解,敢于为其编写编译器,那么他很可能会将该语言列为他最喜欢用于编程的语言之一。 但这只是一个典型案例,没有必要,因为有很多语言可供选择,包括特别适合编译器构建的语言。


6
投票

例如,来自您引用的维基文章:

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”——反之亦然。


2
投票
电子门


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.