第一个编译器是如何编写的?

我听说了鸡和蛋的事还有自力更生,我有几个问题。

是什么编写了第一个把某些东西转换成二进制指令的编译器?

汇编是被编译还是被翻译成二进制指令?

我很难相信他们用二进制写了一个编译器。

54486 次浏览

最初的程序是用机器代码(而不是汇编语言)编写的——使用开关将实际数字插入计算机内存。我们已经走了很长的路..。

有时候,这种情况仍然发生在很小的范围内——修补一小段代码或者创建 thunk。我记得在 Basic 字符串中输入数字,然后在早期的微程序中作为小的、快速的子程序执行。我还记得在 PDP-11的前面板上切换开关,将一个引导装载程序输入到大学课程的内存中。

这些程序有时会被用来处理文本文件以创建其他程序,瞧,编程语言就这样诞生了。

请阅读有关 编译器自举编译器编写的历史的资料

这个想法是用机器代码直接编写一个非常简单的编译器,用它来编写一个更复杂的编译器,用第二个编译器来构建第三个编译器,以此类推,直到你拥有一个功能齐全的编译器。

汇编指令(通常)是直接映射到操作码的,操作码是可以由处理器直接解释的机器码的(多)字节值。直接用操作码编写程序是很有可能的,只需要从一个表(例如 这个是6039微处理器的)中查找操作码,表中列出了与操作码匹配的汇编指令,然后手动确定跳转之类的内存地址/偏移量。

第一个程序正是用这种时尚的手写操作码完成的。

然而,大多数情况下,使用汇编程序来“编译”汇编代码更为简单,汇编代码会自动执行这些操作码查找,并且有助于计算命名跳转标签的地址/偏移量等等。

第一个汇编程序是手写的。然后,这些汇编程序可用于组装更复杂的汇编程序,再用于组装为高级语言编写的汇编程序,等等。这个迭代编写工具以简化下一组工具创建的过程称为 自力更生(正如 David Rabinowitz 在他的回答中提到的)。

是什么编写了第一个把某些东西转换成二进制指令的编译器?

是人类干的,看看 A-0系统:

1952年,Grace Hopper 完成了她的第一个 Sperry 编译器,也就是众所周知的 A-0。A-0系统是一套指令,可以将符号数学代码翻译成机器语言。在制作 A-0的过程中,她把多年来收集的所有子程序都录了下来。每个程序都有一个电话号码,这样机器就可以在磁带上找到它。“我所要做的就是写下一组电话号码,让电脑在磁带上找到它们,把它们带过来,然后做加法。这是第一个编译器。”。

沃兹在他的一次公开演讲中说,当他开始编译的时候,他买不起编译器,所以他手工在纸上编译成二进制文件。如果你想看到一些更狂野的东西,阅读 比尔 · 盖茨和保罗 · 艾伦为牵牛星8800编写了 BASIC 语言。的条件

关于“用二进制写一台计算机”——从程序员的角度退后一步,想想早期的计算机是什么。高层次的东西还不存在——你在低层次思考一切,因为那就是全部。你的硬件可以做基本的逻辑和算术,你通过机器代码操作(这只是编译汇编—— Amber 解释了为什么这部分不难手工完成) ,你希望这个硬件执行某些数学功能。您并不担心不存在的操作系统,您只是告诉硬件(在汇编中)如何操作您输入的数字。只是个大计算器。今天的计算机是一次建立一个抽象。

如果你想打破这个障碍,让计算机感觉像魔术,我强烈建议阅读 代码作者: Charles Petzold和/或 计算系统要素。只要掌握了编程的基本知识,这些非常容易理解的书籍就能让你从头到尾理解计算机。很明显,没人能拿到免费的。科学。或 EE 学位后,只有2本书,但我可以说,作为一个自学成才的程序员谁错过了正式的培训: 这些书震撼了我的世界!

鸡蛋早于鸡。大多数“先有鸡还是先有蛋”问题的答案都是一样的: 进化。有些人也很难相信生物进化论,但是怀疑并不是一个诉诸无知。

直接回答你的问题: 第一个编译器是用 汇编语言编写的(由一个人编写)——一个称为汇编程序的程序将汇编语言翻译成二进制文件; 这是一个比编译简单得多的过程,因为汇编语言只是机器语言的一种符号形式,它使用操作码名称而不是数字,用符号表示地址,等等。许多后续的编译器也是用汇编语言编写的。但是第一个 C 编译器是一个修改过的 B 编译器,它是用 B编写的。第一个 B 编译器是用 TMG编写的。用 PDP-7汇编语言编写的 TMG 编译器编译了 B 编译器。