选自theregister
作者:Richard Speed
机器之心编译
参与:Panda
「诞生于穿孔纸带时代的古老编程语言 ALGOL 60 已经问世 60 年。而在当今很多编程语言中,你仍能看到它的影子。
ALGOL,为算法语言(ALGOrithmic Language)的缩写,是计算机发展史上首批产生的高级程式语言家族。当时还是晶体管计算机流行的时代,由于 ALGOL 语句和普通语言表达式接近,更适于数值计算,所以 ALGOL 多用于科学计算机。
ALGOL 60 是指 1960 年问世的 ALGOrithmic Language,这种编程语言影响了之后的 CPL、BCPL、B 语言、Pascal、Simula、C 语言,对程序设计领域具有很强的影响力。今年,这门古老的语言已经 60 岁了,英国科技媒体 The Register 近日走进英国国家计算博物馆,带我们回顾了这门语言的发展故事。
拉夫堡文法学校的 Elliott 803 计算机,1976 年
60 年前,ALGOL 60 奠定了多种计算机语言的基础。
在那个依赖穿孔纸带的计算机时代,ALGOL 60 究竟发挥着怎样的价值?英国国家计算博物馆的 Peter Onion 和 Andrew Herbert 将带领我们重温那个年代的故事。
ALGOL 60 是 ALGOL 58 语言的后继语言(ALGOL 58 于 1958 年问世)。ALGOL 58 引入了代码块的概念(并使用 begin 和 end 对来分割),而 ALGOL 60 真正开始使用结构化编程并将其发扬光大,后来的 Pascal 和 C,以及 B 和 Simula 等都采用了类似的设计。
「1950 年代,大部分代码最初都是用机器码或汇编代码写的。」微软剑桥研究院前院长 Andrew Herbert 说,每台计算机都有自己独特的代码特点。第一代语言中有一种名为 Autocode,是为方程等编码问题而设计的,然后用该语言写的代码会被转译为机器码。不过与如今的语言不同,该语言并没有很多花哨的功能。更糟糕的是,某些 Autocode 语言具备的某种功能另一些 Autocode 语言却没有,使得开发者难以从一个系统转向另一个系统。
Onion 说:「有一种用于 Elliott 803 的 Autocode,但它仅支持 A + B = C 这样的表达式,所以如果你的方程很复杂,那么你就必须将其分解为不同的单个二元运算。因此那时的程序员还是需要做大量艰辛的工作。」
Herbert 表示:「Fortran 是首个真正能用于科学和数值工作的编程语言。」这使人们相信,使用高级语言(那时候他们是这么称呼的,尽管这些语言以现在的标准看还比较原始)能提升程序员的生产力。
但是,由于这些语言在编译方面需要额外的成本,而且当时的编译器本身又很低效,因此机器码在性能方面仍更占优势。不过对于科研工作而言,性能并不是最高需求;如果只需敲一些代码就能求解问题,然后再钻研下一问题,这当然是再好不过了。
Herbert 继续说:「Fortran 更像是 Autocode。现在在某种程度上仍然如此!而且很多人认为它还能做得更好。」
国际信息处理联合会(IFIP)的一个团队开始设计后来被称为「算法语言」(Algorithmic Language)的 ALGOL,即用于编写算法的语言。1958 年,他们的成果面世,这就是 ALGOL 58。Herbert 说,但是正当工程师开始为这个新系统创建编译器时,他们发现「所有的事情都还没被真正想清楚和研究透彻。」
因此出现了各种改版和修订。一个名叫《The ALGOL Bulletin》的公告详细记录了这个艰辛的历程以及他们解决或尝试解决的问题和缺点。
与如今的开源邮件列表不同,当时这个过程是以纸质形式进行的。
最后,他们发布了「ALGOL 60 报告」,而这也成为后来每个人进一步开发的根基。
当时 IFIP 的这些委员会承受了很大的压力,还因为各个国家的不同方法而倍感痛苦。美国方面的 Fortran 经验很丰富,希望得到的成果能在他们的计算机上快速应用;而欧洲人则更理智,Herbert 笑道,「他们还考虑了这门语言的美观和优雅程度。」
他补充道:「当时人们想出一些新思路,而现在我们已经觉得这些思路理所当然了,比如结构化编程。」
这门语言受到了供应商的欢迎,因为程序员可以更轻松地在不同代际的硬件设备上移植系统和代码,而不必在每次计算机更新换代时都重写各种程序。」
写在穿孔纸带上的 ALGOL 60
不过,ALGOL 60 可没法用来简单地编写出「HELLO WORLD」程序示例。这门语言有一个致命缺点:缺乏标准的输入/输出功能,这一缺点激励了后来很多语言的创新。
Herbert 说:「委员会无法在输入/输出方面达成共识。他们最后决定将其留到软件库中解决,而这个软件库取决于用户。」
Onion 补充说:「在这里,用户就是指编译器作者。」
那就没办法了。遗漏的这部分只能靠供应商自己解决,而生产商自然更偏爱自己的方案,因此最后很多不同系统之间的代码都不兼容。ALGOL 60 还有一些没有具体定义的元素,因此一开始就具备一定的妥协性。
在 ALGOL 开始应用之后,Fortran 的发展仍在继续。Herbert 说:「Fortran 世界的人看到 ALGOL 中有他们喜欢的思路,就直接将其移植了过去。」几十年后,Fortran 依然处于科学计算的中心,而 ALGOL 则更倾向于是一种学术语言,用于教授计算机科学的思想。」
Herbert 表示:「ALGOL 在科研社区得到了广泛应用,大多数大型机制造商都支持它。」
ALGOL 60 背后的某些团队继续研发,后来发布了 ALGOL 68。正如 Herbert 所说的那样,ALGOL 68 解决了 ALGOL 60 中含混未定的问题。
实际上,在上世纪 70 年代的计算机科学课程中,这门语言基本上是难以回避的。
Herbert 笑道:「它拥有世界上最奇特的输入/输出系统。」
但对于喜爱这门语言的人来说,很不幸它走到了末路。尽管有一段时间 ALGOL 68-R 在军事应用中得到了广泛的使用(尤其是英国),但直到 70 年代 ALGOL 68 的完整实现版本才出现。
《The ALGOL Bulletin》的最后版本发布于 1988 年,编辑在其中写道:「ALGOL 68 是一门非常稳定的语言。了解它的好处和优势的人仍在使用和热爱它,而其他人则无视(或误解)了它。」
ALGOL 60 本身的故事并不是这门语言的最终命运,它还启发了其它很多语言。Niklaus Wirth 和 QuickSort 的创造者 Tony Hoare 基于 ALGOL X 提案开发的 ALGOL W 后来还催生了 Wirth 的 Pascal 与 Modula-2。而 Pascal 的影响至今仍在持续。
ALGOL 60 也极大地影响了 1960 年代开发的组合编程语言(Combined Programming Language / CPL),但这门语言直到下个十年才得以实现。后来,CPL 又催生了 Basic CPL(BCPL),进而又带来了 B 语言。B 语言后来又进一步发展成 C 语言。
Tony Hoare 负责在 Elliott 803 计算机上开发 ALGOL 60 的实现版本,这个实例至今仍可在英国国家计算博物馆的机器上运行,不过在该硬件上编译和运行程序的方式与如今程序员所熟悉的开发环境有所不同。
首先,编译器必须用穿孔纸带载入程序。然后,ALGOL 程序本身会被送入纸带读取器。Onion 表示:「这个过程有点任意性,编译耗时从 30 秒到 15-20 分钟不等。」
视频:https://www.youtube.com/watch?v=AIxZ1i8pvZI
编译完成后,程序可以开始使用之前由编译器占据的空间。不过做这种事并不讨喜,因为下个用户又必须重新载入编译器才行。将其保留在内存中意味着可以运行多个程序。
Herbert 表示:「这在教学方面很受欢迎,因为你可以让学生排队使用他们写有程序的穿孔纸带。你只需要走到机器旁把 ALGOL 系统装载好,运行自己的程序,得到一些数据,然后你可以走开去思考结果,下一个学生接着运行自己的程序。」
在纸带为王的时代,Onion 认为学习编程还能提升专注能力。「当编辑、编译、编辑、编译的循环可能持续 10 分钟以上时,你必须非常关注自己的源代码……」
英国国家计算博物馆有两台 Elliott 计算机藏品,一台是 1962 年的 803B(其在一间谷仓中闲置了 15 年后被捐赠出来)以及一台 903。这两台计算机都功能完好,你可以在参观博物馆时看到它们运行。
其中由 Onion 负责维护的 803B 还带有 Calcomp 滚筒式绘图仪以及一些额外的输入/输出功能。
一个 ALGOL 程序正在绘制洛伦兹吸引子
当然,不是人人都能玩这种古董计算机,不过你还是能以其它方式体验一番 Elliott 803 或 903。MARST 将把 ALGOL 60 代码转译成 C 语言,你可以通过模拟器来体验整个 803 计算机:http://elliott803.sourceforge.net/。
尽管 ALGOL 60 已经 60 岁了,但你仍能在很多现代编程语言中找到 ALGOL 设计者曾经的想法。