第一章 计算机系统漫游
主要是全书概览。
示例程序hello.c
#include <stdio.h>
int main()
{
printf("hello,world");
return 0;
}
1.1 信息就是位+上下文
hello程序的生命周期是从一个源文件(or源程序)开始的。
源程序事实上是由0和1组成的比特序列,其中1 Byte=8 bits。每个字节表示程序中某个文本字符。
大部分现代系统都使用ASCII标准来表示字符,也就是用一个唯一的单字节大小的整数值来表示每个字符。
上图为hello.c的ASCII文本表示。
hello.c说明了一个基本思想:系统中所有的信息——包括磁盘文件、内存中的程序、内存中存放的用户数据以及网络上传送的数据,都是由一串比特表示的。区别不同数据的唯一方法是我们读到这些数据对象时的上下文。
1.2 程序被其他程序翻译成不同的格式
Unix中从源文件到目标文件的转化由编译器驱动程序完成。
linux> gcc -o hello hello.c
上述解释为:GCC编译器获取hello.c,并翻译成一个可执行文件,命名为hello。
编译系统(compilation system):预处理器(cpp)、编译器(ccl)、汇编器(as)、连接器(ld)
上述为编译系统过程,分为四个阶段:
- 预处理阶段:预处理器(cpp)根据以字符#开头的命令,修改原始的C程序。
- 编译阶段:编译器(cll)将文本文件example.i修改为文本文件example.s,它包含一个汇编语言程序,该程序包含函数main的定义。汇编为高级语言的不同编译器提供了通用的输出语言。
- 汇编阶段:汇编器(as)将example.s翻译成机器语言指令,把这些指令打包成一种叫做可重定位目标程序(relocatable object program)的格式,并将结果保存在目标文件example.o中。其中,example.o是一个二进制文件,如果用文本编辑器打开将会看到一堆乱码。
- 链接阶段:链接器(ld)将一个或多个目标文件外加库链(e.g. printf.o)合并,生成一个可执行目标文件。可执行文件能被加载到内存中由系统执行。