近看图灵碗

计算机历史 专栏收录该内容
1 篇文章 0 订阅

. 引言 

人们总是这样介绍图灵奖:这是计算机科学界的诺贝尔奖。不难看出,诺奖已经彻底符号化了,这个名词本身,就代表着知识界的顶峰,相比之下,其内容 已是次要。用它来形容图灵奖,就暗藏了一个可怕的隐喻,图灵奖也将被符号化,人们只关注它的象征意义,而不是它背后的那些天才成果。所以我不喜欢这个比 喻,却更想这样解释图灵奖:它代表着计算机科学历史上,那些最耀眼的杰作。 

不知道有多少有心人留心过图灵奖的奖杯,那是一个银碗,外形朴实得很,但色泽却光彩夺目。 
 

这种亮得晃眼的碗,中国古代也有一种,就是定窑的白瓷碗。现在几乎公认,宋瓷是中国瓷器艺术的巅峰之作,定窑作为宋朝的五大名窑之一,在艺术上的 造谐是极为杰出的。可是,当朝皇帝却不喜欢定窑的碗,“本朝以定州白瓷有芒不堪用”,就因为它太亮,没法用。 

图灵碗也是“有芒不堪用”,它们太亮太耀眼,几乎没有哪项图灵奖的成果,能够直接应用于日常生活。但是,正如这并不妨碍定州白瓷成为艺术极品,图 灵奖的作品,也同样值得我们拿着放大镜细细品味,感叹它们的美。计算机科学不是关于计算机的,它也不只是一门科学,的确,它是一门艺术。 

掐算下来,从1966年到2009年,图灵奖已经走过了近半个世纪,这也是计算机科学走过的半个世纪,获奖成果串连起来,就是一部计算机科学史。 这条旅途跌宕起伏,光影变幻,人类历史上从没有过哪个学科,在破壳而出后的短短半个世纪里推进如此之远(如果不把量子物理看成独立学科的话)。 

接下来,我们大家就结伴同行,去近看这55个图灵碗。它们中的每一个,都是铭文清晰,包浆温润,我索性客串一名掮做,为大家逐一解说这些令人享受 的巧夺天工之作。那些捧得图灵碗的大师,每一位都是成就等身,篇幅所限,我们不能历数,只介绍他们直接赢得图灵奖表彰的工作。在这些前贤面前,我是走狗一 只,初出茅庐,还不知两分天下,所以文中错误难免,还请读者海涵。 

好了,来,让我们开始吧,先屏住呼吸,将时间拨回1946年……好好好,我知道计算机科学人士看到这个年份就不耐烦了,那我们就再将“年针”拨一 圈,来到1958年。对1946年之后几年的计算机发展史不熟悉的读者也别着急,需要提到的知识,我们都不会漏掉的。好了,睁开眼睛,旅途从这里开始了。

 

一. 从苏黎世到巴黎(上) 

我们的旅程从世界花园瑞士开始,1958年5月27日,苏黎世过完了六鸣节,到处春暖花开。就在4年前的这个季节,图灵离开了人间。 

这一天,一场8个人的讨论会将在苏黎世召开,没有花,没有酒,连个专门的会议名称都没有。会议桌的一边,是美国计算机学会(ACM)的4名代表, 另一边是德国应用数学和力学学会(GAMM)的4名代表,索性把地点和双方名称连起来,就叫苏黎世ACM-GAMM会议。后来的历史将会证明,这场毫不隆 重、甚至不太圆满的会议,改变了此后的计算机科学,特别是对于1922年成立的GAMM来说,这场会议几乎成了它唯一的光辉事迹。8名代表陆续抵达了苏黎 世,他们将要在此讨论,规划一种新型的编程语言,叫作国际代数语言(IAL)。 

在电子计算机刚刚出现时,想让它干活十分不容易,关键的问题就在于,计算机听不懂人类语言。既然没法让计算机说人话,人们只好使用机器语言跟它们 沟通。 

 

左手是电线,右手是开关,这就是最早的机器语言(图为1946年的ENIAC计算机)。程序员先在纸上把程序设计好,然后进行持续数周的扳开关和 接电线的工作,读者如果做过数字电路的课程实验,就能体会到那是怎样的麻烦,万一哪根儿线断了,排查起来那就是恶梦的样板。后来,程序员们有了新方法,把 程序设计成打孔卡片(有孔没孔就是二进制),于是编程的主要工作变成了打孔,大家要是有兴趣,把自己身份证号码转成二进制,打在纸条上,看看是什么滋味。 打一个数尚属不易,打一个程序就不难想象了。再后来,冯诺伊曼提出的存储程序实现了,人们把程序像数据一样保存在机器里,随时调用,编程从这时起才正式变 成脑力劳动。但别高兴得太早,虽然不用接电线和打孔,但编程还是要用0101001111,就像《麦兜的故事》里面麦太太说的,鸡包纸包纸包鸡包鸡包纸包 再包鸡鸡鸡。这种程序,编的时候只有作者和上帝能看懂,过一阵子之后,恐怕只有上帝能看懂了。随后,人们把一些常用的指令用一些“助记符”来代替,有了 ADD、MOV这样的写法,形成了汇编语言,但本质上跟鸡包纸包鸡还是同一码事。 

1953年,IBM公司的巴科斯(John Backus)再也忍不下去了,这哪里是编程,这不跟受刑一样么。他揭竿而起上书董事长,要为IBM704系列计算机开发一种新型编程语言。号称计算机之 父的冯诺伊曼当时是IBM的顾问,他坚决认为这个提议十分不靠谱,但也许是应了有心人天不负,董事长Hurd同意了这个计划。 

 

巴科斯1924年出生在美国费城,他的父亲是一家火药公司的员工。巴科斯小时候不爱读书,勉勉强强混了个中学毕业,进入弗吉尼亚大学学习化学,成 绩依然很不好。二战爆发后,巴科斯参加了美国陆军,在Haverford学院(这可不是哈佛)接受医疗训练,准备治病救人,结果别人没救成,倒是发现自己 长了一个脑瘤,于是接受了手术。后来,巴科斯打算当一名无线电技术员,在训练过程中,突然对数学产生了极大的兴趣,于是进入哥伦比亚大学学习数学,于 1949年获得硕士学位,进入了IBM公司工作。 

巴科斯开发新语言的提议得到了批准后,立即组建了一个开发小组,并担任组长,主持开发工作。1957年,第一套Fortran语言诞生了,尽管呱 呱坠地时哭声不响,第一次演示就出了编译错误,但还是坚强地活了下来。本文不是编程教材,对于Fortran的具体细节,就不过多叙述了,但是我们要记住 这个名字,因为它是非常耀眼的。Fortran是世界上第一个被正式应用的高级语言,所谓高级语言,是说它的语法更接近人类语言,而不是鸡包纸包鸡。从此 以后,程序员不必再背那些枯燥的机器码,只需用“IF (x > 0) THEN x = 0”这样的简单易懂的方式编程,可想而之它的推出让人多么兴奋。在电影《硅谷海盗》中,微软CEO鲍尔默讽刺说,要想激起比尔盖茨的性欲,必须这样叫 床:Oh!Fortran~Oh~For~~Tran~。直到如今,经过多年改进的Fortran仍然在计算机界占有一席之地,不知道知天命之年的 Fortran是否会记恨,当年冯诺伊曼差点把它掐死在摇篮里,戏剧的是,就在第一套Fortran诞生之前两个月,冯诺伊曼因癌症去世了。关于 Fortran就先说到这里,尽管它光辉夺目,但对于本文来说,它只是配角。在上世纪 50年代末,编程语言的矛盾已经白热化,并非Fortran一己能够力挽狂澜。况且Fortran本身还有一个严重缺陷,它为IBM704而生,依赖特定 的机器型号,很难移植到别的机器上。革命尚未成功,同志仍需努力,在这个时候,ACM和GAMM都对编程语言有一些想法,于是他们决定坐在一起讨论讨论, 规划一种更好的语言。苏黎世讨论会就是在这样的背景下召开的。 

Fortran语言之父巴科斯这回又没闲着,作为ACM的代表之一,他也来到了苏黎世,想再次参与锻造新刀。这次制定语言,主要有两个原则,第一 点毫无疑问,要使它更容易被人类理解,这是一直以来的革命方针;第二点,是要弥补Fortran的一些不足,主要是要具有通用性,兼容不同型号的机器。 

讨论会开始了。由于只有8人,不必拘泥形式,再加上诸位代表都是理工背景,说起话来锱铢必较,这场讨论,注定激烈无比。 

为了描述即将诞生的国际代数语言,巴科斯用他带着重重鼻音的费城口音,首先提出了一套用来描述语言的语言,称为巴科斯范式。我们知道,学英语的时 候,有一些“主+系+表”之类的句套子,对学习英语有很大帮助。对于计算机语言,也需要这样的句套子来描述它,巴科斯范式就是为了描述IAL而提出的。当 然这个范式并非这么简单,它也能描述其它编程语言,甚至一部分自然语言,是一套非常了不起的设计。 

有了巴科斯范式,8名代表你一言我一语,将自己在设计语言方面的经验倾囊而出,开始制定国际代数语言的标准。正所谓众口难调,每个人都对自己心中 的新语言有着自己的观点,大家很快就陷入了争执,谁也不让谁,抢着用飞快的语速反驳对方,屋里的空气陷入了紧张,一个接一个的“IAL”、“IAL”、 “IAL”飘在空中,不停地游荡。这时,ACM小组的主席艾伦佩利(Alan Perlis)突然瞪着圆圆的眼睛大声说:停!你们难道没发现“IAL”这个词很绕嘴吗? 

 

佩利比巴科斯大两岁,1922年出生于美国匹兹堡,与巴科斯的家乡费城同在宾夕法尼亚州,俩人也算是半个老乡。佩利虽然出生在愚人节,但他一点儿 也不笨,比起巴科斯,佩利可算是年轻有为。无巧不成书,佩利初入大学时也是化学专业,他在21岁时,获得了卡内基理工学院的化学学士学位,这个学院就是现 在美国计算机专业排名第一的著名学府,卡内基梅隆大学。与巴科斯巧合的是,刚刚走出大学校园的佩利,看到满街都是征兵海报,看到山姆大叔紧盯着他说“I want you”,看到珍珠港事件后神经绷紧的美国,也选择了参军。更加惊人的巧合是,佩利也是在服役期间突然对数学产生了强烈兴趣,并转而攻读之。1950年, 他在麻省理工学院获得了博士学位。两年后他来到普渡大学,出任普渡大学计算中心首任主任,在普渡安装了IBM CPC计算机,并为其设计了一个叫作IT(Internal Translator)的编程语言。过了四年,这个毕业才6年的34岁年轻人,又一跃当上了卡内基理工学院第一任计算机科学系主任,为卡耐基配置了IBM 650,顺便把IT语言移植到650上。这些工作使佩利在程序语言的设计方面,有了许多经验和体会,所以在ACM成立这个程序设计语言委员会时,佩里坐上 了主席的位置。诸位读者,假如这个惊人的成长步伐让您吃惊,那您可要好好地适应一下了,在我们这个系列的文章中,比比皆是这样的天才人物,会让您脊背发 凉。 

言归正传,我们刚才说到,佩利在讨论时,认为“IAL”这个词很绕嘴。假如他懂一点中文,没准还会发现,这个词一旦读快起来,很像汉语中的“哎 哟”。佩利扶了一下眼镜,继续说道:我想不明白为什么要起这么个名字,不但很绕嘴,而且狂妄自大,不就是个语言么,何必扯虎皮做大旗,叫什么“国际语 言”?佩利此言并无它意,然而他一心只顾着说,没有注意到身边的巴科斯此时已是脸红耳热,巴科斯所在的公司,早在1924年还在卖人口统计卡片的时候,就 “狂妄自大”地改名叫作国际商用机器公司。 

尽管佩利认为IAL这个名字既绕嘴又狂妄,但其他代表却觉得这个名字好听又大气,再说这又不是什么要紧的事,何必在这上面浪费口舌。这件事情仿佛 成了插曲,直到五天后会议结束时,新语言的名字仍然是IAL,并写进了会议总结。也许这些代表怎么也没预料到,佩利在一年之后,还是执意改掉了这个名字, 他们更没预料到在多年之后,新的名称将以烫金大字铭刻在计算机科学的历史上,而IAL却鲜为人知。 

取代“IAL”的新名字,叫作ALGOL。这是ALGOrithmic Language的缩写,即算法语言。后来Bauer强调说,ALGOL这个名字,是Bottenbruch最先提出的,这两位都是苏黎世讨论会的德国代 表。 

除了名字没有达成共识之外,最终大家对新语言的句法也没能统一意见,苏黎世ACM-GAMM会议带着许多未尽的争议,在1958年5月1日草草落 下了帷幕。然而,对于这些科学家来说,事实胜于一切雄辩,绝不能陷入驴子的困境。会议结束后,他们立即投入到实现新语言的工作中——既然分歧不能解决,那 就干脆两种都做出来再说。他们成立了一个ZMMD小组,旨在开发一种ALGOL语言的编译器,ZMMD这个名称的由来,是其几位组员以及他们使用的一台 Z22计算机分别所在的四个城市的开头字母。 

请计算机专业的读者们在此稍息片刻,容我给其它专业的读者稍微解释一下什么是编译器。前面我们说过,因为计算机没法理解人类语言,我们需要用机器 指令来编写程序,我们现在有了高级编程语言,不必使用麻烦的机器指令,这并不是因为计算机学会了人类语言,而是因为我们请了一位翻译。简单地说,它能够把 高级语言翻译成机器指令,既使我们不用再做那些机械劳动,也能满足机器们的冰冷胃口,这个翻译就是编译器,它本身也是一套程序。好了,大家回回神,继续我 们的故事。 

就在不久之后的1958年年底,欧洲的冬天到来了,世界各地的游客纷纷来到壮丽的阿尔卑斯山,体验激动人心的滑雪运动。就在这个冬天,在ZMMD 小组的努力下,第一套ALGOL语言及其编译器成功地开发出来了,按照年份,命名为ALGOL58。好玩的是,ALGOL58有三种不同版本的语法,在实 际编程和书面表达时写法是不同的,有点像汉语分白话文和文言文,其差异之大,连小数点的写法都不一样。由于巴科斯的参与,ALGOL58既继承了 Fortran的许多优点,又弥补了Fortran的许多不足,一度使Fortran的地位面临着严竣的挑战。这里我们不详细介绍ALGOL58的样子, 它的生命实在太短暂,很快就退出了历史舞台。因为,就在一年多以后,ALGOL58的创造者,包括巴科斯和佩利等,对这种新语言有了许多新的体会和感受。 1960年1 月,他们召集了其他几位参与ALGOL工作的计算机科学家,来到了浪漫之都巴黎,再次召开了一场关于ALGOL语言的研讨会。

 

一. 从苏黎世到巴黎 (下)

1960年新年刚过,浪漫之都巴黎正是白雪皑皑的冬天。游客们缓缓登上埃菲尔铁塔,鸟瞰美丽的花都,弥满着 四处纷飞的雪花,陷于一片朦胧。

这时候,ALGOL58已经诞生一年多了(58年末至60年初),佩利、巴科斯等主要参与者们,都在实践 当中对新语言有了新的体会。革命的脚步不会停下,很快,他们集合了紧密团结在ALGOL58周围的13名计算机科学家,来到巴黎,再次对语言设计进行讨 论。尽管苏黎世会议的大部分老朋友都又来到了巴黎,然而这次研究会的主角儿,对我们而言却是一个新面孔,他是丹麦计算机科学家诺尔(Peter Naur)。

诺尔1928年出生在丹麦,29岁获得了天文学博士学位,后来在哥本哈根天文台工作时,为了计算天文数字,他设计了丹麦第一 台电子计算机DASK。诺尔是一位兼具才华与情趣的科学家,读着不妨检索一下他发表的学术论文,涵盖了天文学,计算机科学,古典音乐,心理学等诸多领域, 是学术界当之无愧的一名男子全能选手。就在巴黎会议召开不久前,诺尔进入了丹麦计算研究院工作,并为玻尔研究所授课,同时还被选为了欧洲语言设计小组成 员。尽管如此,这时诺尔的主要兴趣仍是天文学,计算机对它来说,不过是研究天文的工具。

 

主 角儿到了,那就让会议开始吧。还记得苏黎世会议上提出的巴科斯范式吧,巴黎会议的首要任务,就是继续完善这个范式,诺尔在第一局就立了大功。为了更清晰地 描述下一代ALGOL语言,诺尔对巴科斯范式进行了大幅度的简化,缩减了它的符号集,如今使用的巴科斯范式,均是经过诺尔改进后的。后来高德纳 (Donald Knuth)指出,应该将巴科斯范式改称为巴科斯-诺尔范式,以肯定诺尔为其做出的贡献,然而谦虚的诺尔却并不乐意这样。在《人类行为——计算》一书中 (这本书记载了诺尔为计算机科学所做的大量贡献),诺尔曾说,我没有打算要把我的名字加进去,其实我觉得,它叫“巴科斯范式”挺好的。

范 式并非难题,随着诺尔的工作,很快就通过了,13位代表开始讨论新一代ALGOL本身的设计。这次会议,大家吸取了上次苏黎世的教训,要求坚决不能再留下 争议,对每一个细节都不能含糊。于是,每名代表都铆足了劲儿,进行了旷日持久的讨论,整个会议竟然持续了半个多月才闭幕。后来佩利回忆这次巴黎会议,他说 最大的感觉就是累,实在太累,感觉简直就是没完没了。而且像上次一样,这些人论战起来丝毫不留情面,很多人的想法刚说出来就被彻底否定,一点翻身机会都不 给。佩利说,这13名代表的精神头儿实在令人感叹,在那半个多月里,他们每天一见面,个个都像打了鸡血。

13个人马不停蹄地论战半个月, 平均下来,每个人要叭啦叭啦说上一整天还多。然而,他们的努力却没有白费,这次会议终于终一了意见,完整地规划出了新一代ALGOL语言,按照年份,命名 为ALGOL60。在会议的最后,由诺尔对此进行总结,整理会议讨论出的ALGOL60的所有特性,形成了后来名扬江湖的《算法语言ALGOL60报 告》。这个总结工作充分体现了诺尔的才华和巴科斯范式的力量。在这之前的编程语言,是由编译器代码来描述的,既冗长又混乱,学习起来很有难度,而且非常难 以在人类之间进行交流。这就好比你买了一部手机,发现附带的说明书很有特色,是这个手机的全部电路图,请你根据这些图来学习使用手机。当时学习编程,就是 这么尴尬,但诺尔改变了这些,他首开先例,使用巴科斯范式对语言进行定义,用人类语言精心措词,短短17页报告,简洁优雅至极。这份报告成为了计算机科学 史上的名作,它完整地描述了ALGOL60语言的所有特性,却不依赖任何机器细节,便于在人类之间交流——编程语言第一次拥有了“使用说明”而不是“电路 全图”。诺尔的这项工作,改变了此后描述编程语言的方式,直到现在仍在使用。

巴黎会议,诺尔一鸣惊人。这个来自童话王国,热爱古典音乐的 天文学家,站在这里告诉世界,计算机科学也可以很美的。

各位读者,我们已经从苏黎世的春天,一路走到了巴黎的冬天,ALGOL语言的正式 版本终于被确定下来了。接下来要做的,就是把它付诸实践。冬去春来,万物复苏,1960年夏天,荷兰计算机科学家狄克斯特拉(Edsger Dijkstra)开发出了ALGOL60的编译器,ALGOL正式登上了计算机科学的舞台。随后,佩利将它引入了大学的课堂,在那个计算机科学的初始混 沌期,此举一下子让无数的人们看到计算机科学到底应该是什么样子(“哇塞,原来不是电路全图耶~”)。狄克斯特拉说,这是一个伟大的标志,这标志着计算机 科学真正地诞生了,ALGOL60是个绝对的奇迹。在接下来的30年里,ALGOL一直是教课书和学术界用来描述算法的不二之选。

说到这 里,按照学习编程的惯例,认识一种语言,要先看它的“Hello,world”样例。下面就是ALGOL60的例子,我们共同一睹这个“绝对的奇迹”芳容 如何。没有学习过编程的读者不必担心,这段程序的功能,就是在屏幕上显示一行“Hello,world!”,要是您实在看得一头雾水,那就直接跳过这些蝌 蚪文,我保证不会影响您享受接下来的旅途。当然,我相信以ALGOL语言的优美,一头雾水的可能性并不大的。

Java代码 
  1. BEGIN  
  2. DISPLAY("HELLO WORLD!" ) ;  
  3. END.  
[java]  view plain copy
  1. BEGIN  
  2. DISPLAY("HELLO WORLD!") ;  
  3. END.  



值得注意的是,这个写法并不唯一,因为ALGOL60仍然保持了ALGOL58的那个奇怪特性:分成文言文 和白话文。事实上,ALGOL60主要是在ALGOL58的基础上改进得来的,所以它在许多地方都继承了ALGOL58的特性。如今,很难再找到编译器来 让这段程序跑起来了,因为半个世纪荏苒而逝,时代的浪潮不饶人,想让ALGOL复活,已经不太可能了。然而,ALGOL的灵魂却从未离开,它简洁而优雅的 定义(这主要归功于诺尔),影响了后面一系列编程语言的设计。ALGOL提出的许多概念都被后来的编程语言沿用,例如“代码块结构”这些我们习以为常的编 程方式,都是由ALGOL率先使用的。包括C和C++在内的大部分五星级上将语言,都因为师出 ALGOL而被称为“类ALGOL语言”。可以说,ALGOL直接影响了整个计算机科学界和工业界的发展,影响之程度深入骨髓,而且至今经久不衰。

好 了,我们旅途的第一站已经游览完了,不知这一路上大家感觉如何,是否感受到了瑞士的美丽和法国的浪漫,是否感受到了巴科斯揭竿而起改造编程语言的决心,是 否感受到了佩利在语言设计和教育方面的高瞻远瞩,是否感受到了诺尔才华横溢的优雅气质,是否感受到了舌战群儒半个多月的激烈气氛,是否感受到了两次会议每 名代表的聪明才智,是否感受到了ALGOL是一个“绝对的奇迹”。现在,女士们先生们,让我们屏住呼吸,颁奖的时刻到了。

那位认为 “IAL”绕嘴又狂妄的艾伦佩利,因为在卡内基和普渡创建了计算机专业,并在ALGOL早期发展中带队做了大量工作,于1962年当选为美国计算机学会 (ACM)主席。四年后,也许是近水楼台先得月,佩利成为历史上首位ACM图灵奖得主,捧走了历史上的第一个图灵碗。ACM对他的颁奖词是:

    授予艾伦佩利图灵奖,以表彰其在高级编程技术及其编译器构造领域的影响 。 

五年后,佩利再次跳槽, 来到了耶鲁大学,连任多届计算机科学系主任,期间还一度执教于加州理工大学。1982年,退休后的佩利返老还童,写下了一系统关于编程的幽默,发表于 ACM的SIGPLAN期刊上。其中他写道,如果你给别人讲解程序时,看到对方在点头,那就拍他一下吧,他一定是睡着了。 1990年2月7日,佩利因心脏病在纽哈芬去世,享年68岁。

还记得这场“绝对的奇迹”的导火索、不爱学习、后来在IBM揭竿而起的巴科 斯吗?在佩利获得图灵奖11年后,1977年10月17日,巴科斯也凭着ALGOL的设计工作,在西雅图ACM年会上获得了图灵奖,捧走了第14个图灵 碗。ACM对他的颁奖词是:

   授于约翰巴科斯图灵奖,以表彰其在高级编程系统,程序设计语言规范的形式化定义方面所做的贡献。 

巴科斯随后发表了获奖 演讲,不知是不是因为他最初提议设计新语言时,曾经遭到冯诺伊曼的反对,从而对冯诺伊曼记恨在心(哈哈开个玩笑),他演讲的题目是《程序设计能从冯诺伊曼 形式中解脱出来吗?》。2007年3月17日,巴科斯在美国俄勒冈州的家中去世,享年82岁。

已经两个了,可是还没有结束,我们一定没有 忘记后来出场的那位才华横溢的科学家诺尔,他的图灵奖比前面两位来得似乎晚了一些。2005年,已经77 岁高龄的诺尔,在ALGOL60报告发布的45年后,终于等到了迟来的图灵奖,捧走了第50个ACM图灵碗。ACM给诺尔的颁奖词是:

    授予彼得诺尔图灵奖,以表彰其在定义ALGOL60程序设计语言方面的先驱性工作。 

虽然他的图灵碗 迟到了40年,但是以诺尔的淡泊和平和,我们不难想见,他不会太介意的。

计算机科学早期的程序语言设计,是一项很艰难的工作,在这十多位 科学家的努力下,创造了ALGOL这个绝对的奇迹。其中,上面这三位直接因为 ALGOL捧得了图灵碗,事实上参加巴黎会议的13名科学家中,还包括麦卡锡(John McCarthy),他后来因为在人工智能领域的杰出贡献获得了图灵奖,我们将在后面单独欣赏他的工作。为ALGOL60开发编译器的狄克斯特拉,也紧跟 着麦卡锡,作为一位编程艺术大师而获得了次年的图灵奖。ALGOL,它就像一个阿拉丁神灯,亲手触摸过它的寥寥十几位科学家中,先后5位捧得了图灵碗,戴 上了计算机科学界的最高桂冠,从这个意义上来说,它真的是一个“绝对的奇迹”。

 

密尔沃基市,是美国威斯康辛州最大的城市。1938年1月10日,圣诞刚过不久,密尔沃基市民像往常一样平静地生活着。咖啡店里,有人在议论着罗斯福总统 的救市新政策,有人在议论着到底该不该限制公民持枪。而更多的人呢,则一边品尝着密尔沃基闻名全国的啤酒,一边听着广播里面的实时战况:侵华日军登陆青岛 了。谁也没有想到,这个平静的日子将载入这座城市的史册。这天,密尔沃基路德教会高中的一名印刷管理员,高兴地迎来了一个健康的儿子。他为儿子取了一个响 亮的名字,这个名字在不久的将来,成为了计算机编程艺术的旗帜:Donald Ervin Knuth。

为了方便讲述,请各位读者允许我 先剧透一件39年后的事儿。在1977年Knuth造访中国前夕,姚期智的夫人为他取了一个中文名字:高德纳。在下面的故事里,我们就使用这个名字来称呼 他。
 

高 德纳天资聪颖,他的超凡智力在8岁时就显示出来了。当时,一家糖果商在孩子们当中举办了一项有趣的比赛,要求用“Ziegler’s Giant Bar”里面的字母,写出尽可能多的单词。裁判事先准备了一份2500个单词的列表,可他却远远低估了小选手的能力,高德纳令人惊讶写出了4500多个单 词,毫无疑问地获得了冠军。他为学校赢得了一台电视机,还为每个同学赢得了一只棒棒糖,他的赛后感言是,我还能写出更多。

高德纳的高中就 读于他父亲所在的路德教会高中,在这期间,他发表了此生第一篇学术文章。尽管如此,但这个充满了才华和个性的年轻小伙,并没有把心思放在科学上,他的主业 是音乐和作曲。他的老师,甚至包括他自己,十分怀疑他将来进入大学后,是否能够顺利学习数学。这种想法给高德纳造成了不小的自卑,尽管他的平均分是学校历 史上最高的。不过有句话说,真正的天才是1%的灵感加上99%的汗水,这话用在高德纳身上毫不夸张,18岁的他,在进入大学之后,丝毫没有向数学屈服,而 是花费无数的课余时间,大量练习数学难题,这种努力的劲头再加上他的天份,使他很快就在数学方面超过了其他同学。其实我们与其关注一些科学家们不可模仿的 机会和天赋,莫不如更关注他们如何面对困难和挫折。高德纳告诉我们,没有什么过不去的坎儿,方法就是抓紧时间干活。

高德纳就读的大学是凯 斯理工学院,在这里他接触了IBM650计算机,这导致高德纳的音乐家梦想一去不复返,科学天赋终于重新占领了他的心扉。 1956年,在他第一次使用IBM650之后,他就躇踌满志地相信,说明书上介绍的程序,一定比不上他自己编写的。于是高德纳开始学习编程,他的第一个程 序是因数分解,不久之后,高德纳就对编程有了许多体会。当时高德纳还兼职管理学校的篮球队,于是他编写了一个程序,能够自动评估每名球员的价值,令球队的 教练非常欣赏。这件事还吸引了CBS电视台的报道,后来高德纳、球队教练和IBM650的一张合影,还被印到了IBM650的宣传册上。1960年,高德 纳以公认出色的成就,打破了学校的惯例,同时获得了学士和硕士两个学位,大家来做个减法吧,算算高德纳此时年岁几何。

随后,高德纳从五大 湖区,来到了美国西南岸,进入伯克利攻读数学博士学位。在此期间,他的编程生涯也正式开始了,他对外提供软件服务,为各种不同机器设计各种稀奇古怪的编译 器,曾经一个程序卖到5000美元。最值得一提的,就是他对ALGOL60编译器提出的测试方法。不知道大家是否还记得 ALGOL,这盏批量生产图灵奖的阿拉丁神灯。当时我们介绍过,ALGOL60的设计目标要求支持递归,而在设计编译器时,对递归的处理是很复杂的,所以 经常会因为编译器不成熟而出故障。高德纳编写了一段非常简单的测试程序,江湖人称“Man or boy test”,俗名“是男人就得-67”。高德纳说,只要用ALGOL60编译器来编译我的这段程序,如果运行结果等于-67,就说明这个编译器是纯爷们 儿,否则就只能算小男孩。

1963年,25岁的高德纳顺利拿到了博士学位,并留在伯克利任教。在毕业前一年,虽然还是研究生,但高德纳已 经因为设计编译器而响誉计算机行业。于是著名的Addison-Wesley出版社与他约稿,请他写一本关于编译器和程序设计方面的书。这本来是很平常的 一件事,但您看看高德纳是何许人也,不久之后,他简直把这件事做成了一件计算机科学史上的奇观。1962年约的稿,高德纳一直写到1966年还没交,在此 期间他又是毕业,又是教书,终于人家出版社急了。编辑找到高德纳,说这都四年了你写了多少啊,高德纳说,才写3000页手稿。编辑大囧,忙问都3000页 了你怎么还不交,高德纳答曰,急啥,我还没写到正题呢。编辑彻底雷住了,说那你出个多卷本吧……

《计算机程序设计艺术》,就这么诞生了。

把 一件平常的事做到人间极致,这就是高德纳。他不是故弄玄虚,他的心里攒着一股劲儿,要写出一部与牛顿的《自然哲学的数学原理》相媲美的传世巨著。他一开始 计划了六卷,后来觉得这个数字不怎么好,又改成了七卷。1968年,《计算机程序设计艺术》(The Art Of Computer Programming,江湖人称TAOCP)的第一卷正式出版了。这一卷的标题叫《基本算法》,但难度却并不低。比尔盖茨曾经花了几个月的时间读完这一 卷,并且做了大量的练习,然后他说,如果你想成为一个优秀的程序员,那就去读这个《基本算法》吧,确保自己能够解决里面的每一个问题。然而,高德纳本人的 说法却比盖茨犀利多了:要是看不懂,就别当程序员。

就在这同一年,高德纳跳槽到斯坦福大学,并当上了教授,一边带博士,一边继续写书。一 年后,TAOCP第二卷《半数值算法》正式出版,又过了三年,也就是1973年,第三卷《排序与查找》也相继付梓。这三卷书立即被计算机界惊为神作,在那 几年之内就卖出去了100多万套,至今仍然是编程书籍中的最高经典。有一些对我们来说巧妙得不能再巧妙的算法,在这三卷书中顺手掂来,比比皆是,这个我们 等会再说,现在有件要紧的事儿。按照高德纳的计划,这套书一共是七卷,但是现在刚刚写完三卷,就已是震古烁今。震到什么程度呢,连图灵奖颁奖委员都坐不住 了,他们做了一件前所未有的事。按照惯例,图灵奖的获奖者都是成就等身,要经过时代的检验,然而高德纳却是例外,在他的七卷本刚刚写完三卷时,ACM便决 定立即为其颁发图灵奖:

    授予高德纳图灵奖,以表彰其在算法分析、程序设计语言的设计和程序设计领域的杰出贡献,特别是其著名的《The Art of Computer Programming》系列丛书。 

这是1974年的ACM图灵奖颁奖词,高德纳捧走了历史上第9个图灵碗。这对高德 纳来说,无疑是个殊荣,因为这一年他只有36岁,直到现在,他仍然保持着获奖年龄最小的纪录。

我们故事才讲到一半,可天才的高德纳却已经 得到了图灵奖。各位读者可能要问,那下面还讲啥,他无非就是接着写书,接着带博士,就别废话啦。您要是这么想,那就大错特错了,他要是那么做,他就不是高 德纳。提前剧透一下,这个看上去顺理成章的计划,很快就被打破了,计划中的七卷本,直到今天都没有完成。欲知发生了什么,且听下回分解。

 

近看图灵碗 (8. 我就是上帝) (下)

 
高 德纳近照

上一篇我们讲到,高德纳计划要写一套七卷本的《计算机程序设计艺术》,没想到刚刚写完第三卷,就被ACM授予了图灵奖。这在图灵 奖历史上是从没有过的事。我们还记得巴黎会议上的诺尔吧,他的图灵碗比他的获奖成果迟来了整整45年,他等这个碗时间,比高德纳获奖时的岁数还要长。但 是,高德纳在获此殊荣之后,再一次令世界大跌眼镜:他宣布从此歇笔了,因为排版工具太差,破坏了这套书的美。

高德纳的这一动作让外界十分 震惊,可以想见,他遭到了排山倒海的怀疑。有人说,高德纳肯定是江郎才尽,拿了图灵碗,见好就收;有人说,图灵奖对前三卷的评价过高了,高德纳无力面对这 么大的压力,只好找个理由撤退;还有人说,获奖之后停止写作,充分体现了他写书的目的就是为了功利。他们纷纷质疑,这个图灵碗是彻底发错了人。

然 而,如果我们真正翻开TAOCP读一读,就不难理解这是为什么。我觉得,对于算法的研究,可以分成三层境界。第一层是分析算法的复杂度,这是计算机专业的 大学生普遍掌握的技能,达到这个境界,可以说是入了算法的门;第二层境界是改进算法的复杂度,在分析之后继续思考,想办法去降低它,这就可以算是懂算法 了;第三层境界,就是寻找算法的最优复杂度,不但要改进它,而且要改到什么程度呢?就是要证明出来,我改完的算法就是最优的,你无论如何都不可能再改进 了,再改进就违反宇宙规律。

高德纳,就是典型的第三种人。诸位不妨看看,TAOCP里面给出了多少最优算法,高德纳是铁了心,要当算法世 界中的上帝。高德纳就是这么一个极致地追求极致的人,他强迫自己把每件事都做得不可逾越。那么他怎么能够容忍,这套被他视为毕生事业的书,被糟糕的排版技 术束缚?于是,无论别人怎样质疑,他最终还是把写作晾到了一边,开始全力以赴地研究字体和排版。高德纳让我们领略了什么才是真正的个性,个性绝不是打18 个耳洞,或在牛仔裤上抠 36个窟窿。个性,就是在所有岔路口都追随自己的心,让所有影响你追求梦想的障碍统统跪倒。

高德纳这一歇笔,就 是十年。在这不务正业的十年当中,对极致的追求像只看不见的手,推动他创造了三个响亮的成果,其中影响最大的,就是排版系统TEX。如果大家用MS Office Word写过论文,就会体会到那份求死不得的心:不断地调整字号、行距、缩进、分栏,如果这还不算什么,你再写几个数学式子看看?但是在TEX中,这些麻 烦几乎完全不存在,你唯一需要做的,就是把你想写的内容告诉它。如果说时间就是生命,那就可以认为,TEX每天都在拯求科学家们的生命,说它推动了科学的 发展也不为过。TEX是一场出版界的革命,直到现在仍是全球学术排版的不二规范,它所排出的文字之美,特别是数学式子的美,让人们由衷感叹:啊,一毫米都 不能再挪动了。

除了功能上的美之外,TEX作为一个软件产品,也令人叹为观止。它的版本号不是自然数列,也不是年份,而是从3开始,不断 地逼近圆周率(3.14,3.141…目前最新版本是3.1415926)。高德纳再一次用行动宣告,我这个东西,不可能再有什么大的改进了,最多只能小 修小补,使其趋近完美。他还专门设立了奖金:谁发现TEX的一个错误,就付他2.56美元,第二个错误5.12美元,第三个10.24美元…以此类推。我 们都知道,传说某个国王就因为这种指数游戏失去了江山,高德纳作为算法大师,更清楚指数增长的可怕性。然而他却敢立此重赏,结果直到今天,他也没有为此付 出多少钱,可见TEX经过了怎样的千锤百炼。这个耗费十年打造的玩具,让当初质疑图灵奖发错了的人们全部闭嘴了,他们甚至改口说:哦,为了这个TEX,不 妨再给高德纳一个图灵碗吧。

 

第 二个成果,就是METAFONT,这是一套用来设计字体的系统。对于它的价值,一句话就能概括:计算机界最懂字体的两个人,一个是苹果的乔布斯,另一个就 是高德纳。

第三个成果,就是文学化编程(Literate Programming),它把程序设计的艺术性展示得淋漓尽致。高德纳说,一段好的程序,不仅仅是要清晰易读,而且要能够读出美感,读出意境。天呐,意 境,一排一排的计算机代码,要像诗歌一样充满意境。高教授,你疯了?

高德纳说,你才疯了呢,看我给你们露一手。于是,他在C语言的基础 上,开发了一套CWEB系统,除了用它写出了TEX程序之外,竟然还用它写了一本叫作《Stanford Graphbase》的书。高德纳微微一笑,我都能用编程语言写书,何况有意境的程序了,我的口号是:程序员也能得普利策奖(这是全球新闻写作领域的最高 奖项)。

文学化编程还为高德纳报了一个小仇。我们第6章中讲过的迪科斯彻,当年提出了一个“结构化编程”,提倡不要在编程时使用 “goto”语句,高德纳偏要唱反调,结果被迪科斯彻称为“没结构”。这下可好,高德纳狡黠一笑,嘿嘿,如果你不跟我混,你就是“没文化”咯 (literate也有“文化”之意)。

歇笔十年的高德纳,手捧这三项成果重出江湖,打消了一切质疑。这时他才对十年前的歇笔事件做了一 个轻描淡写的解释:一个人要想把事情做得漂亮,就必须要跟上帝保持和谐,现在,上帝终于让我去写四卷了。

他的笔,又拿了起来。在写作第四 卷的过程中,为了帮助读者打好数学基础,以便面对TAOCP中的数学高峰,他又专门撰写了一本《Concrete Mathematics》。这本书有中文版,翻译为《具体数学》,我一直觉得稍有不妥。Concrete到底是什么意思呢,高德纳说,意思就是我不教那些 软绵绵的数学,我要教的是扔到地上能砸个响儿的数学。据说,他在课堂上说完这番话,有好几个同学扭头走出了教室──他们是土木工程系的学生,还以为高德纳 是讲混凝土的呢(Concrete在土木领域意为“混凝土”)。说到高德纳的教学,还有个趣闻,他批改作业的时候只抽查第314页,就能判断出这份作业的 质量。为此,我们这本书的第314页用来向高德纳致敬。

1992年,高德纳为了专心写作,宣布提前退休,并停用电子邮箱。高德纳一共带了 28位博士生,他觉得28这个数字很好,于是便宣布不再收学生了。尽管如此,他仍然为想要师从于他的人们留下了一个盼头:他开了一门叫做Computer Musing的公开课,每次会提出一个问题,如果谁能快速解出来,高德纳就会为他的博士论文签名。不知道哪位后起之秀能够获得如此殊荣呢,我们拭目以待 吧。

2008年,在TAOCP的前三卷面市30年之后,第四卷终于千呼万唤始出来,而高德纳,却已是白发苍苍的古稀老人了。一句话,一辈 子,一生情,一杯酒,他对计算机科学的热爱,使他为这套丛书耗费了一生的心血。在这一章的最后,我想用一个词,来形容这位天才的计算机科学大师,但是思前 想后,我只能想到唯一的一个词:God。

我想,尽管高德纳是一位虔诚的基督徒(他还专门写过关于圣经研究的书),但他一定会欣然接受这样 的形容。正如当年Linux的作者Linus说:上帝在梦中告诉我,我做出了最优秀的操作系统。

高德纳回答说:我可没这么说过。

  • 3
    点赞
  • 0
    评论
  • 6
    收藏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值