我听说了鸡肉,鸡蛋和自举。我有几个问题。
是什么写了第一个将东西转换成二进制指令的编译器?
汇编程序是否已编译或转换为二进制指令?
...我很难相信他们用二进制编写了编译器。
我听说了鸡肉,鸡蛋和自举。我有几个问题。
是什么写了第一个将东西转换成二进制指令的编译器?
汇编程序是否已编译或转换为二进制指令?
...我很难相信他们用二进制编写了编译器。
Answers:
汇编指令通常是对操作码的直接映射,操作码是可以由处理器直接解释的机器代码的(多)字节值。通过从表中查找操作码来直接编写程序是很有可能的(例如,该表用于6039微处理器),该表列出了具有匹配汇编指令的程序,并手动确定事物的内存地址/偏移量像跳。
最初的程序正是以这种方式完成的-手写操作码。
但是,在大多数情况下,使用汇编程序来“汇编”汇编代码会更简单,该汇编代码会自动执行这些操作码查找,并且有助于计算命名跳转标签的地址/偏移量等。
最初的汇编程序是手工编写的。然后,可以使用这些汇编器来汇编更复杂的汇编器,然后将其用于汇编为高级语言编写的编译器,依此类推。反复编写工具以简化下一组工具的创建的过程称为引导(如David Rabinowitz在其回答中所述)。
请阅读有关编译器引导程序和编译器编写历史的信息
这个想法是直接用机器代码编写一个非常简单的编译器,用它编写一个更复杂的编译器,使用第二个编译器构建第三个编译器,依此类推,直到拥有完整的编译器为止。
Woz在一次公开演讲中说,当他开始时,他负担不起编译器,因此他在纸上手工编译为二进制。如果您想了解更疯狂的内容,请阅读Bill Gates和Paul Allen为Altair 8800编写BASIC的条件。
关于“用二进制编写计算机”-从程序员退后一步,考虑一下早期的计算机是什么。高层次的东西还不存在-您考虑了低层次的所有内容,因为仅此而已。您拥有可以执行通过机器代码操纵的基本逻辑和算术的硬件(这只是编译后的程序集-Amber解释了为什么手工不难完成此部分),并且您希望该硬件执行某些数学壮举。您不必担心不存在的操作系统,只是告诉硬件(在装配中)如何操纵输入的数字。那只是一个很大的计算器。当今的计算机一次只能构建一个抽象。
如果您想打破让计算机感觉像魔术一样的障碍,我强烈建议阅读Charles Petzold和/或The Elements of Computing Systems的CODE。只需具备编程方面的基础知识,这些奇妙的入门书籍就可以使您从上到下理解计算机。显然,无法获得补偿。科学 或只有2本书才获得EE学位,但作为一名自学成才的程序员,我错过了接受正式培训的机会:这些书震惊了我的世界!
是什么写了第一个将东西转换成二进制指令的编译器?
人类做到了。阅读有关A-0系统的信息:
1952年,格蕾丝·霍珀(Grace Hopper)完成了她的第一个Sperry编译器,即A-0。A-0系统是一组指令,可以将符号数学代码转换为机器语言。在制作A-0时,她采用了多年来收集的所有子程序并将它们放在磁带上。每个例程都有一个电话号码,以便机器可以在磁带上找到它。格雷斯说:“我要做的就是写下一组电话号码,让计算机在磁带上找到它们,将它们带过来进行添加。这是第一个编译器。”
第一个程序是用机器代码(不是汇编语言)编写的-使用开关将实际数字插入计算机内存中。我们已经走了很长一段路...
有时,这种情况仍然会在很小的程度上发生-修补少量代码或创建乱码。我记得将数字打入Basic字符串,然后在早期的micro上将它们作为小型快速子例程执行。我还记得在PDP-11的前面板上拨动开关,将引导加载程序输入到其存储器中以用于大学课程。
这些程序有时会用于处理文本文件以创建其他程序,并创建了voila编程语言。