我的那些书,2-6 计算机程序的构造和解释 & C程序设计语言

11. 计算机程序的构造和解释
[https://book.douban.com/subject/1148282/]

s1113106
每个学科都有几本经典教材,类似《圣经》那种。如果你读过了,并并不会因此就登天成仙,但是如果没有读过,一定被别人瞪着眼睛看,"你是~学计算机的么?"这个"是"字的字音咬得很重,无论说话的人是哪里的人,听起来都是京腔的讽刺。计算机专业兴起虽晚近,但是近年来大气侯之下日益近乎显学,所以人口也众。因此经典教材耳熟能详,龙书、虎书、鲸书、花书、西瓜书,也有用缩写的,TAOCP,CLR(作者们名字的首字母),CSAPP。都是九阴真经,删除了九阴白骨爪和摧心掌两节。

还有一本,被称为 巫师书、魔法书、SICP、紫皮书,全名是《计算机程序的构造和解释》。我在开课的序论和推荐的时候,都要介绍,这是麻省理工大学30多年的教材。我们在研究生阶段学起来仍然会非常吃力,但是收获也是一样"非常"。

计算机系多是电子和数学两个系合并而来,学生的基础也是这样。我的计算机基础,是从物理、电子学,硬件的方向一路学过来的,后面就是编程序编程序编程序,所以数学和计算机理论的基础挺差的,是这本书领我入了门,学着从数学的角度理解机器。从这本书开始,我才知道数据的抽象、过程的抽象、过程与数据的等价,在领域特定语言实现中让我觉得心里有底的那些东西。还有我曾经学过,这本书让我重新审视和理解的基础概念,比如算法的时间复杂度,比如公理系统。

作为导论,这本书对我产生了一系列影响,在以后的日子里逐渐展开。下定决定开始使用EMACS,因为它使用lisp定制。向算法的基础领域,读了像 Algorithmic Adventures 这一类书。向DSL领域,重新审视了以前学过的知识,部分重读了 Martin Fowler 的 Domain-Specific Languages。读CSAPP的时候,想着SICP。还有高纳德 (高博译) 的《研究之美》,如果没有SICP的基础,我是不会有勇气翻开的,虽然后来也仍然有太多没有读懂。事实上,此后的所有学习和项目,都从SICP的角度上观察一番。塑造了我在计算机领域的"世界观"。

全书一共5章,前三章是简单和基础的部分,后两章是高阶。我只学了前三章的时候,感觉就类似于郭靖刚喝完梁子翁的大蛇血,凭空添了几个甲子的功力。是这本书 (参与) 给了我勇气,跟HXL同学和ZJ同学一起实现了我们组最初的DSL,与包师弟一起写了最初的解释器。说服他们还有导师"就这么整吧,一定能行"的时候,我的背后站着的就是SICP。核心部分所花的时间都只有一两个小时,带来的效益都极其明显。对问题的正确抽象,特别是使用了高度强大极其有力的工具,就是那种把锤子用在砸钉子,把刀用来切割的感觉,把工具用对了的感觉。

我读中文版的时候,把书拆成若干小节,每天没事就看,用高亮笔、红色圆珠笔、黑色中性笔作注,还做了一点点习题。仅仅这点努力,就有了那么多的收获。无论是工程项目里的应用,还是展开的知识图景,于我,与其说是SICP作为导论注解和总结了后面我的所学,不如说我后面的所学不过是SICP的应用。

这么优秀的著作非常值得每个学习计算的同学一读。更方便的是,作者甚至还提供免费下载。有的同学可能会说,"免费的是英文版啊。"只要你在计算机领域,无论是学术还是工程,你的未来职业就是以英语为母语的,因此你总要开始从某一本英文著作开始习惯。这第一本英文原文著作,SICP就很合适。它特别合适的原因是,读起来非常非常慢,语言不是阅读的瓶颈,大脑才是。所以不会因为英语而产生焦虑,反正用汉语读也不会更快,语言带来的那点速度根本不值一提。汉语翻译也很好,是北大的裘宗燕老师的译作。

对于SICP这样的导论和基础的教材,有不止一位同学问过我类似的问题,是不是讲的ABCD (此处用这位同学曾经学过的一些术语或者经验替换)。答案是: 不是。是什么呢?以你此刻的经验一定不会明白的,或者是我没有能力讲清楚。就像只学过四则运算的小学生也会想,微积分讲的到底是不是更大的数的计算呢,一百位,一千位,一万位的大数乘法么?

在传说的故事里,高潮之前的黑暗里,有老师父点化后辈,经常只须一句。然后你换了个这个角度去理解世界,突然就悟了,变得无比强大,然后就战胜了敌人。SICP就是这样一本书。

12. The C Programming Language
[https://book.douban.com/subject/1236999/]
s29586132
初读这本书,是在东北师大图书馆,本科读书的时候。中等程度破旧,应该是在很多师兄的手里翻过了,比《日本剑侠宫本武藏》这样的小说的品相好一些,有限。当时我们课上还没有开始学C语言,我凭着高中那点BASIC基础,每天涎着脸皮向师兄们讨教。有位师兄,我不确切地记着,推断起来就应该是ZSP,他说,"去看书"。师兄们的教材是谭浩强先生那本著作,我当时也并没有觉得有什么不好,读得乐颠颠的。也是推论起来,按我的个性,应该没怎么读,只是做了很多实验。做不明白实验的,应该就是扔下书跳起来,"写的什么破玩意。"

读不懂,就得多看,看别的书咋写的。阴差阳错地就读了这本经典,C语言之父K&R的作品。装帧版式俱已不记得。以我当时的英语水平,应该读的是中文版。确定读过是因为后来细读《C++程序设计语言》的时候,参照再读《C程序设计语言》。翻来翻去如此眼熟,就像贾宝玉什么时候以前见过林妹妹。恍如隔世,但是那些句子,那些例子,那些习题,如此清晰。一下子就回忆起,在三楼机房,用TurboC调代码的日子。当初是怎么错的,如何误解了指针,历历在目。原来,是这位老朋友。

经典教材之于我,就像好木匠的刨子,不允许别人碰一下,就像武士的刀剑要常擦拭,巴不得供起来。那是我们身为工程师,用来安身立命糊口养家的家什,是我们的父母一样神灵一样的存在。初识编辑周筠老师的时候,一听说侯捷等优秀著作都是她编辑,我把小眼睛都瞪圆了,表达了类似"感谢赐给我们食物"。她可能觉得,又遇上个疯子吧。这种情感是真的,就像我感谢高考。没有高考的话,我应该正在东方红剧场门口卖瓜子。或者如有的朋友所说,那样的美日子我也不见得混得上。就像我感谢计算机,在博士论文的致谢中(虽然我知道有人会觉得奇怪,但是)一定要感谢前辈科学家和工程师赐给我们职业,对于经典教材带来的受益终身的影响的感谢,就应该像影响本身那么深。

C语言之后的所有语言的学习,都带上了C语言的影子。C语言的范围如此广泛,以致于我的母语不再是BASIC语言了。

后来读过一个贴子,提到,同时代与C语言竞争的语言很多,C并不是一支独秀。C的作者写了UNIX操作系统,用C重写了UNIX的内核。所有这些工作的目的,就是为了在闲置的PDP-11机器上打游戏。对了,他们在UNIX里写了个游戏,好像是游戏厅还是酒吧里的"街机"游戏太空战。这些都是传奇故事,并不是C语言能生存和流行下来的原因。真正的原因,是C语言是极其优秀的抽象,无论是对现实(数学模型和工程) 问题,比如整数、小数、四则运算,还是对计算机体系结构,比如内存、间接寻址,还是对算法,比如顺序执行、循环、判断、函数的嵌套、递归。在问题和方法间的妥协也非常杰出。这并不是显然的,我们觉得显然,只是因为生在红旗下长在蜜罐里,没有见过艰难岁月里那些糟烂的工具,误以为理应如此。

感谢C语言带给我们食物,还有,生存的尊严。

待续

------------------------------------------------------

博客会手工同步到以下地址:

[http://zhuanlan.zhihu.com/younggift]

[https://younggift.net/]

//[http://blog.csdn.net/younggift]

//[http://giftdotyoung.blogspot.com]

微信公众号 杨贵福