系统学习1——C程序的生命周期

来源:互联网 发布:51vv直播软件 编辑:程序博客网 时间:2024/06/05 09:40

通过跟踪C语言的hello程序来对系统进行学习。

信息就是位+上下文

 hello程序的生命周期是从源程序开始的,即程序员通过编辑器创建并保存的文本文件,文件名是hello.c。

# include <stido.h>

 int main()

{

   printf("hello,world\n");

    return 0;

}

源程序实际上是0,1组成的位(比特)序列,8个位组成一个组(字节),每个字节表示程序中的某些文本字符。

hello.c程序的ASCII码(ASCII标准用来表示文本字符)。实际上就是用唯一的单字节大小的整数值来表示每个字符。


hello.c是以字节序列的方式存储在文件中,对应的某些字符。就比如C语言的开头命令# include <stdio.h> 比如,35代表‘#’,105代表‘i’。同时,每个文本行都是以‘\n’来结束的。

只有像hello.c的由ASCII字符构成的文件成为文本文件。其他的都称为二进制文件。

       这种方法说明了一个基本思想:系统中的所有信息,磁盘文件,内存中程序,内存中存放的数据以及网上传送的数据,都是由一串比特表示。区分不同数据对象的唯一方法是我们读取数据对象的上下文。不同的上下文,同样的字节表示为不同的命令。

每条C语句都必须被其他程序转换成低级机器语言指令,按照一种称为可执行目标程序的格式打包,以二进制磁盘文件的形式保存,目标程序称为可执行目标文件。

Unix系统上,源文件到目标文件的转化是由编译器驱动程序完成。例如命令gcc -o hello hello.c。这个过程分为四个阶段完成,执行这四个阶段的程序(预处理器、编译器、汇编器、链接器)一起构成了编译系统。


预处理阶段:预处理器(cpp)根据#开头的命令,修改原始的C程序,比如# include <stdio.h>,告诉预处理器读取系统头文件stdio.h的内容,并把它插入到程序文本中,形成.i为后缀的文件。

编译器:编译器(ccl)将hello.i翻译为hello.s,它包含了一个汇编语言程序。如图:


用文本格式描述了一条低级机器语言指令。汇编语言是不同程序和不同编译器产生的汇编语言,但是许多编译器产生的汇编语言都相同。

汇编阶段:汇编器(as)将hello.s翻译成机器语言指令,把这些指令打包成可重定位目标程序的格式,并把结果保存在目标文件hello.o中,hello.o是一个二进制文件,包含的17个字节是main的指令编码。

链接阶段:hello调用了printf函数,为每个C编译器都提供了标准C库中的一个函数,比如printf函数就存在于预编译好了的目标文件中,这个文件必须以某种方式合并到hello.o程序中。那么链接器(ld)就是用来搞合并的。结果就得到了hello文件,他是一个可执行的目标文件。可以被加载到内存中,由系统执行。