在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其实已经是链接输出了,但输出的可执行文件仍然延续这个命名习惯。