缘起
在Kernighan和Ritchie的关于C编程语言的经典教程中,他们通过下面所示的hello程序来向读者介绍C。
尽管hello程序非常简单,但是为了让它实现运行,系统的每个主要组成部分都需要协调工作。
#include <stdio.h>
int main()
{
printf("hello, world\n");
return 0;
}
通过跟踪hello程序的生命周期——从它被程序员创建开始,到系统上运行,输出简单的消息,然后终止。沿着这个生命周期,简要的介绍编译过程,了解这个过程中干了什么。
程序被其他程序翻译成了不同的格式
hello程序的生命周期是从一个高级C语言程序开始的,因为这种形式能够被人读懂。然而为了在系统上运行hello.c程序,每条C语句都被其他程序转化为一系列低级机器语言指令。然后这些指令按照一种称为可执行目标程序的格式打好包,并以二进制磁盘文件的形式存放起来。目标程序也称为可执行目标文件。
在Unix系统上,从源文件到目标文件的转化是由编译器驱动程序完成的:
linux> gcc -o hello hello.c
在这里,GCC编译器驱动程序读取源程序文件hello.c,并把它翻译成一个可执行目标文件hello。这个翻译过程可分为四个阶段完成,如下图所示。执行这四个阶段的程序(预处理器、编译器、汇编器和链接器)一起构成了编译系统。
/