目录
介绍
什么是运行环境
运行环境指的的是将源文件转换成程序的过程
为什么要有运行环境
如果没有运行环境编译器就无法识别你写的C语言代码,也无法将源代码转换成可执行程序
如何理解运行环境
运行环境分为:翻译环境和执行环境
- 翻译环境:它用于将源代码转换成可执行的机械指令
- 执行环境:它就是一般说的可执行程序
翻译环境与执环境详解
翻译环境介绍
翻译环境分为两步
- 第一步是编译,通过编辑器将同一工程内不同的源文件都转换成目标文件
- 第二步是链接,通过链接器将不同的目标文件都链接起来形成一个可执行程序,同时连接器还会将标准库函数中所用到的函数和个人程序库中所用到的函数连接到该程序中
编译环境详解
编译环境又可以分为三个阶段:预处理->编译->汇编
预处理(*.i)
- 将#include包含的文件替换到前文件中
- 预处理指令替换和删除
- 将注释替换成空格
编译(*.s)
- 检查语法与符号等错误
- 符号汇总(记录下具有外部连接属性的符号)
- 将c语言代码翻译成汇编代码
总结:在编译阶段会通过语法分析,词法分析,语义分析,去检查代码中的语法与符号等错误还会将具有外部连接属性的符号记录下来(函数,全局变量)最后将c语言代码翻译成汇编代码
注:检查语法错误就是在这个阶段发生的
汇编(生产可重定位的目标文件 *.o)
- 将汇编代码翻译成二进制指令
- 形成符号表(将符号汇总记录下来的符号,形成一个表格,表格记录了符号名和该符号的地址)
链接环境详解
合并段表:
目标文件在链接阶段会被分成几段进行操作,合并段表就是把相关目标文件对应的段链接到一起。
符号表的合并和重定位:
将不同目标文件中的符号表进行合并,最后通过合并的符号表中的符号地址来确定这个符号到底有没有存在
一图胜千言
两个小问题
为什么函数不声明也可以使用?
因为最后链接的时候会进行符号合并,可以通过这个合并后的符号表找到该函数的地址
那为什么全局变量需要声明外部符号?
因为全局变量不声明在编译阶段的语法分析时就会报错
执行环境详解
运行环境执行过程
将程序加载到内存中(在有操作系统的环境中,一般由操作系统来完成,在独立的环境中需要手动完成)-> 程序开始执行,调用main函数 -> 开始执行程序代码(这时在程序运行时会调用栈、堆、静态区等空间来储存执行过程中创建的变量,字符常量等数据)-> 终止程序,释放空间