计算机鼻祖-Donald Knuth(高纳德) 的传奇

           李开复说,练内功,不要仅仅花功夫学习各种流行的编程语言和工具,以及一些公司招聘广告上要求的科目。要把数据结构、算法、数据库、操作系统原理、计算机体系结构、计算机网络,离散数学等基础课程学好。最好还是试试Donald Knuth的Art of Computer Programming里的题目,假设你可以解决当中的大部分题目,就说明你在算法方面的功力不错了。

          Donald Knuth自传的开头这样写道:“Donald Knuth真的仅仅是一个人么?”作为世界顶级计算机科学家之中的一个。Knuth教授已经完毕了编译程序、属性文法和运算法则的前沿研究。并编著完毕了已在程序设计领域中具有权威标准和參考价值的书目的前三卷。在完毕该项工作之余。Knuth还用了十年时间发明了两个数字排版系统。并编写了六本著作对其做了详尽的解释说明。如今,这两个系统已经被广泛地运用于全世界的数学刊物的排版中。随后。Knuth又发明了文件程序设计的两种语言,以及“文章性程式语言”相关的方法论。

          到眼下为止,Knuth已经出版发行了17部书籍,一百五十余篇论文,包含了巴比伦算法、圣经、字母“s”的历史等多方面的内容。作为一名数学家。Knuth曾开创了几门新的课程,为纯计算数学做出了非常大贡献。他所获得的奖项和荣誉数不胜数,当中最值得注目的有1974年美国计算机协会图灵奖(ACM Turing Award)。1979年美国前总统卡特授予的科学金奖(Medal of Science)以及1996年11月因为发明先进技术荣获的极受尊重的京都奖(Kyoto Prize)。在不多的业余时间里。Knuth不仅写小说,还是一个音乐家、作曲家、管风琴设计师。

       是Knuth独特的审美感决定了他兴趣广泛、富有多方面造诣的特点。Knuth传奇般的生产力也是源于这一点。

对于Knuth来说,衡量一个计算机程序是否完整的标准不只在于它是否可以执行,他觉得一个计算机程序应该是雅致的、甚至可以说是美的。计算机程序设计应该是一门艺术,一个算法应该像一段音乐,而一个好的程序应该如一部文学作品一般。


早期经历

 

     Knuth,1938年1月10日生于美国威斯康星州密尔沃基市。他在模式方面辨别和熟练操作的能力在八年级的时候開始显现出来。当时。当地的一家糖果制造商举办了一项比赛。比赛要求选手用其品牌“Ziegler's Giant Bar”中的字母组成新的单词,规定时间内组成单词数量最多者获胜。Knuth參加了比赛,并以单词总数4500余个远远超过了裁判的2500个的标准。轻松赢得头奖。赛后,Knuth说道,假设自己当初想到回答时用些省略符号的话。还能写出很多其它。

这次比赛Knuth为学校赢得了一台电视机,还为每一个同学赢得了一根糖果棒。

数学上。克努特也非常早就表现出天才。

高中一年级时。他发明了一种方法,利用这样的方法,对随意画出的2条相交直线,他能马上给出对应的方程。

Knuth多产的出版事业開始于他的高中时代,当时他的科技设计被Westinghouse Science Talent Search 光荣提及。他的“Potzebie System of Weights and Measures ”的基础章节被登在“Mad”杂志第26号,“Power”的基础章节被叫作“whatmeworry”。“Mad”的编辑认识到了年轻的Donald著作的重要性,以25美元买下了他的文章,并刊登在了其1957年6月的期刊上。

高中的时候,Knuth对数学并没多大兴趣,而是把主要精力放在主修的课程:听音乐和作曲上。他在高中的乐队里吹萨克斯、大号时,曾把Dragnet、 Howdy Doody Time 和 Brylcream的主题曲联成一段新的音乐。

这位著名的科学家在最近评论自己的早期作品时承认:“对于版权,我一无所知。”

1956年。克努特以各科平均97.5的创记录的高分从密尔沃基路德兰高级中学毕业。进入俄亥俄州克利夫兰的开思理工学院(Case Institute of Technology)攻读物理。这一年,他在中学时就创作的一篇出色的科学幻想小说“普茨比度量衡体系”(The Potrzebie System of Weights and Measures)在美国著名的《疯狂》(Mad)杂志上发表,克努特获得了他的第一笔稿费25美元,并因而获得西屋科学天才的提名奖。

在这篇小说中,克努特风趣而富于幻想地提出了替代公制的一种新的计量制度,比方以一本流行杂志的厚度为长度单位。尽管滑稽可笑,却设计得严密周到。天衣无缝。当中甚至还包含一种新的历法。文章刊出后大受欢迎,多次重印,1991年还重印过一次,其时作者克努特即将退休。

  尽管 Knuth的等级平均分是学校历史上最高的,可是他和他的指导老师还是对他是否能成功学习大学数学持怀疑态度。

Knuth说在他高中阶段和大学早期一直有一种自卑感,这个问题一度是他的一个障碍。作为一个大学新生,Knuth没有对于失败的恐惧。他花了很多时间攻克额外的数学难题。几个月后。他在这方面的能力已经远远超过了其它同学。

 

高等教育和早期的计算机工作

 

当Knuth在Case科学院(如今的Case Western Reserve)获得物理奖学金时,梦想成为一个音乐家的计划改变了。Knuth回去继续研究数学是在大二,当时一个爱出难题的教授提出了一个特殊的问题,并说哪个学生能解决问题就立马记成绩“A”。Knuth跟大多数同学一样,也觉得那是道解不出来的题目。直到有一天。他错过了公共汽车,仅仅能步行去看一个演出,Knuth利用路上这点空暇时间决定尝试一下。那阵子他运气真的是非常好,不仅问题非常快就解开了。得到了“A”。还成功地常常逃课。尽管 Knuth也承认,逃课让他有负罪感,可是非常明显,他全然有能力补上落下的功课,接下来的一学年,他的离散数学就又得了个“A”,并且还获得了给自己不能參加的课程评定论文等级的工作机会。

 

1956年,作为Case的新生,一年级结束以后的暑假,克努特在学校打工,负责把统计数字画成图表。

碰巧他工作室的隔壁就是计算机房,新到了一台IBM650。

当时的计算机体积都非常庞大,有供输入和调试的控制台,上面排列着一排排的开关和指示灯,计算机工作时指示灯高速闪烁变化出不同的图案,这引起克努特极大的好奇与兴趣,他接连好几天彻夜不眠地呆在机房,观察它的工作。钻研使用手冊,探究计算机的奥秘。一年以后,他最终改学数学,与计算机结缘。这段经历对于克努特是如此重要和关键,以致他在《计算机程序设计的艺术》第一卷的卷首,不像别的作者那样一般写上“献给自己的父母”或“献给自己的妻子”。而是写着“献给以前安装在开思理工学院的650型计算机,以纪念那些愉快的夜晚”。

天天与计算机为伍,Knuth说直到一年后,女孩才进入了他的生活。这又是计算机科学界一直以来亏欠科学家们的一个事例之中的一个。

Knuth 熬夜读IBM 650的说明手冊,自学主要的程序设计。那时,在高等计算机语言发明之前。程序编写仅仅能用第二代或是汇编语言。

这个工作既耗时又困难。由于指令必须依据每台机器特定的构造编写,而实际上指令仅仅须一步就可从二进制0、1系列转存到计算机硬盘上。Knuth说,有了第一次使用650的经历,他便肯定自己能编写出比说明手冊上介绍的更好的程序。

Knuth非常快便開始“闲逛”,编写能够运行数学函数的程序。

他的第一个程序是把数字转化为素数。第三个是做井字游戏(或者说是让计算机在改正每次输的错误的过程来学会玩井字游戏)。

他的第一个计算机应用程序也是在650计算机上实现的:他为他所在的校篮球队(克努特人高马大,也喜爱运动,娱乐)设计了一个复杂的公式,依据球员在每场比赛中的得分、助攻、抢断、篮板球、盖帽等多项统计数字对球员进行综合评估。球队教练依据克努特的程序挑选和使用球员,使开思理工学院在1960年赢得了联赛冠军,克努特的“奇妙的公式和程序”也被当地报纸和广播传为美谈。

作为学校篮球队的经理,Knuth编写了一个依据不同成绩标准评定每个运动员对球队贡献等级的程序。他的努力赢来了那些觉得这样做有助于球队赢得同盟冠军的教练的好评(尽管,无庸质疑,不是每个运动员都这样觉得)。

 Knuth的成就成了新闻周刊的标志,他和教练、计算机的照片也被刊登在IBM650后来的说明手冊上,当然这也是Knuth的第一个计算机应用程序。

 

1960年,Knuth从 Case毕业时享有着最高荣誉。在由全体教员參加的选举上,他因其公认的出众成就不但被授予学士学位,还被破例同一时候授予硕士学位。之后他进入加州理工学院研究生院。1963年获得博士学位,留校工作至1968年。然后转入斯坦福大学任教。其间1972—1973年以前在奥斯陆大学当客座教授。

 

1963年,Knuth回到加利福尼亚理工学院攻取了数学博士学位。之后成为了该院的数学教授。

在加利福尼亚理工学院任教期间,Knuth作为Burroughs 公司的顾问继续从事软件开发工作。

1968年。他增加了斯坦福大学,九年后坐上了该校计算机科学学科的第一把交椅。1993年,Knuth成为斯坦福大学 “the Art of Computer Programming”(计算机程序设计艺术)的荣誉退休教授。

 

 

早期成就和计算机程序设计艺术的开端

计算机程序设计艺术

1962年,Knuth还是个研究生的时候就開始了他计算机程序的工作。

那时,他已经開始了个人咨询,为不同的机器编写编译程序。编译程序是一种翻译原始或高级语言和对象或二进制机器语言的中间语言。在不知道众多软件公司正高额寻求成百上千的编辑者的情况下,Knuth编写了一个程序,赚得5000美元。他的名字立马响誉了整个行业。在伯克利毕业的前一年,世界上一流的出版社Addison-Wesley艾迪生-韦斯利出版社约初露头角的高德纳写一本编译器和程序设计方面的书,这件原本平常的事终于成就了计算机科学史上的一个奇观。出版社1962年约稿,可直到1966年还动静全无,编辑忍不住去电催促,说都过去4年了,书写到啥程度了啊?高答才3000来页。编辑惊呼那干嘛还不交稿?答曰还没进入正题呢。编辑崩溃地说,那仅仅能出多卷本了……

当Knuth的出版商计算出他的那3000页的笔迹打印成文章大约须要2000页时。大家才发现这实际上是一项多么大的project。在3000页的手写设计草图中。Knuth发明了一种综合方法,用于分析或决定结构翻译所客观须要的文法规则。近期。关于他的那第一部著作,Knuth自己这样评述:“用三年半的时间写第一章可并非件好事。”Knuth决定将它详述,成为一部更大的关于程序设计科学的纵览。共分为七个部分。一部巨著就这样——诞生了。《计算机程序设计艺术》。至今仍是各程序类图书书架上标志性的书籍

  把一件寻常的事做到人间极致。这就是高纳德。他不是故弄玄虚,他的心里攒着一股劲儿。要写一部与牛顿的《自然哲学的数学原理》相媲美的巨著。 1968年,《计算机程序设计艺术》(TAOCP)的第一卷正式出版了。这一卷的标题叫《基本算法》。但难度却并不低。。

微软首席运行官比尔盖茨在1995年接受一次採訪时说。“假设你觉得你是一名真正优秀的程序猿,就去读第一卷。确定能够解决当中全部的问题。”值得注意的是,盖茨本人读这本书时用去了几个月的时间。并同一时候进行了难以置信的训练。盖茨还说:“假设你能读懂整套书的话,请给我发一份你的简历。

”高纳德本人的说法更犀利:要是看不懂,就别当 程序猿。

  同年,高纳德跳槽到斯坦福大学。并当上了教授。

一年后,TAOCP第二卷正式出版。1973年,这本书出到了第三卷。

这三卷书被计算机界惊为“ 神作”,在最初的几年内就卖出去100多万套。

依照计划,这套书一共是七卷。可是如今刚刚写完三卷,就已是震古烁今。

震到什么程度呢。连图灵奖颁奖委员都 坐不住了。依照惯例。图灵奖的获奖者都是成就等身。要经过时代的检验。但此时,美国计算机协会便决定马上为其颁发图灵奖。

这对高纳德来说,无疑是个殊荣。 这一年他仅仅有36岁。至今。他仍保持着图灵奖最年轻获奖者的纪录。

高纳德在获此殊荣之后。再一次令世界大跌眼镜:他宣布从此歇笔了,由于排版工具太差。破坏了这套书的美。这一动作让外界十分震惊。有人说。高德 纳江郎才尽,见好就收;有人说。图灵奖对前三卷的评价过高了。高纳德仅仅好找理由撤了;还有人说。获奖之后停止写作,充分体现了他写书的目的就是为了功利。

Tex文字排版系统

  可高纳德在辍笔的10年间竟然创造了三个重要的成果:字体设计系统METAFONT、文学化编程(Literate Programming)。以及当中影响最大的排版系统TEX。

  在Word系统中写科学论文是一件非常辛苦的事,你须要调整格式,也非常难表现数学式。

可是在TEX中,这些麻烦差点儿全然不存在。仅仅要加载样式文件,排版就自己主动完毕了。

TEX是一场出版界的革命,直到如今仍是全球学术排版的不二规范。

  TEX作为一个软件产品,也令人叹为观止。它的版本号号不是自然数列,也不是年份。而是从3開始,不断逼近圆周率(眼下最新版本号是 3.1415926)。

高纳德再一次用行动宣告,这个东西趋近完美,不可能再有什么大的改进了。他还设立了奖金:谁发现TEX的一个错误。就付他2.56 美元,第二个错误5.12美元,第三个10.24美元……以此类推。结果直到今天。他也没有为此付出多少钱,可见TEX经过了如何的千锤百炼。他设置的另 一个奖项是找出其著作中错误的人能得到2.56美元。由于“256美分刚好是十六进制的一美元”。据说,获奖者将有他签名的支票视为珍宝,并不兑现。

为什么是2.56美元?Knuth 教授的答案是:

“256 pennies is one hexadecimal dollar.”


从1981年夏至1996年7月1日,Knuth 教授给指出错误的人回信250多封,当中一半以上装有奖励支票。

奖励支票清单来看,有一位名叫 Axel Böttcher 的人,曾先后5次得到两块五毛六的支票,3次得到五块一毛二的支票,真可谓牛人背后有牛人。

受麦粒与棋盘的故事影响。Knuth 教授宣布。每发现一个 TeX 程序或 METAFONT 程序中的错误,奖励从2.56美元開始,每年翻倍。最高为327.68美元。

1995年有两人领取了这项奖金。此后至今,还无人可以认领!

 

有网友戏说。什么是聪明:在 Knuth 的书中找到错误;什么是愚蠢:去兑现那张两块五毛六的支票。

 

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

  1992年,高纳德为了专心写作,宣布提前退休,并停用电子邮箱(此人从1975年就開始玩电邮了)。

高纳德一共带了28位博士生,他认为28 这个数字非常好,于是便宣布不再收学生了。虽然如此。他仍然为想要师从于他的人们留下了一个盼头:他开了一门公开课,每次会提出一个问题,假设谁能高速解出 来,高纳德就会为他的博士论文签名。不知道哪位后起之秀可以获得如此殊荣呢,我们拭目以待吧。

  2008年,在TAOCP的前三卷面市30年之后。第四卷最终面世了。而高纳德自己却已是白发苍苍的古稀老人了。

他对计算机科学的热爱,使他为这套丛书耗费了一生的心血。

 

 

依Knuth本人所讲,《计算机程序设计艺术》是他毕生最重要的事业,其目的是“组织和总结所知道的计算机方法的相关知识。并打下坚实的数学、历史基础”。Knuth撰写的前三卷被翻译成多种语言,到1976年为止,已卖出超过一百万冊。

他眼下正目不转睛地编写第四卷,他期望第四卷的篇幅约为2000页,并分为三个独立的章节。

为了完毕丛书的其余部分,Knuth如今进入了一种引退的状态,全身心地投入这项工作。Knuth说,一般说来,他更喜欢在一段时间内集中精神完毕一项工作。正像他自己在书中提出的:按“一批”的模式。

 

Knuth从他基本的工作计划中拿出了十年,即从1976年起,致力于对数字排版的研究,设计了著名的文件准备TeX系统,字体生成程序METAFONT。这项工作带来的值得注意的副产品是用于结构文件和“文章性程式语言”附随方法论的WEB和CWEB语言。

 

如今,Knuth和他的妻子Jill,两个孩子John 和Jennifer一起。住在斯坦福大学校园里。他继续着《计算机程序设计艺术》第四卷的编写工作。尽管说Knuth是全身心的投入这一项工作,但他还是能挤出时间研究MMIX的设计。那是一台64位RISC(精简指令集计算机)。

而他的业余爱好仍然是音乐,还一直邀请那些可以即兴演奏四手联弹钢琴曲的人们给他留下便条。以便安排一些活动。

 

成就简要回想

 

编译程序: 

编译程序可以实现高级语言和二进制机器语言之间的翻译。二十世纪六十年代初期,Knuth教授致力于这方面的研究,尽管现代的软件已经可以使其变的简单一些,但编写编译程序仍被觉得是一项极为困难的工作。 Knuth教授在这方面最著名的成就是LR(k)分析的研究,那是一个能使确定一串字符文法规则的过程更加顺畅的值得注目的方法。

高纳德进入伯克利攻读数学博士学位。

在此期间。他的编程生涯也正式開始了。他当时所写的程序中最值得一提的,是对ALGOL60编 译器提出的測试方法。ALGOL60常常会由于编译器不成熟而出故障。高纳德编写了一段很easy的測试程序,江湖人称“Man or boytest”。翻译成中文就是“是男人就得-67”。高纳德说。仅仅要用ALGOL60编译器来编译我的这段程序。假设执行结果等于-67。就说明这个 编译器是纯爷们儿。

 

属性文法: 

在编译程序的工作之后。Knuth教授走上了形式上定义程序语言意义、语义的研究道路。他建立起一个更加经济的方法去通译联合规则。他把这样的方法称作“属性规则”。该方法创立的同一时候,计算机科学的子域被称作“属性文法”。

 

算法: 

或许Knuth教授在计算机科学领域最原创的贡献就是他对于算法的分析。”算法”和“数据结构”是Knuth29岁时提出来的。算法是编写一个程序,使之能去完毕一项任务的基础,比如搜索或分类等。

在加利福尼亚理工学院时,Knuth教授在一个毕业生的协作下,开发了用来探究数学公理推论的Knuth-Bendix算法。1968年。Knuth教授在斯坦福,和他的一个学生开发了Knuth-Morris-Pratt算法。该法则使计算机在文章中搜索一串字符的过程更加连贯。

他所著的《计算机程序设计艺术》是一个详尽的算法实践和科学的概观。

 

数字化排版: 

数学书籍和杂志已经不像从前那样美丽了。”Knuth教授在一篇早期关于数学排版的文章中这样写道。因为对计算机排版的校样的低质量感到无法忍受,Knuth教授从他史诗性的七卷集巨著的编写过程中拿出了十年时间。来开发一个高质量的计算机排版系统。其间,Knuth开发了两个用于文件排版和字体生成的软件系统,这两个系统如今已被世界大多数出版社运用。它们各自是TeX。用于出版业的科学排版,和“优美文章”的产品;METAFONT,一个字体生成程序。

 

结构化文件和文章性程式语言:

 Knuth教授的排版研究。引领他发明了文件构造的两种语言和一个方法论。叫作“文章性程式语言”。语言各自是WEB和CWEB。它们促进了程序编写向“文学作品,是用来阅读的”这个方向发展。这两种语言的结合,一种是文件格式化,还有一种是程序设计,这就使程序猿可以同一时候创建两个不同的系统程序。一个面向人,还有一个面向机器。

当一条过程清楚地描写叙述程序并促进其维护时,另外一个则产生一个机器可运行的程序。

这些工作就是Knuth教授在实现其使程序设计为读者易懂、甚至感觉美丽的目标的过程中。在计算机领域里所做出的巨大贡献。

posted on 2017-05-03 13:21  blfbuaa  阅读(13705)  评论(0编辑  收藏  举报