前言
当我们写完代码后,将代码运行起来需要翻译环境和运行环境,
翻译环境又分为编译和链接,编译又分为预处理,编译,汇编,
一个C语言的项目可能有多个.c文件构成,多个.c文件分别进行编译生成目标文件,最后通过链接器链接在一起,生成可执行程序
翻译环境
预处理
在预处理阶段,源文件和头文件会被处理为.i结尾的文件
预处理阶段主要处理源文件中的预编译指令,以#开头的指令就是预编译指令,在预处理阶段都会处理掉,展开头文件,将注释用空格替换,
编译
编译的过程就是将预处理后的文件进行进一步的词法分析,语法分析,语义分析及符号汇总,生成相应的汇编代码文件,也就是将C语言的代码转化成汇编代码,生成.s为后缀的文件
汇编
汇编就是把汇编代码转化成可执行的二进制文件,汇编器是将汇编代码转变成机器可执行的指令,每一个汇编语句几乎都对应一个机器指令,形成符号表,生成.o为后缀的文件
链接
链接过程主要包括:地址和空间分配,符号决议和重定位等步骤,链接是一个比较复杂的过程,大致来说就是把多个.o文件链接起来,也可以链接第三方库中的文件,生成可执行文件,
链接过程包括合并段表,符号表的合并和重定位
运行环境
1.程序必须载入到内存中,在有操作系统的环境中,这个一般由操作系统完成。在独立的环境中,程序的载入必须由手动安排,
2.程序的执行便开始,接着调用main函数,
3. 开始执⾏程序代码。这个时候程序将使⽤⼀个运⾏时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使⽤静态(static)内存,存储于静态内存中的变量在程序的整个执⾏过程⼀直保留他们的值。
4. 终⽌程序。正常终⽌main函数;也有可能是意外终⽌。