1. 翻译环境&运行环境
翻译环境:程序将进行编译(包括预处理、编译、汇编),链接两步操作,将源代码转换为可执行程序(.exe)
执行环境:用来执行代码。
下文将浅浅解析具体过程~
2. 翻译环境
翻译环境中,源代码会经过预处理、编译、汇编、链接四个过程,一点一点地转变为机器可以看懂的二进制指令。
下文将以gcc环境为例,逐步拆解分析。
2.1 预处理
2.1.1 处理前后变化
1.文件类型从.c转换为.i
2.所有#define被删除,展开所有宏定义
3.处理所有条件编译指令 eg.#if 、 #ifdef 、 #elif 、 #else 、 #endif
4.#include所包含的头文件内容将会被插入到该指令所在位置。
5.所有注释会被删除
6.自动添加行号和文件名标识。
7.保留所有#pragma指令
(预处理的详解,以后会写。)
2.2 编译
1.文件类型发生变化,从.i后缀转换为.s后缀。
2.对预处理后的文件进行词法分析、语法分析、语义分析及优化,生成汇编代码文件。
2.2.1 词法分析
进行分词,并标记类型,如关键字、标识符、字面量、特殊符号等。
2.2.2 语法分析
建立语法树。
eg.arr[3]=5+3;
2.2.3 语义分析
该过程声明和类型的匹配,类型的转换等。
语法报错就是在这个阶段进行的。
2.3 汇编
1.文件类型从.s后缀转换为.o后缀。
2.将汇编代码转换为机器可执行代码。
2.4 链接
链接:把⼀堆⽂件链接在⼀起⽣成可执⾏程序。
链接过程主要包括:地址和空间分配,符号决议和重定位等步骤。
重定位:譬如,我在test.c文件中使用了add.c中的Add()函数。在链接之前我是不知道该函数地址是什么的,便暂时搁置不处理。链接时,各个符号都有了地址之后,可把各模块中各符号的地址都修正成正确的值。这个时候test.c文件中的Add()函数地址就可以修正为真正的Add函数地址了。
链接解决的是⼀个项⽬中多⽂件、多模块之间互相调⽤的问题。
文章到这里就结束了,如果喜欢,请三连支持一下博主~