donald knuth --图灵奖获奖者

  唐纳德•克努特(Donald Ervin Knuth)
  ——经典巨著《计算机程序设计的艺术》的年轻作者
   洋洋数百万言的多卷本《计算机程序设计的艺术》(The Art of Computer Programming)堪称计算机科学理论与技术的经典巨著,有评论认为其作用与地位可与数学史上欧几里得的《几何学原理》相比。本书作者唐纳德•克努特(Donald Ervin Knuth)因而荣获1974年度的图灵奖。
   克努特1938年1月10日生于威斯康辛州密歇根湖畔的密尔沃基(Milwaukee)。这是一个山灵水秀、人才辈出的地方,“人工智能之父”、诺贝尔奖获得者西蒙(H.A.Simon)也是在这里出生的,而且是下一年图灵奖的得主。但克努特比西蒙小整整22岁,是一个“小字辈”。克努特的父亲是一个多才多艺的人,有研究生学历,当过小学和中学教师,星期天在教堂演奏风琴,还在自家地下室办了一个小印刷厂。受父亲影响,克努特从小喜欢学习和音乐,并表现出与众不同的才能。克努特上8年级时,当地的Ziegler糖果厂为了促销其称为Giant Bar的一种棒棒糖,在学校中搞了一个比赛,看谁能用Ziegler’s Giant Bar中的字母排列组合出最多的单词。克努特假装胃疼,在家里呆了两个星期,利用一部大字典,得出了4500个单词,比裁判掌握的2 000个单词多出一倍多,一举为他所在的班夺得冠军,赢得一台电视机和每人一块Giant Bar,而克努特本人则赢得一付雪撬。
   在数学上,克努特也很早就表现出天才。高中一年级时,他发明了一种方法,利用这种方法,对任意画出的2条相交直线,他能立即给出相应的方程。
   1956年,克努特以各科平均97.5的创记录的高分从密尔沃基路德兰高级中学毕业,进入俄亥俄州克利夫兰的开思理工学院(Case Institute of Technology)攻读物理。这一年,他在中学时就创作的一篇出色的科学幻想小说“普茨比度量衡体系”(The Potrzebie System of Weights and Measures)在美国著名的《疯狂》(Mad)杂志上发表,克努特获得了他的第一笔稿费25美元,并因而获得西屋科学天才的提名奖。在这篇小说中,克努特风趣而富于幻想地提出了替代公制的一种新的计量制度,比如以一本流行杂志的厚度为长度单位,虽然滑稽可笑,却设计得严密周到,天衣无缝,其中甚至还包括一种新的历法。文章刊出后大受欢迎,多次重印,1991年还重印过一次,其时作者克努特即将退休。
   大学一年级结束以后的暑假,克努特在学校打工,负责把统计数字画成图表。碰巧他工作室的隔壁就是计算机房,新到了一台IBM650。当时的计算机体积都很庞大,有供输入和调试的控制台,上面排列着一排排的开关和指示灯,计算机工作时指示灯快速闪烁变化出不同的图案,这引起克努特极大的好奇与兴趣,他接连好几天彻夜不眠地呆在机房,观察它的工作,钻研使用手册,探究计算机的奥秘。一年以后,他终于改学数学,与计算机结缘。这段经历对于克努特是如此重要和关键,以致他在《计算机程序设计的艺术》第一卷的卷首,不像别的作者那样一般写上“献给自己的父母”或“献给自己的妻子”,而是写着“献给曾经安装在开思理工学院的650型计算机,以纪念那些愉快的夜晚”。他的第一个计算机应用程序也是在650计算机上实现的:他为他所在的校篮球队(克努特人高马大,也喜爱运动)设计了一个复杂的公式,根据球员在每场比赛中的得分、助攻、抢断、篮板球、盖帽等多项统计数字对球员进行综合评估。球队教练根据克努特的程序挑选和使用球员,使开思理工学院在1960年赢得了联赛冠军,克努特的“神奇的公式和程序”也被当地报纸和广播传为美谈。1960年,克努特在开思理工学院毕业,不但被授予学土学位,还被破例同时授予硕土学位。之后他进入加州理工学院研究生院,1963年获得博土学位,留校工作至1968年,然后转入斯坦福大学任教,其间1972—1973年曾经在奥斯陆大学当客座教授。
   克努特至今进行了两大工程,一个已经完成,一个尚未完成。第一个大工程就是《计算机程序设计的艺术》系列,开始于他念博士期间,计划出七卷,第一卷《基本算法》于1968年出版,第二卷《半数字化算法》于1969年出版,第三卷《排序与搜索》于1973年出版,第四卷《组合算法》尚在写作之中。这个工程为什么前紧后松,长期停顿呢?原来,前三卷书出版以后,克努特根据自己在校对清样时的感受,决心对排版技术进行彻底改造,因此中止了第一个工程,而开始其第二个工程。这个工程花费了克努特整整9年的时间和精力,结果就是对整个西文印刷行业带来了革命性变革的TEX排版软件和METAFONT字型设计软件。这两个软件为克努特赢得了ACM的另一个奖项:1986年度的软件系统奖(Software System Award)。但是这两个软件并没有为克努特和斯坦福大学赚过一分钱:克努特把它们作为自由软件无偿提供给用户。这比理查德•斯托尔曼(Richard Stall man,1990年ACM Hopper奖获得者)在1984年发动自由软件运动早了约5—6年。克努特说:“我写这两个程序是出于对书籍的热爱,也想给这个领域以必要的推动。我已经有些名气了,我的书卖得也不错。所以我不需要为我出于热爱而做的事保留专卖权。此外,数学家通常是不为他们发现的定理获取报酬的”。1979年,克努特还创建了TEX用户集团,这个集团10年前的成员数就超过3000。细心的读者也许会注意到,许多西文书版权页的下部注明“本书用TEX系统排版”。
   克努特的两大工程(虽然其中之一尚未最后完成)都是取得很大成功的。《计算机程序设计的艺术》一书以其内容的丰富和深刻喻为经典,有人甚至称之为“计算机的圣经”,被译为俄、日、西、葡、匈牙利、罗马尼亚等多种文字在世界各国广泛流传,其发行量创造了计算机类图书的最高记录,直至凹世纪80年代中期,都一直保持着月销售量每卷达2000册的势头,成为Addison-Wesley出版社成立以来销路最好的图书。在我国也有译本(可惜书名译为《计算机程序设计的技巧》,这是不符合克努特的本意的,见后)。此外,克努特还有许多“小创造”。计算机科学技术中两个最基本的概念:“算法”(Algorithm)和“数据结构”(Data Structure)就是克努特于29岁时提出来的。1973年他首创双向链表。在编译器设计方面,著名的LR(k)文法也是克努特在对自左至右、自底向上的移进一归约分析进行了深刻剖析的基础上,经过高度概括和集中以后发明的,它表示具有从左(L)到右(R)的分析而向前看k个符号,以确定所要进行的归约和应用何种语法解释。LR(k)文法的识别效率高,在从左至右扫描输入串时,就能发现其中的语法错误,并能准确地指出出错位置,因此被广泛应用。此外,利用LR(众)文法还能正确区分像Flying planes is fun和Flying planes can crash这类句子(前一个句子“开飞机很有趣”中flying是动名词,而后一个句子“飞行中的飞机可能出事”中Flying是现在分词当形容词)。以著名的巴克斯—诺尔范式为基础的“属性文法”(attribute grammar)也是克努特首先提出来的。属性文法在普通的上下文无关文法(context-free grammar)的基础上,对每一个终结点或非终结点加上一些属性,和对这些属性进行估值的语义规则集,从而形成一种新的、有更强表达与描述能力的文法。其中属性是由<属性名、属性值>的有序偶对组成的。属性的内容则可包括模式标识符表等。
   在算法方面,有他和他的学生共同设计的诸如Knuth-Bendix算法和Knuth-Morris-Pratt算法,前者是为了考察数学公理及其推论是否“完全”而构造标准重写规则集(rewriting rule set)的算法,曾成功地用它解决了群论中的等式的证明问题,是定理机器证明的一个范例。后者是在文本中查找字符串的简单而高效的算法。此外,克努特还设计与实现过最早的随机数发生器(random number generator)。
   20世纪70年代中期,克努特和其他一些计算机科学家曾经设想在未来10年中将产生一种比现有程序设计语言更加强大,更加优美的新型语言,并预先命名它为“乌托邦84'’(Utopia 84)语言。乌托邦原是托马斯所著Utopia一书中所描述的人间理想王国,克努特借用过来代表一种未来的理想语言,希望它有更好的数据结构和控制结构,更符合结构化程序设计的思想,等等。克努特提出Utopia 84已经过去20多年了,虽然程序设计语言在不断地发展与完善之中,但“理想语言”并未出现,可能永远也不会出现。但新一代人会不断进取。克努特在20世纪80年代所倡导的“作文式程序设计”(literate programming,国内有人将它译为“文化程序设计”)就是这一努力的又一体现和成果。我们从上小学起不就学做作文吗?作文首先要构思好故事,把事情的来龙去脉交代清楚,这相当于编程时先要把程序逻辑弄好。其次要围绕故事情节尽可能把有关的人物、环境等细节描写得清清楚楚,生动活泼,这相当于在程序中加入必要的注释和说明,以便阅读和理解。所谓作文式程序设计就是要像写作文那样进行编程,从完成的“源程序”中既可提炼出可执行的程序代码,又可生成程序文档,“毕其功于一役”。作文还有一个要点是分段,一篇作文要分成若干段落,以便层次分明,铺陈有序。作文式程序设计也是这样,一个复杂的程序是由若干较简单的片段构成的,较大的片段还可分为更简单的一些小片段。1983年,克努特推出了第一个这样的程序设计系统WEB。WEB包括两个子系统,一个子系统从WEB程序中自动地抽出描述算法的部分,并且加工成PASCAL编译器所能接受的形式,然后据此得到可在计算机上执行的代码。另一个子系统则把WEB程序加工为TEX系统所能接受的形式,并据此得到具有高度可读性的完整的程序文档。显然,WEB就是一个完成"PASCAL作文”的工具。继WEB之后,提姆勃莱比(H.W.Thimbleby)开发出CWEB,和WEB类似,但是是一个完成“C作文”的工具。WEB和CWEB都是自由软件,可从因特网上下载。
   @ *Insertion sort
   This iS the standard insertion sort algorithm.
   Assumes a sentinel at $a[0]$.
  @ p
  for i:=2 to N do
  begin v:=a[i];j=i;
  @<Insert...@>
  end
  @
   @<Insert $v$ in the array @>=
   while a[j-1]>v do
   begin a[j]:=a[j-1];j:=j-1 end;
   a[j]:=v
   为了说明作文式程序设计的特色,上面给出采用这种方法编写的源程序的一个片段。这个片段是采用标准的插入排序算法对一个数组中的元素进行排序。片段中的@符号是系统约定,用以引入作文式程序设计中的各种特征。符号$则通知系统交叉引用某段文本作为代码而非注解。片段中有一个“宏”(macro),就是{Insert $vS in the array}。宏允许缩写,上述宏就可缩写为<Insert...>,因此是很方便和精炼的。这个片段经过处理以后获得的代码和可供印刷的文档分别如下所示。
   For I:=2 ton N do
   Begin v:=a[i];j:=1
   While a[j-1]:a[j-1];
   j:=j-1 edn;
   a[j]=v
   31. Insertion sort. This is the standard insertion sort algorithm.Assumes a sentinel at a[0].
   For i:=2 to N do
   Begin
   V:=a[I];j:=i
   <Insert v in the array.32>≡
   while a[j-1]>v do
   begin a[j]:=a[j-1];j:=j-1 edn;
   a[j]:=v;
   Used in section 31
   整个WEB程序还将自动产生目录和索引。大家都知道或有过亲自体验,在软件开发中,文档编写在整个过程中占着相当大的比重,是一种十分重要而又非常烦人的工作。作文式程序设计将大大减轻这方面的负担,并提高文档质量。因此,像我们从小学起就要学习写作文那样,学习并掌握用作文式程序设计进行编程实在是一件非常有意义、非常重要的事。
   克努特的著作很多,除了已由Addison-Wesley出版社出版的三卷The Art of Computer Programming(由管纪文、苏运霖等译成中文,国防工业出版社出版,介绍TEX和METAFONT的五卷《计算机与排版》(Computers and Typesetting)早巳流传于世外,还有以下一些主要著作:
   《超现实数》(Surreal Numbers,Addison-Wesley,1974)
   《实用数学》(Concrete Mathematics,Addison-Wesley,1989)
   《数学论著集》(Mathematical Writings,MAA,1989)
   《用于算法分析的数学》(Mathematics for the Analysis of Algorithms,Birkhauser,1990,第三版)
   《作文式程序设计》(Literate Programming,CSLI,1992)
   《公理与外壳》(Axioms and Hulls,Springer,1992)
   《斯坦福的GraphBase:组合计算用的平台》(The Stanford Graph Base:a Platform for Combinatorial Computing,ACMh•,1993)
   其中,《超现实数》一书介绍了剑桥大学的康韦(J.H.Conway)所发明的一种新的数制,是克努特听了康韦向他作的介绍后,用了一周时间写成的小说体裁的作品。有评论家指出,这是历史上第一次一个重大的数学发现以小说的形式向公众进行介绍。由此可见,克努特的艺术才华同样是非凡的,要不是计算机深深吸引了他,克努特很可能会成为出色的小说家或音乐家(前面说过他喜欢音乐,会自己制作管风琴,会创作不错的乐曲呢)。
   克努特获得的荣誉与奖励极多。ACM除了授予他图灵奖和软件系统奖外,还在1971年授予过他以COBOL的发明人、女计算机科学家霍泼(Grace Marray Hopper)命名的奖项,这个奖项是专门奖励30岁以下的优秀青年计算机科学家的。这样,克努特一人就先后获得ACM的三个奖项,在1999年以前,这是计算机科学家中仅有的一位(1999年,布鲁克斯获得图灵奖,从而也拥有ACM三个奖项,平了克努特的记录)。无独有偶,美国数学会也先后授予克努特三个奖项,即Lester R.Ford奖(1975)、J.B.Priestley奖(1981)和Steele奖(1986)。1979年,当时的美国总统卡特向他颁发了全国科学奖章。IEEE授过他两个奖:McDowell奖(1980)和计算机先驱奖(1982)。1994年,瑞典科学院授予克努特Adelskold奖。1995年他获得冯•诺伊曼奖和Harvey奖。1996年他获得日本INAMORI基金会设立的KYOTO奖,这个奖是专门奖励在高科技领域作出贡献的科学家的。面对这么多荣誉,克努特都以平常心对待,据说,纪念他获得图灵奖的碗现在只是被他用来盛放水果。
   ACM于1974年11月11日在南加利福尼亚濒临太平洋的海港城市圣迭戈举行的年会上向克努特颁发图灵奖。克努特发表了题为“作为一种艺术的计算机程序设计”(Computer Programming as an Art)的演说。在演说中,一如我们在阅读他的著作时所感受的那样,克努特旁征博引,有根有据,人情人理,娓娓道来,把“科学”与“艺术”的不可分割的关系说得清清楚楚,令人心服口服。演说刊于Communications of ACM,1975年12月,667—673页,或见《前20年的ACM图灵奖演说集》(ACM Turing Award Lectures——The First 20Years:1966--1985,ACM h.),33—46页。
   克努特已于1992年在斯坦福大学荣誉退休,以便集中精力于写作。
  

posted @ 2009-04-30 20:22  小白熊  阅读(375)  评论(0编辑  收藏  举报