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


166

我听说了鸡肉,鸡蛋和自举。我有几个问题。

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

汇编程序是否已编译或转换为二进制指令?

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



@nawfal,这是新的编程语言与第一个编译器之间的区别,所以不-它不是重复的

@PauliSudarshanTerho有什么区别?问题的实质是相同的。您不能编写编程语言,而这个问题是在谈论第一个编译器。
nawfal

在你的精神想象中?实际上,您在该链接中找不到任何有关第一个编译器的内容。而且,您不应该建议任何人写新语言从头开始。如果是这样,那么如果对编写新语言很重要,那么为什么要隐藏有关如何编写第一个编译器的答案呢?

从我了解-这是一个重复:stackoverflow.com/questions/4772768/...

Answers:


133

汇编指令通常是对操作码的直接映射,操作码是可以由处理器直接解释的机器代码的(多)字节值。通过从表中查找操作码来直接编写程序是很有可能的(例如,用于6039微处理器),该表列出了具有匹配汇编指令的程序,并手动确定事物的内存地址/偏移量像跳。

最初的程序正是以这种方式完成的-手写操作码。

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

最初的汇编程序是手工编写的。然后,可以使用这些汇编器来汇编更复杂的汇编器,然后将其用于汇编为高级语言编写的编译器,依此类推。反复编写工具以简化下一组工具的创建的过程称为引导(如David Rabinowitz在其回答中所述)。


18
我的第一台计算机是一台基于Z80的计算机,其ROM监视器必须手工组装一个引导加载程序以提供操作系统(CP / M)的基础知识,因此我可以将其余的操作系统组装成一个操作系统,并配有基于磁盘的引导加载程序。娱乐时间。是的,您可以手工组装就好了。这是缓慢而痛苦的,并且容易出错(这就是我们使事物自动化的原因),但是它是可能的。
我的正确观点

一个链接断开。
路加福音

亲手写的。怎么样?接线或打孔卡?我猜他们有十六进制键盘。


36

鸡蛋早于鸡肉。大多数“鸡和蛋”问题的答案都是相同的:进化。某些人也难以相信生物进化,但是怀疑不是一个论点(谷歌argumentum ad ignorantiam)。

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


24

Woz在一次公开演讲中说,当他开始时,他负担不起编译器,因此他在纸上手工编译为二进制。如果您想了解更疯狂的内容,请阅读Bill Gates和Paul Allen为Altair 8800编写BASIC的条件。

关于“用二进制编写计算机”-从程序员退后一步,考虑一下早期的计算机是什么。高层次的东西还不存在-您考虑了低层次的所有内容,因为仅此而已。您拥有可以执行通过机器代码操纵的基本逻辑和算术的硬件(这只是编译后的程序集-Amber解释了为什么手工不难完成此部分),并且您希望该硬件执行某些数学壮举。您不必担心不存在的操作系统,只是告诉硬件(在装配中)如何操纵输入的数字。那只是一个很大的计算器。当今的计算机一次只能构建一个抽象。

如果您想打破让计算机感觉像魔术一样的障碍,我强烈建议阅读Charles Petzold和/或The Elements of Computing Systems的CODE。只需具备编程方面的基础知识,这些奇妙的入门书籍就可以使您从上到下理解计算机。显然,无法获得补偿。科学 或只有2本书才获得EE学位,但作为一名自学成才的程序员,我错过了接受正式培训的机会:这些书​​震惊了我的世界!


2
在推销产品后编写Altair BASIC解释器?在去阿尔伯克基的飞机上编写引导程序?这听起来有点荒谬。和乐趣。
Ehtesh Choudhury 2011年

2
@Shurane:哈!这一点也很重要,但是对我来说,他们如何制作BASIC解释器以及团队如何将其塞入狭小的空间却是一件很棘手的事,这是一件美事,令人震惊的编程能力/黑客。
黛娜

10

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

人类做到了。阅读有关A-0系统的信息

1952年,格蕾丝·霍珀(Grace Hopper)完成了她的第一个Sperry编译器,即A-0。A-0系统是一组指令,可以将符号数学代码转换为机器语言。在制作A-0时,她采用了多年来收集的所有子程序并将它们放在磁带上。每个例程都有一个电话号码,以便机器可以在磁带上找到它。格雷斯说:“我要做的就是写下一组电话号码,让计算机在磁带上找到它们,将它们带过来进行添加。这是第一个编译器。”


1
现在的链接似乎是404,无论如何,上面的“ Grace”是Grace Hopper。
Volker Stolz 2010年

2
我听说Hopper编写了第一个编译器,但是上面的描述使它听起来更像是链接器,而不是编译器。还是,好故事。令人惊奇的是,曾经有一段时间计算机科学家对编译器的想法持怀疑态度……
Mark E. Haase 2012年

1
@mehaase这就是为什么它被称为“编译器”。它会编译例程,每个例程都(可能)直接用机器语言编写。
Elazar 2013年

@ MarkE.Haase此处提到的Hopper人是使用计算机执行特定计算任务的应用工程师和科学家。他们不是“计算机科学家”。1952年左右有少数控制论专家,但我怀疑她是否与其中任何一位进行过交谈。
吉姆·巴尔特

9

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

有时,这种情况仍然会在很小的程度上发生-修补少量代码或创建乱码。我记得将数字打入Basic字符串,然后在早期的micro上将它们作为小型快速子例程执行。我还记得在PDP-11的前面板上拨动开关,将引导加载程序输入到其存储器中以用于大学课程。

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


问题是关于第一个编译器,而不是一般的第一个程序,尽管程序有时是编译器。两者的历史是不一样的。(比喻:尽管首批动物是动物,但首批猫何时出现在地球上的问题的答案,并不是首批猫何时何时出现在地球上的问题的答案。)
Jim Balter,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.