首页 » 科技 » Coders at Work中的Knuth访谈(一)

Coders at Work中的Knuth访谈(一)

本文是Coders at Work一书中Donald Knuth一章的试译版本,欢迎各位朋友斧正。

Tags:编程 | Knuth

全书所有人物中,Donald Knuth或许是最无需介绍的一位。过去40年间,他致力于完成多卷本巨著《计算机程序设计艺术》[译注1]——这是一部描述基本算法与数据结构的经典著作,被《美国科学家》杂志评为20世纪最牛的12部自然科学专著之一,堪与罗素和怀特海、爱因斯坦、狄拉克、费曼以及冯·诺依曼等人的大作比肩。他推广算法分析中的渐近符号(即大O符号),发明LR语法分析,还为goto语句从Dijkstra的批判中正名[译注2]。

然而他不仅是个理论家。在1976年完成《计算机程序设计艺术》的第三卷之后,为了把自己的著作排版得更加美观,他本打算用一年时间写一个叫做“TeX和METAFONT”的排版软件。十年后,他把这软件搞定了,同时他还带来了一种新的编程风格“文学编程”,和一种用于排版、至今仍很先进的文章段落断行算法。

他所获的无数奖项中囊括了首届美国计算机协会Grace Murray Hopper奖(1971年)、图灵奖(1974年)和美国国家科学奖(1979年)。他从1990年起不再使用email,因为他工作时不必巨细靡遗。他所关心的只有一件事情——让其著作成为深入理解与解释计算机科学各领域的基石。

在下面这篇访谈中,我们会提及Knuth对文学编程的热情洋溢、对黑箱的矛盾心理,以及对过度强调软件复用的惋惜和遗憾。


 

Seibel: 你是什么时候开始学习编程的?

Knuth: 是1956年秋天,我在凯斯理工学院[译注3]读大一时。那阵子学校弄到了一台计算机。

Seibel: 是IBM 650?

Knuth: 没错,就是650。它是首台产量破百的计算机。我估计它共生产了好几千台,但应该没到一万。感谢它的量产,就连凯斯都能分一杯羹。

我那时在统计实验室打工,工作是整理卡片。我还主动帮统计员们绘制数据表,以贴补奖学金的不足。那房间在实验室的一楼,有个窗户,你可以看到那台计算机就在窗户后面,其上的指示灯忽明忽暗。这简直太迷人了。

一天下午,实验室里的一个家伙走到黑板前,给我们三个大一新生解释了那台计算机能做些什么。我找到一本关于那机器的手册,手册上有一些十行的示例程序。这些程序在我看来并不高明——程序如此之短但仍有改进余地。

后来我们获准在晚上操作那台计算机。这事儿并不常见,我想当时大概只有达特茅斯[译注4]和凯斯允许本科生碰计算机,而其它地方都会有专人负责管理。你头一天先提交给他们几组卡片,然后第二天他们再把结果给你。在凯斯不一样,你什么都得自己办,他们只会说些“嘿,对这玩意上点心”或者“你不该那么做”或者“这会把机子弄得一团糟”之类的话。这样一来,我们还真有不少摆弄它的好机会。

无论如何,我得先看看我对程序的小改动好不好使,结果它真的好使。于是我感叹道:“天那,这太夸张了吧。我不过是个大一学生而已,但我却比这书里的程序做得更好——没准我是个编程天才。”好吧,事实证明我的确是个天才,但却不是如我所想的那种,因为几乎人人都能写出胜过那本“奇特”手册的程序。

这机器用的是十进制,所以我用不着学习奇怪的二进制计算,尽管我中学时已对二进制计算略有所知。它是十进制这一事实使得它以某种方式显得更加人性化,或者怎么说呢,更让人觉得舒服。我至今仍然记得它的一个机器码——65表示reset-add-lower[译注5]——这可以帮我编口令什么的。

Seibel: 坏了,你这不是说出你的秘密了吗。

Knuth: 嗯,是啊。之后,我决定写个100行左右的小程序计算某数的质因数。我在夜深人静、机器空闲的时候调试程序,结果在100行的程序里找出了上百个bug。不过两星期后我完成了这个程序,它能够给出你用控制开关输入的任意一个10位数字的质因数。

这就是我学习编程的方式——说白了就是先鼓捣出一个程序,然后在机器前耗上几周时间,慢慢让这个程序一点一点好起来。

我的第二个程序是在二进制和十进制之间转换。然而真正让我成为一个程序员的是我的第三个程序,那是一个井字棋游戏[译注6]。

我必须在这游戏里用到一些数据结构。我做了三个版本的井字棋游戏,其中之一能够自学习。它起初对游戏一无所知,然后它会觉得每次输棋时走过的那些步挺差劲,而它的对手走的那些步还不错,因此它会给某些格子加分同时给另外一些格子减分。在下过400盘以后,它就能下得有模有样了。

 


 

译注1:这部家喻户晓的著作原计划出7卷,但Knuth在其网站上的言词似乎让人感觉(至少译者这么认为)完成前5卷是更现实的任务。他打算在写完第5卷之后,再对第1至3卷进行一次修订;并且写一本精华集,包含1至5卷最重要的内容。

译注2:goto语句是否有害的论战曾在程序语言史上风行一时。Dijkstra批评goto语句破坏了程序的结构,而Knuth较为客观地从程序结构和效率两方面分析了goto语句,主张为了提高效率可以有控制地使用goto语句。此类论战可谓见仁见智,角度不同,见解也就不同。但就译者看来,现今的高级语言往往通过包装goto语句将其改头换面,达到提高效率的目的,如异常处理、break、switch语句等都是有条件限制的goto语句,这也证明Knuth的观点更贴近实际一些。

译注3:凯斯理工学院(Case Institute of Technology),由慈善家伦纳德·凯斯创立于1880年,位于俄亥俄州的克利夫兰。1967年与西方储备大学合并为凯斯西储大学,合并后为俄亥俄州第一学府,同时也是该州最大的私立研究型大学。

译注4:达特茅斯学院(Dartmouth College),建于1769年,是美国历史第9悠久的大学。它是位于美国东北部新罕布什尔州汉诺瓦市的一所私立大学,同时也是常春藤盟校之一。

译注5:reset-add-lower是IBM 650的一条指令,其机器码为65。该指令的作用是先把累加器清零,然后把指定内存里的内容加到累加器的低10位上(IBM 650的累加器共有20位数字位和1位符号位),其作用似乎相当于现在汇编语言里的MOV指令。

译注6:井字棋游戏(tic-tac-toe),在九宫格内由双方轮流落子,先连成直线或斜线者胜。由于局面较为简单,因此后来开发出不少变种以增加难度。也正由于其局面的简单性而被广泛用于人工智能算法的研究。

【本文翻译仅为外语学习及阅读目的,原文作者个人观点与译者及译言网无关】

0

评论