15

可能重复:
第一个编译器是如何编写的?

这个问题一直困扰着我。编译一个程序,需要一个编译器,它也是程序的一种类型,那么编译器是用什么编译的呢?有人告诉我,第一个编译器是用汇编或机器代码编写的。但考虑到这一点,这仍然不是完整的故事。毕竟,在没有操作系统和驱动程序的情况下,机器代码是如何从硬盘驱动器到 RAM 再到 CPU 的呢?驱动程序必须以某种方式进行编程。

我知道非常早期的计算机有开关,并允许您拨动开关以指示位。我想知道如何从切换到让 CPU 读取机器代码而不需要计算机程序来告诉它这样做的方式实现了飞跃。

4

3 回答 3

16

简短的回答:第一个程序是用原始机器代码精心编写的,一切都是从那里构建的。

这个想法被称为引导。假设您有一台带有处理器、一些闪存和硬盘的裸机。通常,处理器在上电时配置为从非易失性存储器(例如 CMOS 或闪存)中的固定位置加载称为引导加载程序的简单操作系统。这个操作系统非常简单,并且有足够的功能将计算机指向磁盘上真正操作系统所在的位置。然后这个操作系统可以打开越来越多的设备并加载越来越复杂的程序,直到最终整个操作系统启动并运行。

但是这个引导加载程序是用什么写的?最初,这些是用原始机器代码编写的,然后硬编码到机器中。它将运行的程序也将用机器代码编写,这将是令人难以置信的缓慢和乏味的工作。最终,有人用机器代码编写了第一个简单的汇编程序。一旦你有了这个汇编器,你就可以开始用汇编编写程序,包括汇编器本身。事实上,一旦你有了一个简单的汇编器,你就再也不需要编写机器代码了。您可以继续在汇编中编写汇编程序!

从这一点开始,您可以通过首先使用现有工具(例如汇编程序)编写编译器来构建更复杂的编程语言,以获得足够的可用功能,以便编译器可以进行基本编程。然后,您使用该编译器为编程语言本身编写编译器,并使用相同的技巧来构建您之前的工作,以获得更大、更酷的东西。这种技术今天仍在使用 - 大多数编译器都是用它们编译成的语言编写的。

总而言之,在过去的某个糟糕的时刻,所有事情都必须手工完成,但是感谢这样做的人的辛勤工作,我们可以在已有的基础上再接再厉。

于 2011-01-23T07:42:55.767 回答
6

在微型计算机行业的早期,我们不得不费力地使用拨动开关直接输入机器代码。这与第一台非硬编码程序计算机的完成方式非常相似。

有关早期 Altair 机器的详细信息,请参见此处。基本上,您为地址和数据设置二进制开关,然后使用命令开关将其写入内存。是的,一次一个字节。那时我们是“真正的男人”:-)

来自同一站点的是用于输入示例程序的详细过程。

您还应该记住,您实际上不必在机器 X 上为机器 X 编译程序一旦机器达到一定的复杂程度(例如,机器 Y 可以在不切换程序的情况下运行),您可以使用交叉汇编器和交叉编译器为机器 X 实际创建机器语言。

然后,您只需要一种方法将该程序的二进制映像输入到机器 X 中。这并不总是那么容易,但它比切换开关更容易。

于 2011-01-23T08:22:00.823 回答
0

曾几何时,您使用计算机输入二进制的机器代码。人们厌倦了这样做,所以他们制作了一个可以读取汇编的程序(带有机器代码)。过了一段时间,他们意识到用汇编编写很糟糕,所以他们使用汇编来制作高级语言,例如 FORTRAN。

要获得完整的故事,请进入大学并参加一些 CS 或 COMPE 课程。

于 2011-01-23T07:42:19.417 回答