【外评】为什么 ALGOL 是一种重要的编程语言?

今天,我将带领大家回到过去,回到 20 世纪 50 年代末,那时计算机科学的基础正在奠定,计算机被视为未来的发展方向。今天,当我们谈论这一时期时,FORTRAN、Lisp 和 COBOL 等名字经常会被提及。

然而,还有 ALGOL,一种在编程史上非常不起眼但却非常重要的语言。这种语言的故事值得一说。

当时的编程世界是什么样的?

那是一个与今天大相径庭的世界,主要是因为大多数编码都是用汇编语言完成的(在欧洲甚至都不用汇编语言)。如果你们有人用汇编语言编过程序,就会知道这是一个费力不讨好的过程。20 世纪 50 年代就是这样。当时,为了让编程变得更容易,人们开发了第一批编程语言。这些语言大多有特定的应用,通常与运行它们的计算机的架构直接相关。此外,这些语言以自然语言为蓝本,很难在不同平台间移植。

1955 年,在德国达姆施塔特举行了一次关于自动计算的研讨会。一些发言人谈到需要更好、更有表现力的编程语言。理想情况下,编程语言应该是一种独立于平台的算法语言,它可以让世界各地的研究人员合作开发新的计算方法。我们需要一种通用语言,这样我们就可以停止用比特和寄存器来思考问题,而开始用算法和数据结构来思考问题。

Gesellschaft fur Angewandte Mathematik und Mechanik(GAMM)或 “应用数学与力学学会 “认为这是一个好主意,尤其是通用部分。他们意识到,自己创造一种语言是可能的,但肯定不会被全世界接受。

因此,他们在 1957 年决定联系美国计算机协会(ACM),邀请他们合作。这是个好主意,因为当时美国人也开始考虑类似的想法。他们同意共同创造一种全新的语言。

ALGOL 登上舞台

ALGOL 是 Algorithmic Language(算法语言)的缩写。最初,它被称为 IAL(国际代数语言),但很快人们就意识到这个缩写不太方便。1958 年,一个由来自欧洲和美国的科学家组成的国际委员会在苏黎世召开会议,会上产生了第一个版本,这就是 ALGOL 58。它并不是今天意义上的编程语言。正如 ALGOL 的创建者之一约翰-巴克斯(John Backus)所写的那样

苏黎世 ACM-GAMM 会议创建 IAL 有两个主要动机:

(a) 提供一种在人们之间交流数值方法和其他程序的方法

(b) 提供一种在不同机器上执行固定进程的方法。

1958 年的目标是为计算机上发生的事情创建一个标准描述。虽然 ALGOL 58 有几个实现版本,但并未得到广泛认可。它引入了复合语句的概念,但其使用仅限于控制流。除此之外,它还有类型、循环、条件、过程和开关。很快,人们就发现其结果并不令人满意。

到 1959 年 6 月,显然需要开展进一步的工作,因此宣布进行广泛磋商,为另一次会议收集材料,并在会上制定新的语言版本。

美国人重点讨论了该语言的实用价值,主要是因为在美国,编程正逐渐成为一种职业,而 ALGOL 58 的实用价值并不大。然而,欧洲人提出了更多关于语言基础的建议。这就是 ALGOL 60 的开端。

是的,你猜对了。ALGOL 60,因为它是在 1960 年提出的。这次会议在巴黎举行,有 13 位科学家参加。请允许我快速介绍一下他们,以显示与会人员的水平:

  • Friedrich L. Bauer–“软件工程 “一词的创造者
  • 彼得-诺尔(Peter Naur)–ALGOL 60 报告的编辑,Backus-Naur 符号的合著者(尽管他极力否认这一点
  • Heinz Rutishauser–数学家,现代数值分析和计算机科学的先驱
  • 克劳斯-萨缪尔森(Klaus Samelson)–编译器和堆栈算法领域的先驱
  • Bernard Vauquois–机器翻译领域的先驱
  • Adriaan van Wijngaarden–荷兰计算机科学之父
  • 迈克尔-伍德格–英国首批计算机之一 Pilot ACE 的共同创造者,Ada 语言的共同创造者
  • John W. Backus – FORTRAN 的创建者(领导团队),Backus-Naur 符号的创建者,函数级编程范例的创建者(不要与函数式编程混淆–一个我从未听说过的非常有趣的概念)
  • 朱利安-格林(Julien Green)–也参与了 ALGOL 58 的工作
  • 查尔斯-卡茨(Charles Katz)–曾为第一批计算机开发编译器
  • 约翰-麦卡锡(John McCarthy)–“人工智能 “一词的创造者和该领域的研究者,并因此获得图灵奖;Lisp 的创造者
  • Alan Perlis – 第一位图灵奖获得者,因其对先进编程技术和编译器构造的贡献而获奖
  • 约瑟夫-亨利-韦格斯坦(Joseph Henry Wegstein)–从事自动数据处理和指纹识别工作,参与了 COBOL 的工作

艾伦-佩里斯是这样描述巴黎会议的:

会议让人筋疲力尽,无休无止,但又令人振奋。当自己的好点子和别人的坏点子一起被抛弃时,人们会感到很委屈。尽管如此,在整个会议期间,大家仍然孜孜不倦。13 人的化学反应非常好。在每一个有争议的问题上,大家都有自己的观点和解决方案,并用描述性的散文来支持这些观点和解决方案,其中既有技术上的巧妙,也有令人叹为观止的简单。但很少有完全取消的情况。进展是稳定的,而成果 ALGOL 60 更像是一匹赛马而不是骆驼。

照片显示的是 1960 年巴黎 ALGOL 会议的六位与会者。上排为约翰-麦卡锡、弗里德里希-鲍尔、约瑟夫-韦格斯坦。下排John Backus、Peter Naur、Alan Perlis。

想象一下,来自多个国家的十三位科学家、工程师和研究人员。每个人都就语言应该是什么样子提出了自己的想法(好吧,初步方案已在早些时候选定)。1960 年,我们面对的是一个全新的领域–因为这个领域是新的,所以没有历史带来的限制。虽然当时已经有了 ALGOL、FORTRAN 和 50 年代的适度语言,但它们在描述算法或表达能力方面都有很多不足。因此,还有很大的改进空间。有鉴于此,有必要总结出一种连贯、纯粹的语言,作为计算机科学家在日常工作中使用的基本工具。委员会提出了什么?

ALGOL 60 功能

当然,最引人注目的新特性之一是引入了块。块用关键字 begin 和 end 表示,此外,块现在有了自己的范围。这也使得最初在 ALGOL 58 中引入的复合指令得到进一步发展。

ALGOL 是第一种允许定义嵌套函数的语言,嵌套函数有自己的词法范围。

报告的作者建议实现 9 个标准函数:abssignsqrtsincosarctanlnexpentier。考虑到当代语言的标准库,这并不算多。由此可见,ALGOL 是多么纯粹。

另一个重要工具是递归。这是约翰-麦卡锡(John McCarthy)提出的,当时他刚刚完成 Lisp 的工作,并在其中加入了递归的可能性。然而,该提议引起了委员会的极大关注,与会成员拒绝引入关键字递归。最终,递归以隐含的方式进入了标准–ALGOL 规范并不禁止递归调用。

另一个令人好奇的问题是参数传递的两种策略。第一种是众所周知的逐值传递。第二种是按名称传递。在这种策略中,参数只有在出现在存储过程的主体中时才会被调用。从理论上讲,这可以带来性能上的优势,但也给编译器带来了一定的挑战。

接受 ALGOL

1960 年编写的报告非常出色,但我们不能忘记,它只是一份十几页的语言描述。没有任何参考实现。此外,ALGOL 60 根本没有规定输入和输出操作!因此,我们很难谈论用 ALGOL 60 编写的 “Hello World “程序。报告本身简洁得令人难以置信,几乎没有多余的文字,正如 Alan Perlis 所说:”ALGOL 60 是一种非常简单的语言:

就像《圣经》一样,它不仅仅是用来阅读的,更是用来解释的。

因此,如何按照规范的精神解释输入和输出操作,是摆在各个实施方案创建者面前的挑战之一。

第一个编译器是 X1 ALGOL 60,由埃德斯格-迪克斯特拉(Edsger Dijkstra,没错,就是算法讲座上的那个)和雅各布-宗内维尔德(Jacob Zonneveld)为荷兰的 Electrologica X1 计算机开发。

Electrologica X1,约 1960 年

到 1963 年,包括 UNIVAC 和 Elliot(编译器的创造者是 Tony Hoare)在内的多台当时的计算机都出现了编译器。60 年代后半期,苏联集团的计算机上也出现了 ALGOL 的实现。从 1965 年开始,您可以在 MINSK 计算机上使用 ALGOL 编程,从 1967 年开始,您可以在波兰的 ZAM 计算机上使用 ALGOL 编程。

ALGOL 最大的问题是缺乏支持。IBM开发的FORTRAN虽然没有ALGOL先进,但得到了母公司的全力支持。IBM 自己编写了后续平台的参考实现,使其看起来更适合商业应用–它是标准化的。

罗伯特-贝默(Robert Bemer)在 1961 年是这样评价这种新语言的:

似乎不存在合理的维护机制。似乎没有人能回答 “ALGOL 是什么 “这个基本问题。我预见 ALGOL 将面临一段艰难的时期,除非设计出一种经过修订的维护程序。这种语言太笼统,有太多含糊不清之处。

Bemer 说得没错,报告确实有几处遗漏,而且缺乏纠正这些遗漏的机制。最终,无论是 ALGOL 的创建者还是对 ALGOL 感兴趣的人都没有建立起支持机制或开发机制,导致了 ALGOL 68 的失败,并被社区所拒绝。

虽然 ALGOL 没有取得惊人的商业成功,但科学家们对它的接受程度却非常热烈。因此,在接下来的二三十年里,ALGOL 成为了描述算法的主要语言。其简洁而富有表现力的语法为人们之间的交流提供了便利。

然而,由于缺乏参考实现,这种语言很难用于人机交流。由于美国的计算机行业比欧洲发达得多,因此在美国,实用性是最重要的考虑因素。支持和兼容性问题至关重要。然而,在欧洲,计算机科学几乎完全是研究中心的事情。科学家们有不同的优先考虑,而新语言非常适合研究算法。因此,ALGOL 在旧大陆受到了更好的欢迎。

ALGOL 的遗产是什么?

ALGOL 对后来的语言产生了巨大的影响。它启发了大多数命令式编程语言。其中比较重要的有 Pascal、Simula(第一种面向对象的语言)和 C。

从本质上讲,后来的所有编程语言都包含了代码块和递归。ALGOL 68 的工作还带来了大小写表达式、记录和引用的概念以及逐项引用(pass-by-reference)。

ALGOL 60 是第一种以 BNF 或 Backus-Naur 形式定义的编程语言。它基本上是从已定义的概念出发来构建语言–尽量少参考自然语言。

一般格式为:

<metalinguistic variable> ::= <form>

举个简单的例子:

<digit> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

更复杂的例子:

<if clause> ::= if <Boolean expression> then
<unconditional statement> ::= <basic statement> | <compound statement> | <block>
<if statement> ::= <if clause> <unconditional statement>
<conditional statement> ::= <if statement> | <if statement> else <statement> | <if clause> <for statement> | <label>: <conditional statement>

第一个例子看起来并不令人印象深刻,但第二个例子却能让人更好地理解其中的可能性。有了这个符号,人们就可以在没有外部上下文的情况下有效地描述编程语言。从那时起,这种符号及其发展已经成为描述编程语言的标准。你可以在 Python 或 JavaScript 中随处看到它。

ALGOL 推动了编译器的发展。最早的编译器只是简单地将公式翻译成机器代码,但 ALGOL 需要更多的东西–程序、可变大小的数组或递归不适合顺序翻译技术。为了正确、高效地实现它们,必须开发新的、更先进的编译技术。

所有这些都说明,虽然 ALGOL 已经完全过时,但它是一种非凡的语言。为其开发和实施所付出的努力将计算机科学提升到了另一个高度。可以想象,发展是不可避免的。不过,在我看来,由于 ALGOL 的质量,它的发展速度更快一些。许多概念可以毫不费力地移植到其他编程语言或进一步发展–这正是我们今天受益的地方。

Sources:
On the ALGOL Effort
ALGOL Sessions – Alan J. Perlis
Revised report on the algorithmic language ALGOL 60

 

本文文字及图片出自 Why ALGOL was an important programming language?

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

发表回复

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