第一个编译器是如何编写的?
我听说过鸡和鸡蛋,并引导。 我有几个问题。
什么编写了第一个编译器将某些东西转换成二进制指令
汇编是编译还是翻译成二进制指令?
我很难相信他们用二进制编写了一个编译器。
汇编指令(通常)是直接映射到操作码,操作码是机器码的(多)字节值,可以由处理器直接解释。 通过从一个表(例如6039微处理器的这个表)中查找它们,直接在操作码中编写一个程序是非常可能的,它将它们与匹配的汇编指令一起列出,并且手工确定存储器地址/偏移量像跳跃。
第一个程序正是以这种方式完成的 – 手写操作码。
然而,大多数情况下,使用汇编程序“编译”汇编代码会更简单,汇编代码会自动执行这些操作码查找,并且有助于计算指定跳转标签的地址/偏移量等。
第一批assembly人员是用手写的。 这些汇编程序可以用来组装更复杂的汇编程序,然后可以用来汇编为高级语言编写的编译程序,等等。 为了简化下一组工具的创build,这个迭代编写工具的过程称为(如David Rabinowitz在他的回答中提到的) 引导 。
请阅读关于编译器引导和编译器编写的历史
这个想法是直接在机器代码中编写一个非常简单的编译器,用它编写一个更复杂的编译器,用第二个编译器编译第三个编译器,等等,直到你可以有一个全function的编译器。
鸡蛋早在鸡之前。 大多数“鸡蛋和鸡蛋”问题的答案是一样的:进化。 有些人也难以相信生物进化,但不相信不是一个论据(谷歌论据和无知)。
为了直接回答你的问题:第一个编译器是用汇编语言编写的(一个人),一个被称为汇编程序的程序会将汇编语言翻译成二进制文件; 这是一个比编译简单得多的过程,因为汇编语言只是使用操作码名称而不是数字的机器语言的符号forms,表示带符号的地址等等。 许多后续的编译器也是用汇编语言编写的。 但是第一个C编译器是用B编写的一个修改的B编译器。 第一个B编译器是用TMG编写的。 用于编译B编译器的TMG编译器是用PDP-7汇编语言编写的。
沃兹在他的一次公开会谈中说,当他开始的时候,他买不起一个编译器,所以编译成二进制文件。 如果你想看到更加狂野的东西,请阅读Bill Gates和Paul Allen为Altair 8800写BASIC的条件。
关于“用二进制编写电脑” – 退一步做程序员,思考早期的电脑是什么。 高水平的东西还不存在 – 你想到了低层次的东西,因为就是这样。 你有硬件,可以做基本的逻辑和algorithm,你通过机器代码(这只是编译汇编 – 琥珀解释了为什么这个部分不是很难做手工)操纵,你想这个硬件执行一定的math专长。 你不担心不存在的操作系统,你只是告诉硬件(组装)如何操纵你喂食的数字。 这是一个很大的计算器。 今天的电脑一次build成了一个抽象。
如果你想打破屏障,使电脑感觉像魔术一样,我强烈推荐阅读Charles Petzold和/或The Elements of Computing Systems的 CODE 。 只有编程的基本知识,这些出色的可访问的书籍将让你从上到下了解电脑。 显然,一个不能得到一个comp。 SCI。 或EE学位,但我可以说是一个错过了正规训练的自学成才的程序员:这些书震撼了我的世界!
什么编写了第一个编译器将某些东西转换成二进制指令
一个人做了。 阅读A-0系统 A-0系统 :
1952年,格雷斯完成了她的第一个编译器Sperry,被称为A-0。 A-0系统是一套可以将符号math代码翻译成机器语言的指令。 在制作A-0时,她把这些年来收集的所有子程序拿到磁带上。 每个程序都有一个电话号码,以便机器可以在磁带上find它。 “我所要做的就是写下一组电话号码,让计算机在录像带上find它们,然后把它们加上去,这是第一个编译器,”Grace说。
第一个程序是用机器代码(不是汇编语言)编写的 – 用交换机将实际的编号插入计算机内存。 我们已经走了很长一段路
有时候,这种情况在很小的程度上还是会发生的 – 修补小部分代码或创buildthunk。 我记得在基本string中进行数字打孔,然后在早期的微型打印机上执行小型快速子程序。 我还记得在PDP-11的前面板上切换开关,在大学课程中inputbootloader程序到内存中。
这些程序有时会被用来处理文本文件来创build其他程序,并创build了voila编程语言。