第1章 :懂了hello world,你就懂了这本书

深入理解计算机系统这本书早在6年前我读研的时候就作为上课的教材通读过,那个时候真的觉得这是一本不可多得的好书。是我读到过的第一本、将本科四年所学的几乎所有的、相对离散的、独立的计算机软硬件以及网络等相关课程的知识都能串起来的一本书。正如本书这一版(第三版)序言中提到的,当前计算机教育的一个缺失就是大学计算机课程将计算机的软硬件理论知识全都拆开了再传授给学生,这固然能够降低学习难度,帮助学生分而治之的将各个知识点一一掌握,但却没有一门课程能够真正将这些人为割开的知识再给重新组装起来,这就难免给学生一种盲人摸象的难堪:虽然各个点都比较清楚,但对整个大象却没有一个整体的认识;

另一方面,大部分教材和课程都着重从设计计算机各个部件(比如处理器、操作系统、乃至编译器)的角度来讲解,而实际上绝大多数计算机相关专业的大学生毕业了,并不会从事计算机基础的软硬件设计相关的工作,而是更偏应用层的软件开发工作(所谓的程序猿)。从程序员而不是设计者的角度来看整个计算机系统,在大学里这一块显然也是缺失的。这也许是现在大学教育和生产环境严重脱节的一个原因吧:理论固然重要,但更重要的是将掌握的理论运用到实践环节中去!

而令人惊喜的是,深入理解计算机系统这本书,完美的解决了上面提到的两个问题:如果你看这本书的英文版,你会发现,英文标题才真正表达了这本书的定位:Computer Systems: A Programmer's Perspective,如果直译过来就是:一个程序员眼中的计算机系统 (但如果我们看中文译名,就呵呵了)。另外,有条件的,一定要多看英文原版的书籍,英语就是计算机行业的母语!原滋原味才是王道。从标题中,我们就能知道这本书的特点是:

  • 完整的介绍计算机软硬件系统;
  • 从程序员的视角来认知计算机系统,而不是一个系统设计者;

前者能够让我们将所学的计算机知识全都串起来,后者则能让我们在阅读和学习的过程中,不至于感到理论的空洞,而是可以立即拿起键盘,用代码来说明一切。很多时候,撸起键盘就是干,比什么都重要!

在前言中,作者概述性的介绍了本书的12个章节的内容,全书采取了总、分的编写结构,其中第一章,通过一个C语言编写的 hello world程序是如何通过编译器的处理从文本格式的源码编译为最终的可执行文件,又是通过shell脚本的调用予以执行并显示到显示器上的。这个简单的hello world程序实际上是计算机世界万千程序的抽象和代表,不管是何种软硬件平台(x86/Mips/IA32/ARM... && iOS/Android/macOS/Linux/Unix/...),我们平日里所编写的程序,本质上都和这个最简单的hello world程序没什么区别,如果能够理解透彻了一个hello world程序是如何运行的,能够理解本书全部内容,那你就将如书中作者所说的那样:

如果你全力投身学习本书的概念,完全理解底层计算机系统以及它对应用程序的影响,那么你会步上成为为数不多的“大牛”的道路。

从某种意义上来讲, 这本书的内容,很简单,就是讲了一个hello wrold程序。懂了hello world,你就懂了这本书。

在进入全书各个章节的学习之前,我们还是先来看一下,这12章中,会详细讲解哪些内容吧:

章节序号 章标题 简单介绍
1 计算机系统漫游 通过一个hello world的生命周期的研究计算机系统主要概念和主题
2 信息的表示和处理 重点讲了算术运算,尤其是对程序员有影响的无符号数以及补码表示的特性
3 程序的机器级表示 C编译生成的x86机器代码以及过程的实现栈分配、寄存器、参数传递等
4 处理器体系结构 讲述基本的组合和时序逻辑元素、流水线等
5 优化程序性能 介绍许多提高代码性能的技术
6 存储器层次结构 一致访问时间的线性数组、存储器山:山脊是时间局部性、斜坡是空间局部性
7 链接 讲述静态和动态链接:可重定位的和可执行的目标文件、符号解析、重定位、静态库、共享目标库、位置无关代码、库打桩
8 异常控制流 主要讲解异常控制流从硬件异常和终端一直到上层的C语言破坏栈原则的非本地跳转
9 虚拟内存 本书重点之一,讨论存储分配、软硬件结合等
10 系统级I/O 介绍Unix I/OC的标准I/O库以及与Linux I/O的关系,重点谈到标准I/O的局限性等
11 网络编程 编写一个简单的Web服务器、介绍Internet HTTP等网络知识
12 并发编程 Internet服务器设计为例介绍了并发编程,并从进程、I/O多路复用和线程三个方面予以介绍

学习本书的一个很重要的方面,就是勤思考、多动手,多写代码,完成课后的习题。只有这样,才能踏踏实实掌握每个章节的知识细节。要记住:

读完一本书是一回事儿,读懂则是另外一回事儿!!!