简短的回答:第一个程序是用原始机器代码精心编写的,一切都是从那里构建的。
这个想法被称为引导。假设您有一台带有处理器、一些闪存和硬盘的裸机。通常,处理器在上电时配置为从非易失性存储器(例如 CMOS 或闪存)中的固定位置加载称为引导加载程序的简单操作系统。这个操作系统非常简单,并且有足够的功能将计算机指向磁盘上真正操作系统所在的位置。然后这个操作系统可以打开越来越多的设备并加载越来越复杂的程序,直到最终整个操作系统启动并运行。
但是这个引导加载程序是用什么写的?最初,这些是用原始机器代码编写的,然后硬编码到机器中。它将运行的程序也将用机器代码编写,这将是令人难以置信的缓慢和乏味的工作。最终,有人用机器代码编写了第一个简单的汇编程序。一旦你有了这个汇编器,你就可以开始用汇编编写程序,包括汇编器本身。事实上,一旦你有了一个简单的汇编器,你就再也不需要编写机器代码了。您可以继续在汇编中编写汇编程序!
从这一点开始,您可以通过首先使用现有工具(例如汇编程序)编写编译器来构建更复杂的编程语言,以获得足够的可用功能,以便编译器可以进行基本编程。然后,您使用该编译器为编程语言本身编写编译器,并使用相同的技巧来构建您之前的工作,以获得更大、更酷的东西。这种技术今天仍在使用 - 大多数编译器都是用它们编译成的语言编写的。
总而言之,在过去的某个糟糕的时刻,所有事情都必须手工完成,但是感谢这样做的人的辛勤工作,我们可以在已有的基础上再接再厉。