新智元报道
编辑:Aeneas 好困
【新智元导读】Euler和Pascal语言发明者、1984年图灵奖获得者Niklaus Wirth在24年的第一天离开了我们,许多开发者都为他编程语言的简洁所惊叹。
2024年的第一天,又一位图灵奖得主离开了我们。
Niklaus Wirth于1月1日去世,世界失去了编程语言、编程方法、软件工程和硬件设计的泰斗。
Niklaus E. Wirth是一位瑞士计算机科学家,他因在编程语言设计方面的杰出贡献,包括创建了Pascal语言,以及在软件工程领域的一系列开创性工作,荣获了1984年的图灵奖。
除了图灵奖外,Wirth还在1988年获得了IEEE计算机先锋奖,以及IBM欧洲科学技术奖。
并于1992年成为瑞士工程科学院院士,在1994年被选为美国国家工程学院院士。
Wirth在计算机科学领域撰写了十几部著作,包括1975年的《Algorithms + Data Structures = Programs》(算法 + 数据结构 = 程序)、1986年的《Algorithms & Data Structures》(算法与数据结构)、1995年的《Digital Circuit Design》(数字电路设计)和1996年的《Compiler Construction》(编译器构建)。
网友们痛心表示:让我们哀悼这位先驱、同事、导师和朋友。
「我喜欢《编译器构造》这本书。Wirth对简洁的强调,对我是巨大的启发。」
「Pascal是我在迷上Fortran和BASIC后,喜欢的第一种语言。」
生平
Niklaus E. Wirth在瑞士长大,并在苏黎世的瑞士联邦理工学院(ETH)度过了职业生涯的大部分时间。
1959年,他在ETH获得了首个学位,随后前往北美深造,并于1963年获得了UC伯克利的博士学位。
在斯坦福大学任教一段时间之后,他于1968年返回ETH。
1981年,他是创建世界顶尖计算机科学系的关键人物,并在1980年代的大部分时间里,担任该系的系主任。
1999年,Wirth退休了,但他还继续在校园里,频繁露面了很多年。
两种编程语言
之所以在计算机科学界崭露头角,是因为他创造了两种编程语言:一种是基于他博士论文工作的Euler,另一种是为IBM System/360系列计算机设计的系统编程语言PL360。这两种语言都深受Algol语言的影响。
Wirth是lgol项目的国际精英团队的成员之一,就是在这个团队的共同努力下,才定义并实现了一系列语言标准。
他取得了许多开创性成就,将编程语言的语法与语义明确区分,开发了新颖的实现技术,为了特定的解析方法进行了精细的语言设计。
早期的高级语言(比如FORTRAN),因为能显著简化应用程序的编写和维护而广受欢迎。
然而,对计算机公司来说,这些语言难以实现,原因是当时的硬件条件非常有限,编译技术还不够成熟,而这些语言或是设计粗糙,或是过分复杂。
Algol小组最杰出的成果Algol 60,引入了递归函数、结构化代码块和局部变量的概念,率先正式描述了编程语言的语法结构。
在1957年,计算机科学界尚未建立起学术部门和定期的学术会议,而Algol项目为这一新兴学科的发展打下了重要基础。
通过参与Algol项目,Wirth与包括C.A.R. (Tony) Hoare、Edsger Dijkstra和Peter Naur在内的未来图灵奖得主们进行了合作。加入这个团队,他们需要展示自己在编译器和其他系统软件设计方面的杰出才能。
当时计算机科学家们面临的最大挑战,就是这些软件的开发。
不过,1966年时,Wirth和Algol小组发生了分歧。
Wirth提出将Algol 60结合他自己设计的语言EULER进行扩展和改进,Algol小组给这个提案投了反对票。他们选择了一个竞争方案Algol 68,这个设计异常复杂,包含了许多创新但难以实现的功能。
在1968年,Wirth选择离开了这个小组。随后,他与Tony Hoare合作,把这个未获采纳的提案发展成了一个新的非官方Algol版本,即Algol-W。
Pascal的诞生
以Algol-W为基础,Wirth开发出了他最具影响力的编程语言——Pascal。
Pascal的设计遵循了Wirth的个人审美:简洁、灵活,可以快速地编译出高效的代码。它继承了Algol的代码结构、逻辑完整性以及对递归的支持,同时将复杂的东西简化,添加了对复杂和用户自定义数据类型的支持。
Wirth后来指出,他遵循的一个重要原则是:「只包括那些被深入理解的特性(尤其是对于开发者而言),忽略那些尚未尝试和实现的特性。」
1971年,苏黎世联邦理工学院开始采用Pascal进行教学,同时Pascal迅速传播到了其他大学。
为了在不同类型的计算机上运行Pascal,Wirth设计了一种新型的编译器,这种编译器能为虚拟机编写代码,并且在虚拟机上运行。
只需在新计算机上模拟这个虚拟机,就可以轻松地移植他的编译器。
随着个人计算机的广泛普及,Pascal很快成为了主流编程语言。它的简洁和高效非常适应个人计算机有限的内存和磁盘空间。
Borland推出了价格实惠、编译速度快的Turbo Pascal编译器,进一步巩固了Pascal在1980年代作为个人计算机软件开发中,领先的高级编程语言的地位。
在20世纪70年代,Wirth和其他Algol项目的资深成员,如Edsger Dijkstra和Tony Hoare,一起致力于研究编程方法论和形式方法。
他参与了国际信息处理联合会 (IFIP) 编程方法学工作组的工作,提倡通过逐步精化代码的方式,来补充他们提出的结构化编程的各种理念。他的著作《系统化编程 (Systematic Programming) 》和《算法 + 数据结构 = 程序 (Algorithms + Data Structures = Programs) 》,对于编程方法和概念贡献极大。
亲手打造系统的顶级科学家
不同于许多同行,Wirth一直是一个全面的实践型系统构建者。他在学术工作的细分领域中不懈努力,取得了显著的成就,并成功地阻止了将语言设计、操作系统、硬件、图形和网络划分为不同专业领域的趋势。
在20世纪50年代和60年代初,许多具有深远影响的软件系统,都是由小型的学术或工业团队为了解决实际问题而开发的。
然而,到了70年代和80年代,工业软件的规模大幅增长,大学与企业实验室的计算机科学研究则更多转向理论和基础研究。
在这样的背景下,像Wirth这样尝试亲手打造完整生产级系统的顶级计算机科学家就变得格外罕见,尤其是在大学环境中。
休假回来,构建了Lilith
1976年,Wirth在施乐的研究中心(PARC)休假期间,受到了新兴工作站技术的启发,回到ETH后领导了一个项目,目标是构建一款全新的图形工作站。
这款工作站名为Lilith,它提供了一个完备的计算环境,配备了Medos操作系统、高速局域网、包括文本和图形编辑器在内的应用软件,以及激光打印机。
Lilith的新编程语言Modula-2在Pascal的基础上增加了对并发处理和代码模块化的支持。
到了1980 年,第一批Lilith系统已经投入使用,在ETH以及其他一些大学推广开来。
几年后,他再次展示了自己的非凡才华,领导开发了Ceres工作站及其操作系统,同时还创造了新的面向对象编程语言和操作系统Oberon。从1980年代中期到1990 年代,ETH多次使用这些技术。
尽管Modula-2和Oberon没有Pascal那样广泛的影响,但它们被迁移到商业计算机上,并应用于计算机科学的教学。Oberon在不同类型的计算机上实现了程序的可移植性,这种特性后来被Java发扬光大。
1980年代,Wirth对硬件设计的参与更加深入。计算机硬件和软件的设计都充满挑战,大部分人只能专注一个领域,但Wirth却能两者兼顾。
他紧跟最新技术,利用现场可编程门阵列(FPGA)——一种可以根据特定应用重新编程的特殊芯片——开发了语言和工具,使得从高层规范出发能够高效地配置FPGA。
因为他,ETH成为特殊的地方
在MIT、剑桥大学和曼彻斯特大学的计算机科学团队停止自主制造计算机和操作系统数十年后,Wirth使得ETH成为一个特殊的地方。
在这里,计算机科学学生和教师用的是内部生产的硬件、操作系统和编程工具。
Wirth坚信,在学生尝试写代码之前,他们应该先阅读并理解真实系统的代码。
他一生都在追求简洁、优雅和高效的系统,这正符合他「将理论与实践相结合」的承诺。
在Wirth1984年的图灵奖讲座中,他提出了一个观点——
我们必须从一开始就辨清哪些是核心要素,哪些是暂时的,并且要确保这些暂时的元素永远不会影响到核心设施的系统性和结构化设计。
他说,每个项目本质上都是一个学习的试验场。创新是学习的最好方式。只有亲手进行开发项目,我才能深刻理解困难所在,并有信心克服这些困难中的每一个细节。
能够创建复杂高效的系统,是源于他对简洁之美的不懈追求——究竟哪些是非必需的。
随着时间的推移,他在语言设计和编译技术上的成就,变得更为简明和高效,这与大多数情况下软件变得更慢、更复杂形成鲜明对比。
他在1995年提出警告:「软件膨胀并非不可避免的自然现象,遏制这一现象正是软件工程师的责任。」
名言
– 实际上,一个程序对其目标的变化(通常称为可维护性)和对环境变化的适应性(现称为可移植性)主要可以通过其结构的整洁性来衡量。
– 但是,真正积极的编程活动涉及的是新程序的设计,而不是对旧程序的反复思考。
– 很明显,编程课程应当教授设计与建造的方法,而且选用的例子应该能够清晰地展示出程序逐步发展的过程。
– 在逐步细化的过程中,应尽可能长时间使用与当前问题直接相关且自然的表示法。
– 经验告诉我们,编程课程是否成功,很大程度上取决于这些示例的选择。
– 在实际的计算机编程领域,一个程序一旦运行正确且表现满意,就永远不再更改,这种情况其实是非常罕见的。
– 编程通常是通过实例来进行教学的。
参考资料:https://amturing.acm.org/award_winners/wirth_1025774.cfm