在ANSIC的任何一种实现中,存在两个不同的环境。
? ? ? ? 第一种是:翻译环境,在这个环境中源代码被转换为可执行的机器指令(二进制指令)
? ? ? ? 第二种:是执行环境,它用于实际执行代码。
那翻译环境是怎样将源代码转换成为可执行的机器指令的呢?其实翻译环境是由编00译和链接两个大过程组成的,而编译又可以分解为:预处理(预编译)、编译、汇编三个过程。
一个C语言的项目中可能有多个.c文件一起构建,那多个.c文件如何生成可执行程序呢?
在预处理阶段,源文件和头文件会被处理成为.i为后缀的文件。
在gcc环境下观察text.c文件预处理后的.i文件的命令:
????????gcc -E text.c -o text.i
预处理阶段主要处理那些源文件中#开始的预编译指令。例如:#include\#define,处理规则:
?经过预处理后的 . i 文件中不再包含宏定义, 因为宏已经被展开。并且包含的头文件都被插入到. i 文件中。所以当我们无法知道宏定义或者头文件是否包含正确的时候, 可以查看预处理后的 . i 文件来确认。
???????编译过程就是将预处理后的文件进行一系列的: 词法分析、语法分析、语义分析及优化, 生成相应的汇编代码文件编译过程的命令如下:
编译过程的指令如下:
????????gcc -S text.i -o text.s
词法分析:
将源代码程序被输入扫描器, 扫描器的任务就是简单的进行词法分析,把代码中的字符分割成一系列的记号(关键字、标识符、字面量、特殊字符等)
语义分析:
由语义分析器来完成语义分析, 即对表达式的语法层面分析。 编译器所能做的分析是语义的静态分析。静态语义分析通常包括声明和类型的匹配,类型的转换等。这个阶段会报告错误的语法信息。
汇编命令如下:
????????gcc -c text.s -o text.o
链接是一个复杂的过程, 链接的时候需要把一堆文件链接在一起才生成可执行程序。
链接过程主要包括:地址和空间分配, 符号决议和重定位等这些步骤。
链接解决的是一个项目中多文件、 多模块之间互相调用的问题。