看完了《深入理解计算机系统》的第一章,就了解了整个计算机系统运行代码的整套流程,有茅塞顿开的通透之感。 这篇博客来梳理第一章的主要内容,做复习巩固之用。
首先我们来看看运行一个 c 语言代码的文件的整体流程,入下图:

由上图,我们可以大致能知道,该整个翻译过程由一下几部完成:
- 预处理阶段:预处理器(cpp)根据 c 语言的格式,以及内容,引入需要使用到的内容(比如 include 中的内容)等来修改原内容,得到另一个 c 程序,通常以 .i 作为扩展名。
- 编译阶段:编译器(ccl)将文本文件 hello.i 翻译成文本文件 hello.s, 它包含一个汇编语言程序。此时高级 语言被转换为低一级语言。
- 编译阶段:汇编器(as)将 hello.s 进一步转换为机器可识别的机器语言指令,并把这些指令打包成一种叫做
可重定位目标程序的格式,并将结果保存在目标文件 hello.o 中。 - 链接阶段: 这里 hello 源程序调用了 printf 函数,他是每个 C 编译器都提供的标准 C 库中的一个函数。printf 函数存在于一个名为 printf.o
的单独的预编译好了的目标文件中,而这个文件必须以某种方式合并到我们的 hello.o 程序中。链接器(ld)就负责处理这种合并。结果得到 hello 文件,
它是一个
可执行目标文件,可以被加载到内存中,由系统执行。
以上部分可见内存重要的原因,所有的文件最终都是要走到内存中,而被系统执行的。
上面是大致的编码流程,那么这个过程中,到底是怎么在硬件中执行的呢?