电影《阿甘正传》里讲,人生就像一盒巧克力,你永远不知道下一块是什么滋味。想想看,那些让我们惊叹的人和事,它们背后的故事又是怎样的曲折离奇呢?在编程领域,你听说过 John Warner Backus 吗?对,就是 FORTRAN 和 BNF 这些编程语言的奠基人。他是 1977 年图灵奖的得主,名副其实的计算机界传奇啊!但你知道吗,早些年的他可是个天不怕地不畏的校园混混,干了不少只有混混才能做的出的勾当,最后被学校轰了出去。谁又能想到啊,一个被逐出校门的小混混,最后竟然成了计算机界的泰斗呢?
相比于当计算机科学家的Backus,他的父亲老Backus更加传奇一些。老Backus在阿特拉斯火药公司工作,但那工厂老是出事故,总是爆炸个不停。如果是普通公司,炸就炸了,你一个火药公司,能随便炸么?老巴克斯年少有为,他意识到问题可能出在从德国进口的那些昂贵温度计身上,说服公司派他远渡重洋去学习制造技术。回来后,一批新温度计解决了工厂的安全问题,老巴克斯也由一个普通工人变成了公司首席化学家。
第一次世界大战期间,美国军火公司火爆生意,老巴克斯也小有名气。战后,他没得到承诺的好职位,有点不爽,就转行当证券经纪人,意外地发了一笔大财。所以,有了这么好的父亲,小Backus的童年少年时代过得相当不错,是个富二代。
在费城度过童年后,他去了宾夕法尼亚州的希尔学校。但他学习不感兴趣,整天盼望着暑假去新罕布什尔州的夏令营玩耍。结果学习成绩很烂,勉强毕业。后来进了弗吉尼亚大学,但因为不想学习,加上二战爆发,更是三心二意,只想去参军。结果被学校开除了。后来参军,当了个下士,领着个防空小队。
在军队里,他在一次能力测试中表现出了聪明才智,得到了上级的认可,军方决定送他上学深造。这样,他就没有去打二战,而是上了哈弗福德学院的医学预科。但他对医学没兴趣,觉得同学们都只会死记硬背,不会思考。于是只学了9个月,就退学去哥伦比亚大学学数学。
从那时候开始,巴克斯逐渐明白了自己要什么,也开始努力学习。1949年拿到了学士学位。但毕业后,他还是不知道自己要做什么。幸好有一次到IBM公司参观,看到了早期的 SSEC 计算机。虽然那机器还不是真正的电子计算机,但他立刻被那儿的工作环境吸引住了。第二天就向 IBM 公司提出了求职申请,经过测试后,他就开始了在 SSEC 上的三年工作。
人们称巴克斯为“不知疲倦的发明家”,这一称号实至名归。进入IBM后,巴克斯全身心投入工作。他接手的第一个重大项目是计算“月历”,这是一个相当复杂而困难的问题,因为月历需要精确计算出一年中任一时刻月亮的位置坐标。巴克斯出色地完成了这一任务。
随后,巴克斯与同事海尔里克(H. Herrick)成功开发出一个名为Speedcoding的程序,用于浮点数运算。众所周知,浮点运算比定点运算复杂得多,浮点运算部件的设计与实现也更加困难。因此,早期计算机大多没有浮点运算部件。然而,许多科学与工程计算问题需要处理非常小或非常大的数,该如何解决这一问题呢?计算机先驱冯·诺伊曼提出可以对定点数附加“比例因子”使其成为浮点数,从原则上解决了这个问题,但却给程序员带来了新的难题:在无法确切知道计算中间结果和最终结果范围的情况下,如何设定比例因子?如果比例因子取值过小,运算会发生溢出;如果取值过大,则会影响结果精度。这成为当时程序设计的一大难题。
巴克斯和海尔里克的Speedcoding成功解决了这个难题,它可以根据具体问题自动设置和调整比例因子,免除了程序员在这方面的麻烦。
月历程序和Speedcoding程序的成功奠定了巴克斯作为出色程序员在公司的地位,赢得了同事的尊敬和上司的器重。然而,巴克斯始终不满足于现状,总是寻求变革和创新。由于用机器语言(即二进制代码0和1)进行编程和调试带来的诸多弊端,如效率低下、难于检查和发现问题、不便于交流以及高昂的软件开发费用等问题,巴克斯经过深思熟虑,于1953年向IBM的老板卡斯伯特·赫德(Cuthbert Hurd)提交了一份备忘录,建议设计一种接近人类语言的编程语言来取代机器语言,从根本上提高编程效率并降低编程费用。
意想不到的是,巴克斯这一对计算技术发展产生重大影响的历史性建议,遭到了当时担任IBM公司顾问的冯·诺伊曼的强烈反对。由于对程序设计的高昂费用和代价不太了解,冯·诺伊曼认为巴克斯的建议既没有必要也不切实际。幸而赫德比较开明且富有远见,虽然冯·诺伊曼的声望和地位远高于巴克斯,但他还是支持了巴克斯的提案,批准了他的计划,使Fortran的诞生成为可能。
经过巴克斯和他的同事们的艰苦努力,1957年4月,Fortran(“公式翻译器”,即formula translator的缩写)的编译器在西屋电气公司订购的704计算机上首次成功运行。这标志着机器语言编程时代的结束和高级语言编程时代的开始。Fortran语言主要用于数值计算,其特点是接近数学公式,简单易用,功能逐步扩展,如支持复型和双精度浮点运算、子程序定义机制、输入输出格式说明、布尔表达式、函数和子例程名作为参数传递等。
作为世界上第一个高级程序设计语言,Fortran对后来的上千种高级程序设计语言产生了或大或小的影响,它本身也经历了许多重大的变革和版本更新。据不完全统计,从20世纪50年代诞生至今,Fortran共出现过90多个版本,其中较为流行的主要版本有Fortran I,1958年推出的能处理子程序并可与汇编语言连接的Fortran II,1962年问世的Fortran III,1966年推出的第一个Fortran语言标准Fortran 66,20世纪70年代修订的Fortran 77,以及1991年ISO批准的新标准Fortran 90等。
还有许多为了满足特定问题需求而对Fortran加以补充或修改的高级程序设计语言,都是Fortran带起来的,其中比较著名的包括:
- CFD语言(Computational Fluid Dynamics, 计算流体动力学语言):美国阿姆斯研究中心的计算流体动力学分部对Fortran进行了逻辑扩充,并在ILLIAC III计算机上实现。该语言依赖于能够执行向量及标量指令的机器语言,与机器相关。
- Code and Go Fortran:这是Fortran III的一种改进版本,主要为了快速编译和执行。
- CONTRAN语言(Control Translator):这是一种综合了Fortran III和ALGOL 60语言许多特点的高级语言。
- LRLTRAN (Lawrence Radiation Laboratory Translator, 劳伦斯辐射实验室翻译程序):劳伦斯辐射实验室根据其特定需要,在CDC公司的STAR-100计算机上开发的一种基于Fortran的高级语言。STAR-100是20世纪70年代中期推出的一种大型快速计算机,特别适合于科学计算和系统程序设计。
- PFOR语言:在宝来公司(Burroughs)为美国国防部研制的PEPE计算机系统(Parallel Element Processing Ensemble,并行单元处理组合系统)中,其核心软件是一种并行的Fortran语言。
此外,还有适用于有理函数计算的ALTRAN,适合处理向量与矩阵的VECTRAN等,都是在Fortran基础上设计和开发的,属于Fortran家族的“始祖”。特别值得指出的是,尽管出现了成百上千种高级程序设计语言,绝大多数一经问世便未曾流行,有些风行一时却很快销声匿迹,然而Fortran至今依然保持着强大的生命力,这表明它在设计与实现上取得了巨大的成功。
附带一提,冯·诺伊曼于1957年不幸英年早逝,未能看到Fortran正式投入使用。但这位出生在匈牙利的天才科学家后来意识到了自己在此事上的错误,没有坚持反对巴克斯的计划。
基于Fortran的巨大成功,1958年5月在苏黎世举行的一次国际性计算机会议上,决定成立一个委员会,以Fortran为基础进行进一步改进,形成一种单一、标准化的高级程序设计语言。许多著名计算机科学家参与了该委员会,工作成果是Algol 58及其后续版本Algol 60等。巴克斯也参加了这个委员会,并对Algol融入的新概念和新功能(如局部变量和递归)感到由衷高兴。
然而,凭借开发Fortran的经验,巴克斯的关注点转向了如何清晰地描述和表达编程语言的问题,即创建一个“元语言”(metalanguage)。经过不懈探索,1959年6月,在联合国教科文组织(UNESCO)于巴黎召开的关于程序设计语言的语法和语义的会议上,巴克斯在提交的一篇论文中提出了如今众所周知的“巴克斯范式”(BNF, Backus Normal Form)。巴克斯范式以递归方式描述语言中的各种成分,凡遵守其规则的程序即可保证语法上的正确性。由于其简洁、明了和科学,BNF被广泛接受,成为描述各种程序设计语言的最常用工具。
现在我们看到的各种程序设计语言文本中的BNF是Backus-Naur Form,即巴克斯-诺尔范式。这是经丹麦数学家彼得·诺尔(Peter Naur)改进和完善的巴克斯范式,实际上,大多数BNF版本又是经瑞士著名计算机科学家尼克劳斯·沃思(N. Wirth)扩充的扩展巴克斯-诺尔范式(EBNF, Extended BNF)。沃思是1984年图灵奖获得者。
我们目前常用的高级程序设计语言大多属于冯·诺伊曼型语言,即面向过程的语言,以“逐词逐句”的方式工作。巴克斯后来致力于开发非冯·诺伊曼型的语言,即函数式语言(functional language)。这种语言的主要成分是原始函数、函数型和定义函数。程序本质上是函数,作用于结构化数据上并产生结构化结果。用这种语言编写的程序结构清晰,便于使用代数方法研究程序的特性。巴克斯后来推出了一种名为FP的函数式程序设计系统,成为函数式语言的典型代表。
此外,巴克斯也是归约机(reduction machine)这一不同于冯·诺伊曼体系结构的新计算机架构的首创者。1972年,巴克斯在为IBM公司撰写的研究报告“归约语言及无变元的程序设计”(Reduction Languages and Variable Free Programming)中首次提出了归约的概念。归约的基本思想是在函数的计算过程中通过替换不停地修改计算目标,直到目标已经是最小单元为止。这种方式不再有变元的概念,所有目标均通过计算获得。这一过程与纯函数的递归计算过程的代入方法相接近,因此可以将归约机的研究与函数式程序设计语言的研究结合在一起。
归约机的结构通常包括递归机构和替换机构,归约方式则分为串归约和图归约两种,前者实现按值调用,后者实现按引用调用。巴克斯的论文发表后,一批学者致力于归约机的研究与开发,相继推出了如GMD(Berklin, 1975)、Cellular(北卡罗莱纳大学Mago, 1979)、AMPS(R. M. Keller, 1979)、ALICE(J. Darlington, 1981)等各种类型的归约机。其中,以树结构的Cellular最为引人注目。
巴克斯凭借上述一系列重大成就获得了诸多荣誉和奖励。除图灵奖外,他还于1967年获得IEEE的W. W. McDowell奖,1975年被授予美国全国科学奖章(National Medal of Science),1994年美国工程院授予他Charles Stark Draper奖。巴克斯是美国科学院院士和美国工程院院士。
巴克斯于1977年10月17日在西雅图举行的ACM年会上接受了图灵奖。ACM评奖委员会主席萨梅特(J. E. Sammet)致辞并授奖,巴克斯随后发表了题为“程序设计能从冯·诺伊曼形式中解脱出来吗?函数式风格及其程序的代数”(Can Programming be Liberated from the von Neumann Style? A Functional Style and Its Algebra of Programs)的演讲,详细介绍了他所开发的FP及其意义。
约翰·巴克斯 (John Backus) 于 1991 年退休。他于 2007 年 3 月 17 日在俄勒冈州阿什兰的家中去世,享年82岁。
AI驳斥栋哥标题党:没有公开的记录或资料显示约翰·巴克斯(John Backus)曾经是花花公子。约翰·巴克斯是一位杰出的计算机科学家,以发明Fortran(Formula Translation)编程语言而闻名,这是世界上最早被广泛使用的高级编程语言之一。他于1924年出生,2007年去世,因其在计算机科学领域的贡献而获得了众多荣誉和奖项,包括1977年的图灵奖。关于他私生活的描述多集中于他的专业成就,而非与“花花公子”形象相关的任何内容。因此,可以合理推断这一说法并无依据。