185

我听说过鸡和蛋以及自举。我有几个问题。

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

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

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

4

6 回答 6

143

汇编指令(通常)是到操作码的直接映射,操作码是可以由处理器直接解释的机器码的(多)字节值。很有可能直接用操作码编写程序,方法是从一个表中查找它们(例如这个用于 6039 微处理器的表),其中列出了它们以及匹配的汇编指令,并手动确定内存地址/偏移量像跳跃一样。

第一个程序正是以这种方式完成的——手写操作码。

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

第一个汇编程序是手工编写的。然后这些汇编器可用于汇编更复杂的汇编器,然后可用于汇编为高级语言编写的编译器,依此类推。这个迭代地编写工具以简化创建下一组工具的过程称为(正如 David Rabinowitz 在他的回答中提到的)引导程序

于 2009-10-31T07:02:51.470 回答
48

请阅读编译器引导编译器编写的历史

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

于 2009-10-31T07:02:42.843 回答
39

鸡蛋早在鸡之前。大多数“鸡和蛋”问题的答案都是一样的:进化。有些人也很难相信生物进化,但不相信不是论据(google argumentum ad ignorantiam)。

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

于 2011-02-07T22:21:02.657 回答
25

Woz 在他的一次公开演讲中说,当他开始时,他买不起编译器,所以他在纸上手工编译成二进制文件。如果您想看到更狂野的东西,请阅读比尔盖茨和保罗艾伦为 Altair 8800 编写 BASIC 的条件。

关于“用二进制编写计算机”——从程序员的角度退后一步,想想早期的计算机是什么。高层次的东西还不存在——你在低层次考虑一切,因为它就是这样。您拥有可以通过机器代码进行基本逻辑和算术运算的硬件(这只是编译的程序集——Amber 解释了为什么这部分不难手工完成),并且您希望该硬件能够执行某些数学壮举。您不必担心不存在的操作系统,您只需告诉硬件(在组装中)如何操作您提供给它的数字。那只是一个大计算器。今天的计算机是一次构建一个抽象的。

如果您想打破让计算机感觉像魔术的障碍,我强烈建议您阅读Charles Petzold 的 CODE和/或The Elements of Computing Systems。只需具备基本的编程知识,这些精彩易懂的书籍将让您从头到尾了解计算机。显然,一个人不能得到一个补偿。科学。或 EE 学位后仅 2 本书,但我可以说作为一个自学成才的程序员错过了正式培训:这些书震撼了我的世界!

于 2010-09-20T16:45:00.570 回答
11

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

有时这仍然会在很小程度上发生 - 修补少量代码或创建 thunk。我记得将数字打入基本字符串,然后在早期的 micros 上作为小而快速的子程序执行。我还记得切换 PDP-11 前面板上的开关以将引导加载程序输入到其内存中以用于大学课程。

这些程序有时会用于处理文本文件以创建其他程序,并且创建了编程语言。

于 2009-10-31T07:01:29.840 回答
10

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

一个人类做到了。阅读A-0 系统

1952 年,Grace Hopper 为 Sperry 完成了她的第一个编译器,称为 A-0。A-0 系统是一组可以将符号数学代码翻译成机器语言的指令。在制作 A-0 时,她把多年来收集的所有子程序都录了下来。每个例程都有一个调用号,以便机器可以在磁带上找到它。“我所要做的就是写下一组电话号码,让计算机在磁带上找到它们,将它们带过来并进行添加。这是第一个编译器,”正如 Grace 描述的那样。

于 2009-10-31T07:06:22.027 回答