目录
预编译(预处理) (此处只是粗略进行了解,在下篇文章中将会专门详讲预编译)
在ANSI C的任何实现中,存在两个不同的环境——翻译环境和运行(执行)环境
1.翻译环境:在这个环境中源代码被转换为可执行的机器指令(二进制指令)
2.运行环境:通过翻译环境后形成.exe的可执行程序,运行环境用于执行代码
如果没理解也没关系,下面我们详细讲讲翻译环境和运行环境
翻译环境
我们平时在vs或者Dev-c++等编译器中编写代码时,其实都是创建了一个后缀为.c的文档在文档中进行编写代码的。
然而机器只能识别二进制语言,因此无法直接识别并运行我们所写的代码——此时就需要经过我们的翻译环境进行翻译后再通过运行环境执行代码。
而翻译环境可以分为编译和链接两大部分,其中编译又可分为预编译(预处理)、编译和汇编三部分。示意图如下:
然而一个c语言项目中可能由多个.c文件一起构建,那么多个.c文件如何生成运行可执行程序呢——
- 多个.c⽂件单独经过编译器,编译处理⽣成对应的⽬标⽂件。
- 多个⽬标⽂件和链接库⼀起经过链接器处理⽣成最终的可执⾏程序。
- 链接库是指运⾏时库(它是⽀持程序运⾏的基本函数集合)或者第三⽅库。
编译:
预编译(预处理) (此处只是粗略进行了解,在下篇文章中将会专门详讲预编译)
预编译的作用简单来讲的话就是把头文件中的内容包含过来(我们所编写的代码中)
预处理阶段主要处理那些源文件中#开始的预编译指令。
示例如下:
编译
编译就是将预处理后的文件进行:词法分析、语法分析和语义分析,然后生成相应的汇编代码文件。
假设我们写了一行代码:
array[index] = (index + 4) * (2 + 6);
此时要将其进行编译。
- 词法分析
将源代码程序输入扫描器,扫描器的任务就是进行词法分析。
简单来讲就是将代码中的字符分割为一系列记号。上述代码就被分割为了16个记号,如图:
- 语法分析
将扫出来的记号进行语法分析形成语法树(以表达式为结点).
图示如下:
- 语义分析
这个简单来讲就是判断类型了。
由语义分析器来进行语义分析,即对表达式的语法层面分析。
图示如下:
如果发现类型不一致,编译器就会报错。
汇编
将汇编代码翻译成二进制的指令(机器指令)。
汇编器将汇编代码转变成机器可执⾏的指令,每⼀个汇编语句⼏乎都对应⼀条机器指令。就是根
据汇编指令和机器指令的对照表⼀⼀的进⾏翻译,也不做指令优化。
链接:
简单来讲就是将符号表合并
但其实链接是⼀个复杂的过程,链接的时候需要把⼀堆⽂件链接在⼀起才⽣成可执⾏程序。
链接过程主要包括:地址和空间分配,符号决议和重定位等步骤。
链接解决的是⼀个项⽬中多⽂件、多模块之间互相调⽤的问题。
运行环境
四步:
- 程序必须载⼊内存中。在有操作系统的环境中:⼀般这个由操作系统完成;在独⽴的环境中,程序的载⼊必须⼿⼯安排,也可能是通过可执⾏代码置⼊只读内存来完成。
- 程序的执⾏便开始。接着便调⽤main函数。
- 开始执⾏程序代码时,程序将使⽤⼀个运⾏时堆栈(stack)存储函数的局部变量和返回地址。程序同时也可以使⽤静态(static)内存,存储于静态内存中的变量在程序的整个执⾏过程⼀直保留他们的值。
- 终⽌程序时,可能正常终⽌main函数,也有可能是意外终⽌。
创作不易,如果觉得作者写的还过得去的话给个免费的三连吧亲❀❀