我听说过鸡肉和鸡蛋以及自责.我有几个问题.
编写第一个将某些内容转换为二进制指令的编译器是什
汇编是编译还是翻译成二进制指令?
...我发现很难相信他们用二进制编写了一个编译器.
组装指令(通常)是对操作码的直接映射,操作码是可由处理器直接解释的机器码的(多)字节值.很可能直接在操作码中编写一个程序,从一个表(例如6039微处理器的表)中查找它们,并用匹配的汇编指令列出它们,并手动确定内存地址/偏移量.喜欢跳.
第一个程序完全以这种方式完成 - 手写的操作码.
但是,大多数情况下使用汇编程序来"编译"汇编代码更简单,汇编代码自动执行这些操作码查找,并且有助于计算命名跳转标签的地址/偏移量等等.
第一批装配工是手工编写的.然后可以使用这些汇编程序来组装更复杂的汇编程序,然后可以将它们用于汇编为更高级语言编写的编译器,依此类推.这个迭代编写工具以简化下一组工具创建的过程被称为(正如David Rabinowitz在他的回答中提到的)bootstrapping.
请阅读有关编译器引导和编译器编写历史的信息
我们的想法是直接在机器代码中编写一个非常简单的编译器,用它来编写更复杂的编译器,使用第二个编译器来构建第三个编译器,依此类推,直到你可以拥有一个功能齐全的编译器.
鸡蛋长在鸡之前.大多数"鸡和鸡蛋"问题的答案是相同的:进化.有些人也很难相信生物进化,但怀疑不是一个论据(google argumentum ad ignorantiam).
直接回答你的问题:第一个编译器是用汇编语言编写的(一个人)- 一个叫汇编程序的程序会将汇编语言翻译成二进制文件; 这是一个比编译简单得多的过程,因为汇编语言只是机器语言的一种符号形式,它使用操作码名称而不是数字,用符号表示地址,等等.许多后续编译器也是用汇编语言编写的.但是第一个C编译器是一个修改过的B编译器,用B编写.第一个B编译器是用TMG编写的.用于编译B编译器的TMG编译器是用PDP-7汇编语言编写的.
Woz在他的一次公开演讲中说,当他开始时,他买不起编译器,所以他在纸上手工编译成二进制.如果你想看到更疯狂的东西,请阅读比尔盖茨和保罗艾伦为Altair 8800编写BASIC的条件.
关于"用二进制编写计算机" - 退出程序员并考虑早期计算机是什么.高级别的东西还不存在 - 你想到了低级别的所有东西,因为就是这样.你有硬件可以做你通过机器代码操作的基本逻辑和算术(这只是编译程序集--Amber解释了为什么这部分不难手工完成)并且你希望这个硬件能够执行某些数学专长.您并不担心不存在的操作系统,您只是告诉硬件(在装配中)如何操纵您提供的数字.这是一个很大的计算器.今天的计算机一次构建一个抽象.
如果你想打破让计算机感觉像魔术一样的障碍,我强烈推荐阅读Charles Petzold和/或计算系统元素的CODE.只需掌握编程的基本知识,这些精美的书籍将让您从头到尾了解计算机.显然,一个人无法得到一个补偿.SCI.或者只有两本书之后的EE学位,但我可以说是一个错过正式训练的自学成才的程序员:这些书震撼了我的世界!
编写第一个将某些内容转换为二进制指令的编译器是什
一个人做了.阅读有关A-0系统的信息:
1952年,Grace Hopper完成了她的第一个Sperry编译器,即A-0.A-0系统是一组指令,可以将符号数学代码转换为机器语言.在制作A-0时,她采用了多年来收集的所有子程序并将它们放在胶带上.每个例程都有一个电话号码,以便机器可以在磁带上找到它."我所要做的就是写下一组电话号码,让计算机在磁带上找到它们,把它们带到一起并做一些补充.这是第一个编译器,"正如Grace所描述的那样.
第一个程序是用机器代码(而不是汇编语言)编写的 - 使用开关将实际数字插入计算机内存.我们走了很长的路......
有时这仍然会在很小程度上发生 - 修补一小段代码或创建thunk.我记得在数字中打入Basic字符串,然后在早期的微观上执行小而快的子程序.我还记得在PDP-11的前面板上切换开关,将bootloader程序输入到大学课程的内存中.
这些程序有时会用于处理文本文件以创建其他程序,并且创建了编程语言.