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

Posted

技术标签:

【中文标题】第一个编译器是如何编写的?【英文标题】:How was the first compiler written? 【发布时间】:2010-12-11 20:06:58 【问题描述】:

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

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

程序集是否被编译或翻译成二进制指令?

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

【问题讨论】:

When someone writes a new programming language, what do they write it IN? 的可能重复项 @nawfal,这是一种新的编程语言和第一个编译器之间的区别,所以不 - 它不是重复的 @PauliSudarshanTerho 有什么区别?问题的精神是一样的。你不会写编程语言,这个问题又是关于第一个编译器。 也许在你的精神想象中?实际上,您在该链接中找不到任何关于第一个编译器的内容。而且您不应该建议任何人从头开始编写新语言。如果是这样,那么如果第一个编译器对于编写一门新语言很重要,你为什么要隐藏关于如何编写第一个编译器的答案? 向我学习 - 这是重复的:***.com/questions/4772768/… 【参考方案1】:

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

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

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

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

【讨论】:

我的第一台计算机是基于 Z80 的机器,我必须在其 ROM 监视器中手动组装引导加载程序以启动操作系统 (CP/M) 的基础知识,以便组装其余部分将所述操作系统转换为工作系统,并带有基于磁盘的引导加载程序。娱乐时间。所以,是的,你可以手工组装就好了。它缓慢、痛苦且容易出错(这就是我们自动化的原因),但这是可能的。 first link 坏了。 手写。如何?接线还是打卡?我猜他们有十六进制键盘。【参考方案2】:

请阅读compiler bootstrapping和the history of compiler writing

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

Woz 在他的一次公开演讲中说,当他开始时,他买不起编译器,所以他在纸上手工编译成二进制文件。如果您想看到更狂野的东西,请阅读Bill Gates and Paul Allen wrote the BASIC for the Altair 8800.

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

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

【讨论】:

在进行销售宣传后编写 Altair BASIC 解释器?在飞往阿尔伯克基的飞机上编写引导程序?这听起来有点荒谬。也很有趣。 @Shurane:哈!这些观点也很重要,但对我来说,他们如何制作 BASIC 解释器以及团队如何将其塞进狭小的空间的本质是一件美丽且令人震惊的编程能力/黑客的事情。【参考方案5】:

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

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

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

【讨论】:

问题是关于第一个编译器,而不是一般的第一个程序,尽管程序有时是编译器;两者的历史并不相同。 (打个比方:尽管猫是动物,但第一批动物何时出现在地球上的问题的答案并不是第一批猫何时出现在地球上的问题的答案。)【参考方案6】:

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

人类做到了。阅读A-0 system:

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

【讨论】:

链接现在好像是404,反正上面的“Grace”就是Grace Hopper。 我听说 Hopper 编写了第一个编译器,但上面的描述使它听起来更像是一个链接器而不是编译器。不过,好故事。令人惊奇的是,曾经有一段时间计算机科学家对编译器的想法持怀疑态度...... @mehaase 这就是它被称为“编译器”的原因。它编译了例程,每个例程(可能)直接用机器语言编写。 @MarkE.Haase Hopper 在这里提到的人是使用计算机执行特定计算任务的应用工程师和科学家;他们不是“计算机科学家”。 1952 年左右有少数控制论者,但我怀疑她与其中任何一个人交谈过。

以上是关于第一个编译器是如何编写的?的主要内容,如果未能解决你的问题,请参考以下文章

如何编写第一个语言

“使用命名空间”如何在C ++中工作

如何编写 vb.net 代码来编译 C/C++ 程序?

编译器是如何编写的

如何在 Scala 中使用 Stream.cons 编写不泄漏的尾递归函数?

如何才能编写高性能的 Swift 代码