2013-07-11 252 views
4

来自高层次的编程背景,我有兴趣了解低级编程。我想知道编译器是如何编译的?编译器如何编译编译器?

看过wiki中的一些文章后,Numerical machine code被认为是最低级的语言,但必须有编译器才能编译此机器码。编译器编写的语言是什么?

+1

机器码不需要编译。它直接由CPU执行。您可以使用十六进制编辑器输入它。 – Blorgbeard

+0

从文章第二段 – wtsang02

+1

中可以看出,数字机器代码(即非汇编代码)可以被认为是编译和/或汇编的计算机程序的最低级别表示。是,*最低级别* - 没有低等级。这是什么其他语言编译*为*! – Blorgbeard

回答

9

通常情况下,编译器作者们两条路线之一:

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

  • 在一些其他语言中编写足够的代码以拥有最低限度可用的翻译程序,并使用该“脚手架”作为编译程序本身编译时所用语言的基础。这更复杂,通常需要更长时间,但通过在真实项目中测试语言,内在地提供了清除语言错误和弱点的机会。

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

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

6

数值的机器代码是二进制的。 1s和0s。编译意味着将其减少到一些更低的形式,所以它不是真正编译的。

例如,从维基文章你报: 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”编译 - 反之亦然。

7

您可以随时使用自己喜欢的编译器来写另一个编译器,说B.在这家B你添加了一些额外的功能,所以它很容易成为你最喜欢的一个,你会用它来编写编译C,.. 。

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

事实上填充原始指令代码到存储器本身可被视为一个零电平的编译过程,其中所述人类是编译器。

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

2

数控机床代码表示一系列断和状态的电路是所有电子数据是在最低水平的东西。 对于这种低级语言,每个人都没有“编译器”,而是将计算机中的电路组合起来并以这样的方式构建,即通过读取由高或低电状态实现的代码中的开启和关闭来“解释”它们。无论如何,这些高或低级别的状态会导致不同的门/电路打开或关闭,一般情况会有所不同。 查看更多关于Electronic Gates