首页 > 解决方案 > 第一种语言是如何编译的

问题描述

这是一个先有鸡还是先有蛋的问题。为语言 X 引导编译器的一种解决方案是使用语言 Y,但是如何必须首先编译语言 Y 的编译器?!如果你一直追溯到没有编译器存在的时候,那么第一个编译器是如何能够编译自己的呢?请使用高级隐喻来帮助理解。

标签: compiler-constructionbootstrapping

解决方案


让我们认为任何非 C 的高级语言的编译器都可以用 C 1编写

所以我们不妨问:如果我有一台计算机,但没有编译器,我想要一个 C 编译器,我怎么做?

你可以用你的计算机的汇编语言编写一个 C 编译器 ,假设你有那个计算机的汇编器

在实践中,这将是非常困难的。更明智的做法是,用汇编代码编写一个比汇编程序更具表现力和功能的中间语言编译器,然后用它来编写一个更具表现力和功能的编译器……直到你编写了一个 C 编译器。

您的每一个功能越来越强大的编译器都是一个程序,它将其源语言(您作为发明者已经定义)翻译成您计算机的汇编语言,然后调用汇编器(您已经拥有)来翻译汇编代码转换成您的计算机的机器代码2

如果你连汇编程序都没有怎么办?

然后你必须在你的计算机的机器代码中编写一个汇编程序。用机器代码从头开始编写一个复杂的程序可能是目前还活着的人没有能力去做的事情。但是在任何人用机器代码编写汇编程序之前,所有程序都必须用机器代码编写。第一个组装机是在1940 年代后期开发的。与你的编译器一样,你最好迭代地开发你的汇编器:首先是一个基本的,用机器代码编写的;下一个更强大的,用基本的写...

计算机的机器代码是 CPU 的本机语言,因此无需进一步翻译即可将其转换为可执行代码。您只需以某种方式将组成机器代码程序的字节加载到内存区域中,并让处理器在初始地址加载指令:然后计算机正在运行程序。

第一个 C 编译器的创建与上面所描绘的差不多。C 语言的发展是该语言 的发明者丹尼斯·里奇 ( Dennis Ritchie ) 所记录的历史


[1] 当然,从历史上看,几个主要的高级语言编译器早于C,~1969-73

[2] 对于现代编译器来说,这是一个很大的简化。阅读有关中间表示 并查看,例如GCC 的概念结构


推荐阅读