—、翻译环境和运行环境
1.翻译环境
1.1.预处理(预编译)
1.2.编译
1.3.汇编
1.4.链接
2.运行环境
正片开始
先让我们看看什么是翻译环境和运行环境
下图为整个翻译环境的细致过程
1.翻译环境
- 你们应该很好奇翻译环境在干什么吧?从(图片一)可以看出它先将我们写的源代码(指的是我们所写的代码)进行编译和链接转换成机器语言(2进制)让机器能够读懂,最终生成可执行程序->某某某.exe。
⼀个C语⾔的项⽬中可能有多个 .c ⽂件⼀起构建,那多个 .c ⽂件如何⽣成可执⾏程序呢? - 多个.c⽂件单独经过编译处理⽣产对应的⽬标⽂件。
- 注:在Windows环境下的⽬标⽂件的后缀是 .obj ,Linux环境下⽬标⽂件的后缀是 .o
- 多个⽬标⽂件和链接库⼀起经过链接器处理⽣成最终的可执⾏程序。
- 链接库是指运⾏时库(它是⽀持程序运⾏的基本函数集合)或者第三⽅库
- 其实翻译环境是由编译和链接两个大的过程组成的,而编译又可以分解成:预处理(有些书也叫预编
译)、编译、汇编三个过程,让我们接着向下深入了解一下这三个小过程吧~
1.1.预处理(预编译)
在预处理阶段有以下几点
- 头文件包含,会将头文件里的所有内容拿过来
- 用#define定义的变量也会被替换 如
#define MAX 100
会将所有使用MAX的替换成100 - 以及我们所涉及的条件编译如:#if, #elif, #else, #ifdef, #ifndef, #endif
- 注释的删除
- 多文件使用时包含这条语句**#pragma once**能有效防止同一份头文件重复包含
注意:经过预处理之后会生成(某某某.i文件)此文件为中间文件
1.2.编译
编译要进行三个过程:词法分析,语法分析,语义分析生成相应的汇编代码文件
这三个过程比较复杂,我们就粗浅的理解理解,在编译的这个过程会检查语法是否有错误,同时将(.i)文件处理为汇编文件(.s)的过程
1.3.汇编
汇编就相对简单了,在编译完之后生成的(.s)文件就是汇编文件,它要经过汇编这个过程生成目标文件(.o)文件,此时目标文件的内容全部转换成了二进制形式,这就是汇编所干的事
1.4.链接
链接是翻译环境的最后一步了,此过程非常重要,它要将所有的目标文件(.o)链接成一块完整的exe程序。
2.运行环境 - 程序必须载⼊内存中。在有操作系统的环境中:⼀般这个由操作系统完成。在独⽴的环境中,程序
的载⼊必须由⼿⼯安排,也可能是通过可执⾏代码置⼊只读内存来完成。 - 程序的执⾏便开始。接着便调⽤main函数。
- 开始执⾏程序代码。这个时候程序将使⽤⼀个运⾏时堆栈(stack),存储函数的局部变量和返回
地址。程序同时也可以使⽤静态(static)内存,存储于静态内存中的变量在程序的整个执⾏过程
⼀直保留他们的值。 - 终⽌程序。正常终⽌main函数;也有可能是意外终⽌
最后提醒一下在编译的三个小过程中:预处理后生成的(.i)文件,编译生成的(.s)文件,以及汇编后生成的(.o)文件都是在gcc下完成的,在其他开发环境下可能后缀会有所差异。
完