ANSI C规定在C语言程序中有两种环境:翻译环境和运行环境
1.翻译环境
翻译环境就是把文本文件转化成二进制之令的过程,分为:预编译,编译,链接。
(1)多个.c文件单独经过编译器处理,形成目标文件。0
(2)在Windows操作系统中目标文件的后缀为.obj,在Linux操作系统中目标文件的后缀为.o。
(3)多个目标文件和链接库经过链接器链接后得到可执行程序
(4)链接库指的是系统运行是的基本函数集合(加减符号什么的)和第三方库(比如头文件之类的)
1.1预编译(预处理)
在预处理阶段,源文件经过预处理后形成.i后缀的文件
在gcc下想观察到.i文件的操作如下
gcc - E test.c -o -test.i
预编译阶段,顾名思义就是为后面的编译作准备,它主要处理#开始的预编译指令。
(1)删除所有的#define,并展开所得有宏定义。
(2)处理所有条件编译指令,如:#if #ifdef #elif #else #endif
(3)处理所有的#include,将其产开插到相应的预编译指令处,这个过程是递归进行的,也就是说,包含的头文件中可能有其他的头文件
(4)删除所有的注释
(5)添加⾏号和⽂件名标识,⽅便后续编译器⽣成调试信息等。
(6)保留所有的#pragma预处理指令,后续编译器会用到。
.i文件中宏定义已经被展开,头文件也已经被替换,因此在不确定是否包含头文件时,可以查看.i文件。
1.2编译
这个过程包括:词法分析,语法分许,语义分析,优化。
汇编指令如下:
gcc -S test.i -o test.s
1.2.1词法分析:
array [index] = (index+ 4 )*( 2 + 6 );

这个过程是把一些可能会组合在一起的符号组合在一起。
1.2.2语法分析:
接下来语法分析器,将对扫描产生的记号进行语法分析,从而产生语法树。这些语法树是以表达式为节点的树。

1.2.3语义分析:
1.3汇编
汇编器是将汇编代码转变成机器可执⾏的指令(2进制的指令),每⼀个汇编语句几乎都对应⼀条机器指令。就是根据汇编指令和机器指令的对照表⼀ 的进⾏翻译,也不做指令优化。汇编的命如下:
gcc -c test.s -o test.o
1.3链接(link)

2.运行环境
1.程序的运行必须载入内存。再有操作系统的设备中,这些操作一般是有操作系统完成的。一些独立设备上这个载入过程需要手工完成,也可通过可执行代码置入只读内存完成。