在ANSI C的任何一种实现中,都存在两种环境,翻译环境和执行环境。
一、翻译环境
在翻译环境中源代码被转成了机器指令。
翻译由好几个步骤组成,组成一个程序的每个源文件通过编译过程分别转换成目标代码(object code)。然后目标文件由链接器捆绑在一起,形成一个单一而完整的可执行程序。链接器同时也会引入标准函数库中任何被改程序所用到的函数,包括程序员引入自己定义的头文件中的函数。这个过程发生在预处理阶段(添加头文件,替换指令,替换宏)
①预处理
这是编译过程的第一个阶段,它将一个程序引用的头文件在程序里做一份拷贝,并且替换宏等,在源代码上执行一些文本操作。
②解析
经过了编译阶段之后程序进入了解析阶段,在解析程序阶段,将产生错误报告和警告,并且在我们程序 指明优化处进行优化处理让程序的效率更高。
③生成目标文件
此时可能生成一个或多个目标文件
④链接
我们通过链接器将几个目标文件进行链接
** 在UNIX系统中C的编译器被称为cc,它可以使用许多不同的方式来调用。
1.编译一个C源代码
eg:cc program.c
gcc program.c
这两条指令产生的结果相同,他们会生成一个a.out可执行程序。中间会产生一个名为program.o的目标文件,但它在链接过程完成之后就会被删除。
2. 同时链接几个源文件
eg:cc 1.c 2.c 3.c
3.编译一个C源文件,并使其和现存的可执行文件链接起来
eg:cc main.c lookup.o sort.c
4.编译一个源文件并使其生成一个指定的可执行文件
eg:cc main.c -o test
此时你会发现,生成的可执行文件不再叫a.out而是叫做test
二、执行
①程序载入内存
在具有操作系统的环境里该过程由操作系统来完成。在独立环境中必须手动完成。
②初始化没有被初始化的变量
静态变量会被默认初始化,而其它没有被初始化的变量被初始化成“垃圾”
③小型启动程序
它负责处理一堆日常事务 ,比如收集命令行参数等。
④调用main函数
⑤程序的终止
这是执行的最后一个阶段,他可能由不同的原因引起,正常的终止是程序就是 main函数的返回。
程序可能是由于用户按下break键而终止也有可能是电话连接的挂起而终止,也可能是由于出现错误而出现自行中断。
知识链接:a.out是"assembler output"的缩写格式,代表汇编程序输出。在较早版本的类unix系统中,a.out是一种输出格式,用于可执行文件,目标文件和共享库。早期的 PDP-7系统上没有链接器,程序的创建过程是先把所有源文件连接成一个文件,然后进行汇编,产生的汇编程序保存在a.out中。这样a.out是名副其实的汇编输出,但到PDP-11之后,人们为其编写了链接器,程序的创建是先编译然后链接输出保存到a.out中,这时a.out其实已经是链接输出了,但输出的可执行文件仍然延续这个命名习惯。
原文地址:http://zimomo.blog.51cto.com/10799874/1717634