正如题目展示,第一章的主题是“计算机系统展示”(A Tour of Computer Systems)。第一章站在宏观却不失条理角度来讲解程序是怎么跑起来的。实例程序1.1如下所示:
#include<stdio.h>
int main()
{
printf("hello world");
return 0;
}
该程序在执行后输出的是“hello world”。可是计算机是怎么理解程序的呢?或者计算机是如何理解上述的程序语言呢?
这是一个十分有趣的过程,不过在这里展开。篇幅为庞大。今天先讲解的为一个C程序的编译过程(The compilation system)。下为流程图:
接下来逐步分析该流程图:
- hello.c输入是程序文件输入,也就是实例程序1.1.
- Pre-processor(cpp):预处理器。顾名思义:也就是对程序进行预处理。C程序中特指“”#“”包含的库文件。预处理器将库文件直接导入到源代码中,此例就是将头文件“stdio.h”导入到源程序中,生成hello.i源代码。
- Complier:将hello.i 翻译为汇编语言。生成hello.s
- Assembly phase:将汇编语言转化为机器指令(The Assembler translates hello.s into machine-language instructions)。生成二进制文件——hello.o。
- Linker:链接器:实例程序1.1使用了标准C语言库中的printf 函数。而printf的源码编译文件为printf.o,此时此时并不在hello.o中。而链接器的作用就是将printf.o导入到hello.o中。进而生成一个可执行的二进制文件!