作为一个高级编程背景的人,我对学习低级编程很感兴趣。我想知道编译器是如何编译的?
在查看了一些维基百科文章后,数值机器码被认为是最低级别的语言,但是必须有编译器来编译这个机器码。那么编写这个编译器的语言是什么呢?
作为一个高级编程背景的人,我对学习低级编程很感兴趣。我想知道编译器是如何编译的?
在查看了一些维基百科文章后,数值机器码被认为是最低级别的语言,但是必须有编译器来编译这个机器码。那么编写这个编译器的语言是什么呢?
通常,编译器的作者会采取以下两种方式之一:
用其他现有语言编写整个编译器。这通常是最简单的选项。
只需在其他语言中编写足够少的代码,以拥有最小可用的翻译器,并将其“脚手架”作为在所需编译的语言中编写编译器的基础。这样做更加复杂,通常需要更长时间,但固有地提供了通过在实际项目中测试语言来排除语言错误和弱点的机会。
第一个将代码翻译成程序的程序至少部分是用机器码编写的——实际告诉CPU该做什么的数字。 这是最低层次的,因为实际上并没有针对机器码的“编译器”;它只是按一定方式排列的数字,CPU内部有电路可以处理它们而不需要外部帮助。
*虽然有程序帮助设计解释和执行指令的硬件,但这可以说超出了编译器的定义。这样的程序生成硬件描述——电路图之类的——而不是编译器输出的直接可执行文件。
你可以使用你喜欢的编译器A来写另一个编译器B。在这个B中,你添加了一些额外的功能,所以它很容易成为你最喜欢的编译器,并且你将使用它来编写编译器C...
那么该如何开始呢? 在旧日里,人们简单地用原始数字填充内存,直接由CPU进行解释。这就是为什么源代码常被称为代码。 一旦以这种方式编程了一个最小的编译器,它就可以执行以创建用它所编译语言编写的另一个编译器。 然后,它可以用于创建更高级别的编译器,依此类推。
事实上,将原始指令代码填充到内存中本身就可以被视为零级编译过程,其中人是编译器。
通常情况下,给定语言的编译器是用同一种语言编写的。例如,这就是C编程语言的情况。这有点超出巧合,因为谁知道足够好的语言敢于为其编写编译器,很可能在他最喜欢的编程语言中之一中使用这种语言。 虽然这只是一种典型情况,但并不一定如此,因为有许多语言可以选择,包括专门用于编译器构建的语言。