环境

在ANSI C的任何一种实现里,存在翻译环境(Translation Environment)执行环境(Execution Environment)。这两种环境无需位于同一机器上,如交叉编译器(Cross Compiler)即是在某一平台上运行,但其生成的可执行代码运行于不同的对应平台上(举一个通俗的栗子——在Windows平台编写并编译Android应用)。

ANSI C同时讨论了独立环境(Freestanding Environment),即不存在操作系统的环境,多用于嵌入式系统。

翻译

翻译阶段由以下几个步骤组成:

  • 组成程序的一个或多个源文件通过编译过程分别转换为目标代码(Object Code)

编译过程又分为以下几个阶段:

  • 首先是预处理器(Preprocessor)进行处理,在这个阶段预处理器在源代码上执行一些文本操作,例如由实际值代替#define定义的宏,以及读入由#include引入的文件内容;

  • 然后源代码经过解析(Parse)(详见《编译原理》),判断语句意思。

  • 随后产生目标代码,如果在编译设置中要求进行优化,则编译器就会对目标代码进行进一步处理,提高效率。

  • 各个目标代码经过链接器(Linker)捆绑在一起,生成一个单一而完整的可执行文件;

执行

程序的执行过程也需要经历几个阶段:

  • 首先程序先载入到内存中,同时初始化那些不是安排在堆栈中的尚未初始化的变量。宿主环境(操作系统)完成这项工作;在独立环境中,程序的载入必须手工安排。
  • 然后程序执行开始。在宿主环境中,通常一个小型的启动程序与程序链接在一起,接着调用main函数,控制权交给我们要运行的程序。
  • 接下来执行程序代码。绝大多数机器里,程序将使用一个运行时堆栈(Stack),用于储存函数的局部变量和返回地址;程序也可以使用静态(Static)内存。
  • 最后一步是程序的终止。正常的终止是main函数返回。在宿主环境中,启动程序重新获得控制权。除此之外,程序也可能由于用户自己中断或者在执行过程中遇到错误而中断。

到这里,一个C程序从源文件到执行完毕就全部结束啦!

Reference:

  • Pointer on C