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

时间:2009-10-31 06:58:34

标签: compiler-construction machine-instruction

我听说过鸡肉和鸡蛋以及引导。我有几个问题。

第一个将某些内容转换为二进制指令的编译器是什么?

程序集是编译还是翻译成二进制指令?

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

6 个答案:

答案 0 :(得分:127)

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

第一个程序完全以这种方式完成 - 手写的操作码。

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

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

答案 1 :(得分:41)

请阅读compiler bootstrappingthe history of compiler writing

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

答案 2 :(得分:33)

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

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

答案 3 :(得分:23)

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

的条件

关于“以二进制编写计算机” - 从成为程序员后退一步,思考早期计算机是什么。高级别的东西还不存在 - 你想到了低级别的所有东西,因为就是这样。你有硬件可以做你通过机器代码操作的基本逻辑和算术(这只是编译程序集--Amber解释了为什么这部分不难手工完成)并且你希望这个硬件能够执行某些数学专长。您并不担心不存在的操作系统,您只是告诉硬件(在装配中)如何操纵您提供的数字。这是一个很大的计算器。今天的计算机一次构建了一个抽象。

如果你想打破让计算机感觉像魔法的障碍,我强烈建议你阅读CODE by Charles Petzold和/或The Elements of Computing Systems。只需掌握编程的基本知识,这些精美的书籍将让您从头到尾了解计算机。显然,一个人无法得到一个补偿。 SCI。或者只有2本书之后的EE学位,但我可以说是一个错过正式训练的自学成才的程序员:这些书震撼了我的世界!

答案 4 :(得分:9)

  

第一个将某些内容转换为二进制指令的编译器是什么?

一个人做了。阅读A-0 system

  

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

答案 5 :(得分:8)

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

有时这仍然会在很小程度上发生 - 修补一小段代码或创建thunk。我记得在数字中打入基本字符串,然后在早期的微观上作为小而快的子程序执行。我还记得在PDP-11的前面板上切换开关,将bootloader程序输入到大学课程的内存中。

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