首先是编译器还是源代码?


17

我对编译器的诞生感到好奇。编程是如何开始的?人们是先构建可以识别特定命令集的硬件,还是人们定义一种语言然后围绕该语言构建硬件?与此相关的是,第一种编程语言是什么?



1
子问题之一是它本身的问题:为计算机编写的第一门编程语言是什么?
Mark Booth 2012年

当然这是您可以查找的内容吗?
卡勒布

@Caleb在SkyDan的答案阅读评论...
大卫·考登

2
@Brian有效的假设,但事实证明是错误的。这根本不是个鸡问题,有一个非常明确的答案(提示:下面投票最多的地方是错误的)。源代码早编译器。
康拉德·鲁道夫

Answers:


30

实际上,这有一个非常明确的答案:源代码排在第一位 -很大。

在给出技术细节之前,有一些观点:

第一个编程语言中翻译成机器语言或汇编。使用软件(通过编译器或评估器)自动执行翻译的想法总是在后来出现,而且远非直观。

考虑一下有关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 之后又出现了三年)。


好答案!我不知道代码曾经是手工编译的,但是那很有意义。
ckb

10

编程始于人们将机器代码直接写入内存,打孔卡和纸带,甚至是缩短配线架上的链接。很难确定硬件是围绕软件的需求构建的,反之亦然。当然,最早的用于图灵完整可编程计算机的设计是Babbage的分析引擎,它早于Ada Lovelace的第一个记录程序

关于第一种编程语言,我认为这是巴贝奇分析引擎的机器语言(从问题开始,什么是为计算机编写的第一种编程语言?

要回答您的问题标题中的问题,由于汇编语言源代码,而汇编语言早于可以编译为汇编器的高级语言,因此源代码排在第一位。

另外,从未需要编译器,只是很方便。

如果您已记住适当的操作码表,则完全有可能直接将软件写入内存。实际上,某些早期的计算机要求用户在前面板的十六进制键盘上打入引导程序代码以使其启动,但是您可以轻按所需的任何代码,然后它将运行。

诚然,随着CPU变得越来越复杂,这变得越来越困难,但是即使没有汇编器,像6809Z80这样的简单指令集(忽略所有奇怪的索引模式)也相对容易编程,更不用说高级语言的编译器了。

如果曾经建造过Babbage的分析引擎,我肯定会有蒸汽朋克梅尔,直接将优化的程序编写到织机卡上。


1
您实际上在您发布的Wikipedia链接上阅读了源代码的定义吗?如上所述,机器代码不是源代码。机器代码!=汇编。机器代码首先在那儿。
occulus'7年

@MarkBooth我认为MIPS和AVR是更简单...
大卫·考登

4
@occulus- 汇编语言不是哪种源代码?汇编语言将一种汇编语言指令映射到一种机器代码,并且如果您知道自己的操作码表,可以在您的头脑中进行汇编。老实说,这些天孩子们... * 8')
Mark Booth

1
对我来说,汇编语言movl $0, -20(%rbp),而机器代码C745EC00000000,并且是手动输入或从纸带读取的是后者(嗯,类似的东西)。至于机器代码是否算作源代码,我倾向于说“随便什么”。如果您要手动切换,那是的,我想这很重要。
约翰·波德

@JohnBode-哦,我同意,但是鉴于汇编指令和机器代码指令之间的1:1对应关系,汇编只是机械翻译(汇编)的问题,逻辑是相同的。编译意味着许多复杂得多:许多翻译(尽管Occam是一种高级语言,并且由于其MISC体系结构,许多Occam语句1:1映射到Transputer指令上。* 8')。
Mark Booth

6

编译器是第一个。它直接用机器代码编写,因为没有编译器就无法编译源代码。

这样的有关计算机语言的维基百科文章可以回答大多数问题。如果没有,请选择Tanenbaum的其中一本书籍,例如《结构化计算机组织》,它可以回答的问题甚至超过您所能提出的问题:)

我无法说得更具体,因为您的问题太广泛了。


20
也可以说源是第一位的,因为对于最初的“计算机”来说,源等同于二进制文件(即直接用机器可读语言编程)。
约阿希姆·绍尔

5
@Joachim根据定义,源代码是人类可读的文本,由编译器翻译为机器代码。因此,机器代码本身不是源代码。
hellodanylo 2012年

11
编译器是第一个,但是它是在生物神经网络中实现的。
巢穴

8
为什么这么高票?这是不对的。高级语言(尤其是λ微积分,Plankalkül和LISP)的源代码早于编译器和解释器。这甚至都没有考虑到Ada Lovelace编写的半正式程序。
康拉德·鲁道夫

4
@SkyDan那么您的定义是什么?我不知道您的答案正确的明智定义(“编译器”和“高级语言的源代码”,更不用说低级了)。
Konrad Rudolph

4

解释器在编译器之前存在,因此源代码在编译器之前存在。

不存在关于计算的历史一些非常有趣的论文在这里。FORTRAN II编译器的源代码应该可用,但这些链接已断开。

这篇 1954年的论文描述了Whirlwhind解释器。


1

这个问题强烈地取决于我们对“源代码”的语义解释。如果我们将其定义为“已编译的基于文本的计算机指令”,那么大概是第一个编译器。

我更倾向于采用更具权威性的内容,例如在第十届IEEE源代码分析和操纵国际工作会议上发表的Mark Harman的论文“为什么源代码分析和操纵将始终很重要”

定义1(源代码):为清楚起见,“源代码”是指软件系统的任何完全可执行的描述。因此,它被解释为包括机器代码,非常高级的语言和系统的可执行图形表​​示。

我认为您的答案在该定义中是隐含的-源代码肯定是最先出现的。


“假定编译器优先” –仅当您将“已编译”定义为“由自动工具翻译”,而不是“手动翻译为机器代码”时。
康拉德·鲁道夫2012年

非常有趣的论文。我喜欢的源代码,定义-虽然它使我的问题非问题真的..
大卫·考登

@KonradRudolph不是执行编译的单元,是机器,人为干预还是神圣干预,称为“编译器”?
Kirk Broadhurst

0

这些算法在纸上分类,然后通过物理/机械方式(移动电线)将主体连接起来。要更改程序,请移动导线并再次运行。

后来,汇编语言在纸上整理出来,手工翻译为机器代码,然后使用开关等将其输入到ram中。或打孔卡等。最终,您可以制作一个汇编程序,然后可以在汇编中编程,而不是在机器码中编程,然后可以进行编译。最终,您可以引导该编译器。并制作新的语言和新的编译器等。

第一语言不是语言,后来的第一语言是汇编语言。对于每个处理器,第一语言是汇编语言(源自机器代码)。首先设计指令集,然后再设计硬件以实现它,然后是汇编器,然后是编译器。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.