在ANSI C(C语言的标准)的任何一种实现中,存在两种不同环境:翻译环境+执行环境
(1)编译:包括三个步骤:①预处理(预编译)②编译③汇编
①预处理:包括三个文本操作:1.完成头文件的包含 #include
2.#define定义的符号和宏会被替换
3.删除注释
// 注意:预处理后会生成一个 .i 文件
②编译:把C语言代码转为汇编代码,包括四步1.语法分析、2.词法分析、3.语义分析、4.符号汇总
//注意:编译后会生成一个 .s文件
③汇编:把汇编代码转为机器指令(二进制代码);且会生成符号表(函数名,全局变量,主函数名...)
//注意:汇编后会生成一个 .o(或者.obj)文件(目标文件),linux时.o,window是.obj
//注意:每个目标文件都会有一张符号表,且.o文件是elf格式,可用readelf工具来读取
(2)链接:把多个目标文件和链接库进行链接(例如:test.o 和 add.o 链接生成a.out可执行程序,linux环境下)
a.out可执行程序也是elf格式
包括两步
1.合并段表(相同段表) 2.符号表的合并与重定位(符号表作用就是为了找到某个符号)(符号就是函数名,全局变量等)
即:链接期间能找到任何符号位置
二.执行环境: 即.exe ->执行结果
运行环境:1.程序载入内存,有操作系统环境下用OS完成,独立环境下手工进行完成,也可能通过手工执行代码完成
2.程序执行开始,调用main函数
3.像执行main()函数,其他函数时会创建一个运行时堆栈,用来存储据变量和返回地址。
4.终止程序:可正常也可意外终止。