CSAPP

时间:2022-07-01 10:39:46

陆陆续续花了2个月的时间终于把这个久负盛名的CSAPP看完了,不愧为一本名副其实的经典书籍。有种相见恨晚的感觉,以至于从不会写书评的我也情不自禁的想说点什么。 

   这本书的书名叫”Computer Systems: A Programmer's Perspective",从程序员的角度去理解计算机系统,也暗示了书中讲的任何内容都会和程序员所做的事情联系起来。就这点看来,书的中文名取的不好。 

   第一章是引子,通过任何编程书里都作为第一个程序的”hello world“来分析了整个软件硬件系统。不错,本书要讲的都在第一章里涵盖了。高级语言通过编译链接后在计算机系统里是如何表示和执行的?这是个引子,同时也是summary。看完这章马上提起了我的兴趣,以前学过的课程和看过的书,要么是从讲某一种高级语言,要么是完全不涉及软件的计算机组成原理。至于怎么将两者联系起来,恐怕大部分程序员都没有这样的概念。 

   第二章回顾了整数浮点数的二进制表示,以前学过,但是恐怕很多也忘得差不多了。这章感觉最深的是无符号和有符号数,在代码中尤其要注意两种数据计算时上溢下溢的问题。 

   第三章主要是讲汇编语言,以前也学过这个课程,记得当年的老师是某某博士,十句话中至少有九句”那么也就是说“,以至于大家都不听课,唉,这样的老师真是误人子弟啊!但是当今大学里这样的只会搞科研而不会教书的老师太多了。这章的独特之处是把高级语言写的程序和对应的汇编代码联系起来了,对照着理解,方明白机器是如何实现语言级别的设计。 

   第四章属于体系结构的知识,讲了CPU的指令集,流水线等等。甚至还重点描述了HCL做硬件设计,算是很深入的一个主题了。 

   第五章的名字特别吸引人---“优化程序性能”,在程序员的日常开发中,设计和优化部分可能占的比例最大。一个模块一旦设计好了之后,写代码是很快的。功能实现之后恐怕就一头栽进了性能优化方面的工作了。这章针对一个简单例子竟然从五六个方面进行了优化,尤其这里把指令流水线也考虑进去了。恐怕对我等普通程序员来说也是从来没有想到过的。 

   第六章讲存储器的层次结构,这部分是程序员直接能感受到的。整天沉溺于分配内存释放内存之中的我们了解最多的是内存和硬盘,而这章中着重讲的是两级高速缓存的原理以及告诉缓存级别的代码优化。如果配以valgrind的machgrind来分析程序的话能加深对这部分的理解。 

   第七章讲链接,这个主题也是编程类书籍少有涉及的,如果内容再多点就好了。《Linkers and Loaders》和《程序员的自我修养》这两本书应该很值得参考。 

   接下来第八章讲异常控制流,不过这里的控制流不仅仅是程序中的exception。从底层硬件到高层语言,每一级别都有异常,如何处理这些异常,也是程序员需要时时注意的问题。 

   第九章分析了测量程序执行时间,这个分析程序瓶颈时经常需要做的事情。不过这章更深层的分析了如何能够得到准确的执行时间,尽管操作系统提供了获取时间的借口,但是我们并没有考虑过其准确度和精确度。 

   第十章恐怕是喜欢的人最多,虚拟存储器,与程序运行直接相关的一个概念。这部分的学习对于每个程序员来说是必须的,否则的话总会迷茫于sizeof数组如何得到数组长度的疑问中。 

   后面三章讲了系统级I/O,网络编程和并发编程。这部分的内容与硬件关系少一些了,主要是进程和线程级的。内容不多,但是每一部分都值得深入学习。 

   本书的一个目的是要把阅读者带入权威程序员行列,巧合的是我也是在阅读这本书期间升职到senior(看来真是要感谢作者)。当然和权威还差的远,但是看完这本书能让你理解整个计算机系统。以后的编程中你的思路更广,考虑的问题也会更全面。 

   除了书中介绍的这些内容,我想还能将计算机系统中的一些设计思想放到面向对象的设计思想中。像存储器的层次结构和虚存何尝不代表了封装的思想呢?是啊,面向对象的思想本身就是无处不在的。 

   中文版翻译的整体还行吧,但是还是少不了很多僵硬的英语化的句子。另外,发现了19个不知是印刷错误还是翻译错误,却不知道如何向译者反应。