编程语言的世界:被历史埋没的先驱

大家知道世界上最早的编程语言是什么吗?一般认为是1954年开始开发的FORTRAN语言。

然而,仔细想想看,到底什么才叫编程语言?

如果将对机器的控制也看成是编写“程序”的话,那么编程的起源便可以追溯到杰卡德织机上面所使用的打孔纸带(图1)。

编程语言的世界:被历史埋没的先驱0

1801 年,正值工业革命期间,杰卡德织机的发明使得提花编织的图案可以通过“程序”来自动完成。从前在各个家庭中也出现了自动纺织机,用于家庭作坊式的自动纺织 生产,而杰卡德织机则相当于是这些家庭纺织机的放大版。我想那些自动纺织机应该也可以通过类似打孔纸带的东西来输入图案,当然,最近的年轻人恐怕都没有亲 眼见过纺织机吧。

这种用打孔纸带来控制机器的想法,对各个领域都产生了影响。例如在英国从事通用计算机研发的查尔斯•巴贝奇,就在自制的“分析机”上用打孔纸带来输入控制程序。遗憾的是,由于资金和其他一些问题,巴贝奇在生前未能将他的分析机制造出来。

不 过,分析机的设计已经完成,用于分析机的程序也作为文档保留了下来。协助开发这些程序的,是英国诗人拜伦之女爱达•洛夫莱斯,据说她和巴贝奇是师兄妹关 系。如果不算分析机的设计者巴贝奇,那么世界上第一位程序员实际上是一位女性。为了纪念她,还有一种编程语言以她的名字Ada 命名。

编程语言的世界:被历史埋没的先驱1

英国诗人拜伦之女爱达•洛夫莱斯

说 点题外话,在现在的编程界中,女性人数很少这一点是有目共睹的,尤其是在开源相关的活动上,男女比例达到100 比1 也不稀奇。其实,在计算机早期时代,有记录表明人们大都认为程序员应该是女性从事的工作,也许是人们将程序员和当时电话交换机的接线员(从业者中也是女性 居多)看成是同一类型的工作吧。

在被称为世界上第一台计算机的ENIAC(1946 年)中,程序不是用打孔纸带,而是通过接电线的方式来输入的,我总觉得这是一种倒退。

编程语言的世界:被历史埋没的先驱2

工作中的ENIAC

不过,无论是接电线,还是打孔纸带,都不大可能实现复杂的程序,真正的程序恐怕还要等到存储程序式计算机出现之后。一般认为,世界上第一台存储程序式电子计算机,是1949 年出现的EDSAC。

到了这个时候,所谓的“机器语言”就算正式问世了。当时的计算机程序都是用机器语言来编写的。那个时候不要说是编译器,连汇编器都还没发明出来呢,因此使用机器语言也是理所当然的事。

说 到底,机器语言就是一串数字,将计算的步骤从指令表中查出对应的机器语言编码,再人工写成数列,这个工作可不容易。或者说,以前的人虽然没有意识到,但从 我们现代人的角度来看,这种辛苦简直是难以置信。比如说,把引导程序的机器语言数列整个背下来,每次启动的时候手工输入进去;将机器语言指令表全部背下 来,不用在纸上打草稿就能直接输入机器语言指令并正确运行——“古代”的程序员们留下了无数的光辉事迹(或者是传说),那时候的人们真是太伟大了。

编程语言的世界:被历史埋没的先驱3

然而有一天,有一个人忽然想到,查表这种工作本来应该是计算机最擅长的,那么让计算机自己来做不就好了吗?于是,人们用更加容易记忆的指令(助记符)来代替数值,并开发了一种能够自动生成机器语言的程序,这就是汇编器。

汇 编器是用来解释“汇编语言”的程序,汇编语言中所使用的助记符,和计算机指令是一一对应的关系。早期的计算机主要还是用于数值计算,因此数学才是主宰。在 数学的世界中,数百年来传承下来的“语言”就是算式,因此用接近算式的形式来编写计算机指令就显得相当方便。随后,FORTRAN 于1954 年问世了。FORTRAN 这个名字的意思是:

编程语言的世界:被历史埋没的先驱4

也就是说,编程语言是由编程者根据自己的需要发明出来的。早期的计算机,由于性能不足、运算成本高,因此编写和维护程序都被看成是非人的工作,而编程语言正是其开始摆脱非人性的象征。

其实,由助记符自动生成机器语言的汇编器,以及由人类较易懂的算式型语句生成机器语言的编译器,当时都被认为是革新性的技术,被称为“自动编程”。此外,编译器开发技术的研究甚至被视为人工智能研究的一部分。

一般大家都认为ENIAC是世界上第一台计算机,而FORTRAN是世界上第一个编程语言,然而,事实果真如此吗?我觉得有必要刨根问底一番。

实际上,如果仔细查阅一下计算机的历史,还是会发现一些不同观点的。

首 先,世界上第一台计算机,其实应该是“阿塔纳索夫- 贝瑞计算机”(Atanasoff-BerryComputer,简称ABC),这台计算机的测试机完成于1939年,远比ENIAC 要早。而且,ABC在数值的表现方法上采用了现在广泛使用的二进制计算(ENIAC 为十进制计算),这也是ABC的其中一个先进之处。

编程语言的世界:被历史埋没的先驱5

艾奥瓦州立大学 Durham Center 一楼的ABC

ENIAC 甚至都不能算作是世界上第二台计算机。当时在第二次世界大战中与美国敌对的德国,开发出了一台用于土木工程计算的计算机Z3。这台计算机完成于1941 年,和ABC一样,在数值表现上也采用了二进制。和由电子管组成的ABC和ENIAC不同,Z3是继电器式计算机。遗憾的是,Z3在1944年柏林轰炸中 被毁。

那么,编程语言方面又如何呢?通过查阅资料发现,开发Z3的德国工程师康拉德•楚泽,于1942 年至1945年间开发了一种名为Plankalkül的编程语言,比FORTRAN早了将近10年。然而,Plankalkül只是被设计出来,而没有被 正式发表,而且用于该编程语言的编译器也没有被开发出来。

编程语言的世界:被历史埋没的先驱6

康拉德•楚泽

Plankalkül的设计直到1972年才被正式发表,而到第一个用于该语言的编译器正式实现,已经是1998年的事了。因此,如果论完整开发并能工作的编程语言,FORTRAN作为最古老编程语言的地位还是无人能够撼动。

Plankalkül 由于种种原因被淹没在历史的长河中,因此它对后世的编程语言几乎没有产生影响,但是,它却考虑了如赋值语句、子程序、条件判断、循环、浮点小数计算、数 组、拥有层次结构的结构体、断言、异常处理、目标搜寻等功能,其中一些甚至连10年后出现的FORTRAN都不具备,可见其先进性着实令人惊叹。

图2 给出了一段Plankalkül程序,其中定义了用于对两个参数进行比较的子程序max,以及利用这个子程序进而对三个参数进行比较的子程序max3。其中所有的运算过程都被表示为“计算 => 结果保存位置”这样的形式,相当有意思。

编程语言的世界:被历史埋没的先驱7

余下全文(1/3)
分享这篇文章:

请关注我们:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注