即使不做计算机的底层工作,对于计算机的了解也同样重要。因此,我决定重读 CSAPP 一书,并简要作此笔记。

CSAPP 的第一章名称为 Tour of Computer Systems, 实际上是关于计算机系统的一个概论。

# 前言

这本书的前言也有些意思。其中提到的几点值得注意:

  1. 本书是对适用于全体计算机系统的一些长久概念 (enduring concepts) 的解释,是从程序员视角出发的。
  2. 本书不倾向于对系统的某一部分(例如体系结构、操作系统、编译器或计算机网络等)研究,而是覆盖一个程序员所需的各方面知识。
  3. 本书主要着眼于 Linux 上的 C/C++ 程序,需要读者对 C/C++ , Java 有基本的了解。

# 从 Hello World 开始

一个基本的 C 程序如下图所示,这是一个采用 ASCII 编码的文本文件 (text file), 又称流式文件。非流式文件称为二进制文件 (binary file).

hello.c
#include <stdio.h>
int main() {
    printf("Hello World!\n");
    return 0;
}

上述 hello.c 文件的编译过程如下图所示:

其主要分为四个阶段:

  1. 预处理阶段 (preprocessing phase): 处理以 # 为开头的指令,生成一个后缀为 .iC 语言程序。
  2. 编译阶段 (compilation phase): 借助编译器将 .i 文件翻译为汇编语言程序 (assembly-language program). 其中的 main 如下所示:
    main:
        subq $8, %rsp
        movl $.LC0, %edi
        call puts
        movl $0, %eax
        addq $8, %rsp
        ret
    
    不同的语言在编译阶段会转化为相同的汇编语言。
  3. 汇编阶段 (assembly phase): 将汇编语言转化为以 .o 为后缀的机器语言程序。这个程序是二进制文件,因此采用文本编辑器打开会乱码。
  4. 链接阶段 (linking phase): 将位于标准库中的函数 ( printf ) 以另外的 .o 文件形式 ( printf.o ) 链接到先前生成的机器语言程序 ( hello.o ) 上,形成完整的可执行文件 (executable file).