这个问题一直困扰着我。 要编译一个程序,你需要一个编译器,它也是一种程序,那么编译编译器的是什么? 有人告诉我,第一批编译器是用汇编或机器代码编写的。 但考虑到这一点,那仍然不是完整的故事。毕竟,如果没有操作系统和驱动程序,机器代码如何从硬盘驱动器转移到CPU?司机必须以某种方式编程。
我知道早期的计算机有开关,允许你翻转开关以指示位。我想知道如何从开关跳转到让CPU读取机器代码的方式,而无需计算机程序告诉它这样做。
答案 0 :(得分:9)
简短的回答:第一个程序是用原始机器代码精心编写的,所有内容都是从那里构建的。
这个想法被称为bootstrapping。假设您有一台带有处理器,一些闪存和硬盘的裸机。通常,处理器在上电时配置为从非易失性存储器(例如,CMOS或闪存)中的固定位置加载称为引导加载程序的简单操作系统。这个操作系统非常简单,并且具有足够的功能,可以将计算机指向真实操作系统所在磁盘上的位置。然后,该操作系统可以打开越来越多的设备并加载越来越复杂的程序,直到最终整个操作系统启动并运行。
但是这个引导加载程序是什么写的?最初,这些是用原始机器代码编写的,并硬编码到机器中。它运行的程序也将用机器代码编写,这将是令人难以置信的缓慢和乏味的工作。最终,有人在机器代码中编写了第一个简单的汇编程序。有了这个汇编程序,就可以开始在程序集中编写程序,包括汇编程序本身。事实上,一旦你有一个简单的汇编程序,你就再也不需要编写机器代码了。你可以继续在汇编中编写汇编程序!
从这一点开始,您可以通过首先使用现有工具(例如汇编程序)编写编译器来构建更复杂的编程语言,以获得足够的可用功能,以便编译器可以进行基本编程。然后,您使用该编译器为编程语言本身编写编译器,并使用相同的技巧来构建您以前的工作,以获得更大更酷的东西。这种技术至今仍在使用 - 大多数编译器都是用他们编译的语言编写的。
总而言之,在过去的某些可怕的时刻,一切都必须手工完成,但多亏了这样做的人们的辛勤工作,我们可以建立已经存在的东西。
答案 1 :(得分:5)
在微电脑行业的早期,我们不得不使用拨动开关直接输入机器代码。这与第一批非硬编码程序计算机的完成方式非常相似。
有关早期Altair机器的详细信息,请参阅here。基本上,您为地址和数据设置二进制开关,然后使用命令开关将其写入内存。是的,一次一个字节。当时我们是“真正的男人”: - )
来自同一网站的是用于输入示例程序的detailed process。
您还应该记住,您不必为机器X上的 机器X编译程序。一旦机器达到一定程度的复杂程度(例如,机器Y可以如果没有在程序中切换,你可以使用交叉汇编程序和交叉编译器来实际为机器X创建机器语言。
然后你只需要一种方法将该程序的二进制图像转换为机器X.这并不总是很容易,但它比翻转更容易看到。
答案 2 :(得分:0)
曾几何时间使用计算机,您输入二进制的机器代码。人们厌倦了这样做,所以他们制作了一个程序(带有机器码),可以读取汇编。过了一会儿,他们意识到组装中的写作很糟糕,所以他们使用汇编来制作FORTRAN等高级语言。
要了解完整的故事,请加入大学并参加一些CS或COMPE课程。