wts*_*g02 6 compiler-construction machine-code low-level
来自高级编程背景,我有兴趣学习低级编程.我想知道如何编译编译器?
在查看wiki中的一些文章后,数字机器代码被认为是最低级语言,但必须有一个编译器来编译这个机器代码.编写的编译器是什么语言?
cHa*_*Hao 13
通常,编译器作者会选择以下两种方法之一:
用其他现有语言编写整个编译器.这通常是最简单的选择.
用其他语言编写足够的代码以使其具有最低限度可用的转换器,并使用"scaffolding"作为基础,以编译的语言编写适当的编译器.这更复杂,通常需要更长时间,但通过在实际项目中测试语言,本质上提供了清除语言错误和弱点的机会.
第一个翻译代码的程序至少部分写在机器代码中 - 实际的数字告诉CPU要做什么.这是最低级别,因为机器代码*实际上没有"编译器" ; 它只是以某种方式排列的数字,并且CPU内部有电路可以在没有外界帮助的情况下处理它们.
*有些程序可以帮助设计解释和执行指令的硬件,但这可能超出了编译器的定义范围.这些程序生成硬件描述 - 电路图等 - 而不是编译器输出的直接可执行文件.
你可以随时使用自己喜欢的编译器A来编写另一个编译器,比如说B.在这个B中你添加了一些额外的功能,所以它很容易成为你最喜欢的一个,你将用它来编写编译器C,...
怎么开始呢?在过去,人们只需要用CPU直接解释的原始数字填充内存.这就是源通常被称为代码的原因.一旦最小编译器以这种方式编程,就可以执行它来创建另一个用它编译的语言编写的编译器.这又可以用于创建更高级别的等等.
事实上,将原始指令代码填充到内存本身可以被视为零级编译过程,其中人是编译器.
通常,给定语言的编译器使用相同的语言编写.例如,C编程语言就是这种情况.这有点不过巧合,因为谁知道一种语言足够好,敢于为它编写编译器,可能在他最喜欢的语言中使用这种语言来编程.这只是一个典型的案例,但没有必要,因为有很多语言可供选择,包括特别适合编译器构造的语言.
数字机器代码是二进制的.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" - 反之亦然.
归档时间: |
|
查看次数: |
6554 次 |
最近记录: |