如何阅读此书
如何阅读此书
从程序员的角度学习计算机系统是如何工作的会非常有趣,主要是因为你可以主动地做这件事情。无论何时你学到一些新的东西,都可以马上试验并且直接看到运行结果。事实上,我们相信学习系统的唯一方法就是做(do)系统,即在真正的系统上解决具体的问题,或是编写和运行程序。
这个主题观念贯穿全书。当引入一个新概念时,将会有一个或多个练习题紧随其后,你应该马上做一做来检验你的理解。这些练习题的解答在每章的末尾。当你阅读时,尝试自己来解答每个问题,然后再查阅答案,看自己的答案是否正确。除第1章外,每章后面都有难度不同的家庭作业。对每个家庭作业题,我们标注了难度级别:
* 只需要几分钟。几乎或完全不需要编程。
** 可能需要将近20分钟。通常包括编写和测试一些代码。(许多都源自我们在考试中出的题目。)
*** 需要很大的努力,也许是1~2个小时。一般包括编写和测试大量的代码。
**** 一个实验作业,需要将近10个小时。
文中每段代码示例都是由经过 GCC 编译的 C 程序直接生成并在 Linux 系统上进行了测试,没有任何人为的改动。当然,你的系统上 GCC 的版本可能不同,或者根本就是另外一种编译器,那么可能生成不一样的机器代码,但是整体行为表现应该是一样的。所有的源程序代码都可以从 csapp.cs.cmu.edu 上的 CS:APP 主页上获取。在本书中,源程序的文件名列在两条水平线的右边,水平线之间是格式化的代码。比如,图1中的程序能在 code/intro/ 目录下的 hello.c 文件中找到。当遇到这些示例程序时,我们鼓励你在自己的系统上试着运行它们。
code/intro/hello.c
#include <stdio.h>
int main()
{
printf("hello, world\n");
return 0;
}图 1 一个典型的代码示例
为了避免本书体积过大、内容过多,我们添加了许多网络旁注(Web aside),包括一些对本书主要内容的补充资料。本书中用 CHAP:TOP 这样的标记形式来引用这些旁注,这里 CHAP 是该章主题的缩写编码,而 TOP 是涉及的话题的缩写编码。例如,网络旁注 DATA:BOOL 包含对第2章中数据表示里面有关布尔代数内容的补充资料;而网络旁注 ARCH:VLOG 包含的是用 Verilog 硬件描述语言进行处理器设计的资料,是对第4章中处理器设计部分的补充。所有的网络旁注都可以从 CS:APP 的主页上获取。
旁注 什么是旁注
在整本书中,你将会遇到很多以这种形式出现的旁注。旁注是附加说明,能使你对当前讨论的主题多一些了解。旁注可以有很多用处。一些是小的历史故事。例如,C 语言、Linux 和 Internet 是从何而来的?有些旁注则是用来澄清学生们经常感到疑惑的问题。例如,高速缓存的行、组和块有什么区别?还有些旁注给出了一些现实世界的例子。例如,一个浮点错误怎么毁掉了法国的一枚火箭,或是给出市面上出售的一个磁盘驱动器的几何和运行参数。最后,还有一些旁注仅仅就是一些有趣的内容,例如,什么是“hoinky”?