计算机程序设计艺术 如何阅读和学习《计算机程序设计艺术》(TAOCP)?_计算机程序设计艺术

[计算机程序设计艺术]如何阅读和学习《计算机程序设计艺术》(TAOCP)?
读过TAOCP(中文名:计算机程序设计艺术;原名: The Art of Computer Programming)的朋友能不能谈谈阅读本书的经历,以及提一些关于学习本书的建议?/>下面就看看www.aIhUaU.com小编为您搜集整理的参考答案吧。

网友匿名用户对[计算机程序设计艺术]如何阅读和学习《计算机程序设计艺术》(TAOCP)?给出的答复:
哦,上帝!《The Art of Computer Programming》

引那位出名的王垠对TAOCP的评论:

本来早就想想写一个对于Knuth的The Art of Computer Programming的看法。
没想到一去Amazon就找到一个同类
关于Knuth的 TAOCP,我想,大部分人声称看了他的书,或者买了他的书,不过是作为一种炫耀的资本或者摆设。我对门的同学几年前就买了一套三本,全新的精装本,花了 200多块钱。可是呢,他从来就没看。我把它借过来,看了几页就放在那里没有看了。我哪有时间看他用那些一个字节6位的机器语言实现简单的链表!有一天一个师弟走进来,看到那套书在我书架上,显示出一种敬畏感:“挖!师兄!你好牛啊!居然看这么高深的书!” 我一愣。嗯,不错嘛,这套书放在书架上可以让人对我刮目相看。这恐怕就是它对很多人的实际作用。还有人可以帮助神化这套书,同时也神化自己,比如他可以这么说:“谁要是看完了Don Knuth的 The Art of Computer Programming 我就雇用他!” 这样可以显得比一般看过书的人还要高一等。据说Bill Gates就是这么做的。我怀疑他自己看完过没有。

我讨厌这套书的一个原因就是Knuth故意用一个叫 MIX 的处理器的机器语言来写这本书。虽然在新版的书里他设计了一种新的处理器 MMIX,但是换汤不换药。他以为一部“永恒”的计算机编程书不应该使用高级语言,因为它们很容易过时。但是他错了,机器语言恰恰是最容易过时的东西,看看现在有多少牌子的更新换代的处理器就知道。而世界上确实存在非常高级的语言从60年代到现在都没有过时。我预言,MMIX会在不久的将来被淘汰。很好笑的是MMIX是在MIX上加了一个“M”,代表Millennium(千禧年)。关于它的专著也起名为 MMIXware---A RISC Computer for the Third Millennium。一千年甚至短短一百年,几十年以后,计算机还是不是二进制的集成电路都说不清楚,况且这个处理器其实就是从别的处理器比如RISC II, Sparc之类的捡了一点东西,没有什么大的创新。他就把这个处理器的模拟程序印在纸上卖,曰:“一个优秀的程序要像一部好的小说一样容易读懂。一个优秀的程序员会在将来拿到普利策奖。”

用机器语言写一点初级的计算机入门部分还可以,但是用来写整整一部书未免容易让读者只见树木不见森林了。看TAOCP最容易出现的一种现象就是,“哇!原来这个程序可以这么写。” 但是你不知道为啥那么写。虽然可以知道一些底层的原因,但是最根本的原理,读者始终不会明白。就像看清楚了一张图片上的每一个像素,却认不出图片上其实是一个熟人。看清楚了棋盘上每一个棋子能走的地方,却不能赢棋。Dijkstra 说计算科学不应该被叫做"computer science",就像外科手术不应该叫做"knife science"。可是这关Knuth什么事呢,他的书名叫做 The Art of...

我曾经说找到Knuth书里的错误,得到几张支票,受到很大鼓舞。我真的受到鼓舞了吗?我真的从他的书里得到什么新的想法吗?抛开潜意识里想显示一下自己的念头,我得出的结论是:没有。每一个认为自己从这套书得到了什么的人都仔细想一下,到底你的知识,你的新想法是从哪里来的?

再说他的支票吧…… 很多人拿了Knuth的支票就作为一种可以炫耀的东西。以前我就看到一个Cambridge的教授主页上挂着一个Knuth支票的照片。Knuth的支票真的可以作为炫耀的资本吗?告诉你们,我找到的错误都是typo而已,没想到他也给我支票。谁叫他打字不小心,Millennium都能打成 Millenium?嘿!我凑足了一顿饭钱的支票时就想去中国银行兑现,准备换了钱大吃一顿。可是银行的职员告诉我,他们必须把支票寄回美国才能拿到现金,办理这件事的费用大大高于支票本身的价值!所以Knuth相当于给我一些空头支票。Damn!早该想到的,他为什么不往大家的信用卡上面转账,而使用支票这种过时的东西!他明显觉得有他签名的支票,肯定谁也不会拿去兑现,甚至装裱在相框里作为纪念。hmmm... 算你狠~

好了,啰里啰唆。还是看看这个别人写的书评。White elephant,这确实道出了我对这套书的感觉。 (但是评价者有些观点我不能苟同,比如“O(n)表示法足够了”。) 希望以后对 paper 也有这种公开的 comments!






Dan Friedman 的故事 (4)——C311

当我刚从 Cornell 转学到 IU 的时候,Dan Friedman 叫我去上他的研究生程序语言课 B521。我当时以自己在 Cornell 上过程序语言课程为由,想不去上他的课。Friedman 把我叫到他的办公室,让我在他旁边坐下来,和蔼的对我说:“王垠,我知道你在 Cornell 上过这种课。我也知道 Cornell 是比 IU 好很多的学校。可是每个老师的教学方法都是不一样的,你应该来上我的课。我和我的朋友们在这里做教授,不是因为喜欢这个学校,而是因为我们的家人和朋友都在这里。”后来由于跟 Amr Sabry(我现在的导师)的课程 B522 时间重合,他特别安排我坐在本科生的 C311 的课堂上,却拿研究生课程的学分。后来发现,这两门课的内容基本没有区别,只不过研究生的作业要多一些。

在第一堂课上,他说了一句让我记忆至今的话:“《The Little Schemer》和《Essentials of Programming Languages》是这门课的参考教材,但是我上课从来不讲我的书里的内容。”刚一开始,我就发现这门课跟我在 Cornell 学到的东西很不一样。虽然有些概念,比如 closure,CPS,我在 Cornell 都学过,在他的课堂上,我却看到这些概念完全不同的一面,以至于我觉得其实我之前完全不懂这些概念!这是因为在 Cornell 学到这些东西的时候只是用来应付作业,而在 Friedman 的课上,我利用它们来完成有实际意义的目标,所以才真正的体会到这些概念的内涵和价值。

一个例子就是课程进入到没几个星期的时候,我们开始写解释器来执行简单的 Scheme 程序。然后我们把这个解释器进行 CPS 变换,引入全局变量作为"寄存器" (register),把 CPS 产生的 continuation 转换成数据结构(也就是堆栈)。最后我们得到的是一个抽象机 (abstract machine),而这在本质上相当于一个真实机器里的中央处理器(CPU)或者虚拟机(比如 JVM)。所以我们其实从无到有,“发明”了 CPU!从这里,我才真正的理解到寄存器,堆栈等的本质,以及我们为什么需要它们。我才真正的明白了,冯诺依曼体系构架为什么要设计成这个样子。后来他让我们去看一篇他的好朋友 Olivier Danvy 的论文,讲述如何从各种不同的解释器经过 CPS 变换得出不同种类的抽象机模型。这是我第一次感觉到程序语言的理论对于现实世界的巨大威力,也让我理解到,机器并不是计算的本质。机器可以用任何可行的技术实现,比如集成电路,激光,量子,分子,基因…… 但是无论用什么作为机器的材料,我们所要表达的语义,也就是计算的本质,却是不变的。

而这些还不是我那届 C311 全部的内容。后半学期,我们开始学习 miniKanren,一种他自己设计的用于教学的逻辑式语言 (logic programming language)。这个语言类似 Prolog,但是它把 Prolog 的很多缺点给去掉了,而且变得更加容易理解。教材是免费送给我们的《The Reasoned Schemer》。在书的最后,两页纸的篇幅,就是整个 miniKanren 语言的实现!我学得比较快,后来就开始捣鼓这个实现,把有些部分重新设计了一下,然后加入了一些我想要的功能。这样的教学,给了我设计逻辑式语言的能力,而不只是停留于一个使用者。这是学习 Prolog 不可能做到的事情,因为 Prolog 实现的复杂性,会让初学者无从下手,只能停留在使用者的阶段。

我很幸运当初听了他的话,去上了这门课,否则我就不会是今天的我。






谁是真正的程序语言专家

Knuth 也曾有类似的说法:“要是看不懂 TAOCP,就别当程序员。”他总是被誉为“计算机科学的神”,在他的演讲里大谈文学,艺术,上帝和宗教,给人陡增神秘感。他总是说程序员应该学习机器语言,而不是高级语言,机器才是不变的真理。但是 Knuth 却不是从科学的角度来看这个问题,而只是他个人的偏见。当他看到 Fortran, Lisp, ALGOL, Pascal, C, C++, Java 这些语言的发展仿佛没有尽头的时候,他并没有理解其中不变的原理。在程序语言的设计上,他不是一个强者。他很有可能根本不理解 lambda calculus 和类型理论,否则他不会设计出像 TeX 那样毫无章法的语言。TeX 排版的质量无可厚非,但是到了1978年还仍然采用程序语言专家们早已深恶痛绝的 dynamic scoping,再加上其它一些蹩脚的设计,说明他对程序语言理论缺乏理解。实际上 TeX 含有一个图灵完备的扩展语言,是因为 Knuth 采纳了 Guy Steele(Scheme 的发明者)的建议,然而 Knuth 却没有把它设计好。

Knuth 觉得机器是不变的真理,所以他坚持用机器语言来写作 TAOCP。但是由于机器语言缺乏抽象,程序员没法专注于真正的问题。使用机器语言来描述算法,会把本来很简单的问题都显得高深难懂,仿佛这书永远也看不完。有多少人真正的看过 TAOCP 呢?恐怕大部分人把这套书买回去,只是把它们摆在书架上做面子。只要有人说机器语言太难懂,这些人就会说你自己不够聪明,不配做程序员。而其实呢,他们自己都没看过。

机器不是计算的本质这个事实,很多人包括 Dijkstra,早就看到了。他说:“计算机科学是个错误的名字,因为它不是计算机的科学,这就像外科手术不是刀子的科学。”而这是几乎每一个程序语言专家都明白的道理。在他们的眼里,这不再是道听途说或者个人观点,而是可以用逻辑来证明的事实。真正明白计算本质的人,可以设计出全新的硬件来来满足语义的需要,而不是受控于处理器的设计。他们甚至可以超越集成电路,而使用另外的技术来制造机器。这些都说明,计算其实是独立于机器的。

有不好的想法不要紧,但是如果把不好的想法硬说成是好的,那就会阻碍历史发展了。我并不否认 Knuth 和 Ritchie 对算法,排版和操作系统的重要贡献,但是由于他们以及他们崇拜者经常在有关语言的事情上误导群众,所以觉得有必要指出他们的一些局限性。Linus Torvalds, Guido van Rossum, Eric Raymond, Paul Graham 也经常发表对语言的评论,被很多人奉为圣旨,但其实他们言论里面很少有真知灼见。

其实我要说的不过是,通常程序员们膜拜的偶像,大部分都不是真正的程序语言专家。希望你不要觉得这是危言耸听,实际上这些是大部分世界级的计算机科学家们很多年前就知道的事情。他们不把这些向大众公开,是因为他们都是聪明人。

网友张李对[计算机程序设计艺术]如何阅读和学习《计算机程序设计艺术》(TAOCP)?给出的答复:
赞同王垠的说法,曾经因为听信别人炒作去图书馆借来看,看了开头几页就看不下去了,作者虚构了一个6位的处理器及其汇编指令集来讲授编程,连Linux据说都是90%以上都用C来写呢,看那种非通用性的汇编纯属浪费时间。讲算法讲得很好的书现在已经很多了,各种语言实现的都有,选最适合自己的即可。

感觉此书现在已经成为了类似于皇帝的新衣般的存在,大部分人没看,却要跟着说:”啊,真好,真牛逼“。也没听说有哪所学校——从山东蓝翔到麻省理工——拿它当教材的。向来很喜欢王垠那种独立思考、老实研究、坦诚明言的做法。

网友蒙面大侠对[计算机程序设计艺术]如何阅读和学习《计算机程序设计艺术》(TAOCP)?给出的答复:
你先把前言看了。有兴趣再往下看。这本书对你功底大有好处,而且它很有趣。极有价值。值得一看。第二卷《半数值分析》我没细看,口味太重,我没耐心了。第三卷《排序与搜索》又非常好看。看了你就知道,原来B树之类的现在大学教材上的东西,早已有之。甚至教得比大学教材上得有味道。而且你会从这三卷书中学会使用各种数学工具,甚至能够用在工作中。把你的境界往上拔一个层次。

网友匿名用户对[计算机程序设计艺术]如何阅读和学习《计算机程序设计艺术》(TAOCP)?给出的答复:
1. 总的原则是:你如果用最难的方式学,你会收获最多。
2. 最难的方式就是:你读它,如果遇到一个问题,一个定理,一个例子,没搞懂,不要再继续看,不要看答案,把书合起来,然后绞尽脑汁地想,用几个小时几天时间,把它搞定,然后再继续看书,看答案。
3. 按照2的方式训练,你可以最快地在思维上跟TAOCP看齐。
4. 必须做题,例题,习题,题题过。
5. 这本书只适合有耐心有毅力能抽出几个月闭关什么都不做专门学习这本书的人。平时三三两两的看下,没什么效果,浪费时间。从这个角度看,大学教育是浅薄无效的教育,唉...

------------------------------------------
个人看法,仅供参考。

网友Li元对[计算机程序设计艺术]如何阅读和学习《计算机程序设计艺术》(TAOCP)?给出的答复:
Knuth选择汇编语言的理由恰恰是因为他认为Computer不是最本质的东西,语言不是最本质的东西。既然这些都不是本质的内容,那么选择什么语言就无所谓了。可是,选择汇编语言却为写作带来了极大的便利,与高级语言相比,汇编语言的进化是相当缓慢的。这套著作最初写于20实际60年代,在50多年的时间里,高级语言换了一代又一代,而计算机体系结构又有多少变化呢?如果Knuth在开始写这部著作的时候,选择了当时流行的Algol语言,还不如用汇编的好,不得不说作者是很智慧,很有远见的。另一方面,汇编语言并不代表它就是机器,它代表了一种计算模型,难道当我们说图灵机或者冯诺依曼机就想到了实实在在的机器么?

有人拿Knuth的书炫耀是一会儿事,Knuth选择什么语言来写书是另一会儿事儿,不要混为一谈。Knuth通过兑换支票的方式来提高书的质量,哪怕是印刷质量难道有什么不妥么?不要以小人之心度君子之腹。还有,拿来当教材的书只是因为那本书适合当做教材,你见过有学校拿牛顿的《自然哲学的数学原理》当做教材么?还是达尔文的《物种起源》当做教材了,你难道就可以否认这些著作的价值么?

网友蒙面大侠对[计算机程序设计艺术]如何阅读和学习《计算机程序设计艺术》(TAOCP)?给出的答复:
最近我发现了一种正确的读法,在Coq里检验一下这本书里的证明。

网友王川对[计算机程序设计艺术]如何阅读和学习《计算机程序设计艺术》(TAOCP)?给出的答复:
本科时买了第一册,读硕士时买了第三册。最初尝试像对待一本普通技术书籍那样从头开始读,很快就意识到自己没有能力一页页地读下去,更别提认真对待里面的“习题”了。

后来就和大多数计算机研究生一样,把它作为基础算法的权威参考书来用。需要深入理解某基础算法时,就拿出来琢磨相关的几节,但从来都跳过其中的MIX汇编代码。书中对算法发展历史及平均情况性能分析的重视难以在其他算法参考书中找到。

计算机程序设计艺术 如何阅读和学习《计算机程序设计艺术》(TAOCP)?_计算机程序设计艺术

网友张无忌对[计算机程序设计艺术]如何阅读和学习《计算机程序设计艺术》(TAOCP)?给出的答复:
就跟学英语去背牛津大字典一样,背完了牛吗?当然很牛,比native speaker词汇量还大。
这点上完全支持王垠,有读TAOCP的功夫把dan friedman的那几本书+SICP读一遍。

  

爱华网本文地址 » http://www.aihuau.com/a/318051/184874285876.html

更多阅读

手机启动程序管理需要如何操作 用管理员启动程序

手机启动程序管理需要如何操作——简介 对于我们的手机很多时候我们都只是在用一些手机的功能,相对于手机管理来说很多人就不知道如何操作。很多人可能并不是特别了解我们的手机功能管理,当我们并不善于管理手机,而手机长时间使用后,我

面向过程与面向对象的程序设计语言! 面向对象语言

计算机和程序的本质都是要模拟客观世界。客观世界是由众多的对象相互联系和相互作用而形成的一个复杂系统。由于人类认知能力的局限性,人们不可能用一个程序来模拟整个客观世界(那是人类的终极理想),而是根据需要模拟客观世界的某个局部

声明:《计算机程序设计艺术 如何阅读和学习《计算机程序设计艺术》(TAOCP)?_计算机程序设计艺术》为网友爱狠无奈分享!如侵犯到您的合法权益请联系我们删除