我对编译器的诞生感到好奇。编程是如何开始的?人们是先构建可以识别特定命令集的硬件,还是人们定义一种语言然后围绕该语言构建硬件?与此相关的是,第一种编程语言是什么?
我对编译器的诞生感到好奇。编程是如何开始的?人们是先构建可以识别特定命令集的硬件,还是人们定义一种语言然后围绕该语言构建硬件?与此相关的是,第一种编程语言是什么?
Answers:
实际上,这有一个非常明确的答案:源代码排在第一位 -很大。
在给出技术细节之前,有一些观点:
第一个编程语言中都翻译成机器语言或汇编手。使用软件(通过编译器或评估器)自动执行翻译的想法总是在后来出现,而且远非直观。
考虑一下有关FORTRAN的Wikipedia文章的这句话,它说明了编译器不得不面对的勉强:
…第一个FORTRAN编译器于1957年4月交付。这是第一个优化编译器,因为客户不愿使用高级编程语言,除非其编译器能够生成性能与手工编码的汇编语言相当的代码。[强调我的]
=>到1957年FORTRAN编译器投放市场时,人们已经很高兴使用汇编语言和FORTRAN进行编程。
LISP的情况与此类似(来自Hackers&Painters):
史蒂夫·罗素(Steve Russell)说,看,我为什么不对这个评估程序进行编程...,我对他说,,,,,您将理论与实践混淆了,这个评估是供阅读而不是用于计算。但是他继续前进。就是说,他将我论文中的评估版编译为IBM 704机器代码,修复了错误,然后将其宣传为Lisp解释器,的确如此。因此,在那时Lisp基本上具有今天的形式……”
再一次,不仅源代码(在LISP中)早于解释器,而且后者甚至没有隐含在解释器中。
但是这些事态发展相对较晚。即使不考虑Charles Babbage的Analytical Engine和Ada Lovelace的相关第一个程序,在20世纪也有比编译器更早的编程语言:
Konrad Zuse的Plankalkül和Alonzo Church提出的λ微积分的数学构造。这两种语言都是形式上明确指定的编程语言,但当时都没有编译器。
为了说明这一点,λ演算是从1930年代开始的,而Plankalkül则是在1945年左右开发的。相比之下,第一个FORTRAN编译器是在1957年问世的(但是在指定FORTRAN 之后又出现了三年)。
编程始于人们将机器代码直接写入内存,打孔卡和纸带,甚至是缩短配线架上的链接。很难确定硬件是围绕软件的需求构建的,反之亦然。当然,最早的用于图灵完整可编程计算机的设计是Babbage的分析引擎,它早于Ada Lovelace的第一个记录程序。
关于第一种编程语言,我认为这是巴贝奇分析引擎的机器语言(从问题开始,什么是为计算机编写的第一种编程语言?)
要回答您的问题标题中的问题,由于汇编语言是源代码,而汇编语言早于可以编译为汇编器的高级语言,因此源代码排在第一位。
另外,从未需要编译器,只是很方便。
如果您已记住适当的操作码表,则完全有可能直接将软件写入内存。实际上,某些早期的计算机要求用户在前面板的十六进制键盘上打入引导程序代码以使其启动,但是您可以轻按所需的任何代码,然后它将运行。
诚然,随着CPU变得越来越复杂,这变得越来越困难,但是即使没有汇编器,像6809或Z80这样的简单指令集(忽略所有奇怪的索引模式)也相对容易编程,更不用说高级语言的编译器了。
如果曾经建造过Babbage的分析引擎,我肯定会有蒸汽朋克梅尔,直接将优化的程序编写到织机卡上。
movl $0, -20(%rbp)
,而机器代码是C745EC00000000
,并且是手动输入或从纸带读取的是后者(嗯,类似的东西)。至于机器代码是否算作源代码,我倾向于说“随便什么”。如果您要手动切换,那是的,我想这很重要。
编译器是第一个。它直接用机器代码编写,因为没有编译器就无法编译源代码。
像这样的有关计算机语言的维基百科文章可以回答大多数问题。如果没有,请选择Tanenbaum的其中一本书籍,例如《结构化计算机组织》,它可以回答的问题甚至超过您所能提出的问题:)
我无法说得更具体,因为您的问题太广泛了。
这个问题强烈地取决于我们对“源代码”的语义解释。如果我们将其定义为“已编译的基于文本的计算机指令”,那么大概是第一个编译器。
我更倾向于采用更具权威性的内容,例如在第十届IEEE源代码分析和操纵国际工作会议上发表的Mark Harman的论文“为什么源代码分析和操纵将始终很重要”。
定义1(源代码):为清楚起见,“源代码”是指软件系统的任何完全可执行的描述。因此,它被解释为包括机器代码,非常高级的语言和系统的可执行图形表示。
我认为您的答案在该定义中是隐含的-源代码肯定是最先出现的。