目录
在ANSI(美国国家标准学会) C的任何一种实现中,存在两个不同的环境
- 翻译环境,将源代码转换为可执行的机器指令;
- 执行环境,用于实际执行代码;
一,翻译环境
- 每个源文件,通过编译分别转换成目标文件;
- 每个目标文件,由链接器捆绑在一起,形成一个单一而完整的可执行程序;
- 链接器同时也会引入标准C函数库中被该程序用到的库函数,且可搜索程序员个人的程序库,将其需要的函数也链接到程序中;
编译器
- 编译 = 预编译(预处理) + 编译 + 汇编;
- cl.exe,是Microsoft C/C++编译器;
预编译/预处理(文本操作)
- #include,完成了头文件的包含;
- #define,定义的符号和宏的替换;
- 条件编译;
- 删除注释;
编译
- 把C语言代码,转换为汇编代码;
- 语法分析;
- 词法分析;
- 语义分析;
- 符号汇总;
汇编
- 把汇编代码转换为机器指令(二进制指令);
- 汇编后生成.obj文件(elf格式);
- 生成符号表;
链接器
- 链接,把多个目标文件和链接库链接生成可执行程序(elf格式);
- link.exe,链接器;
- 合并段表;
- 符号表的合并,及重定位;
二,执行环境
程序执行过程
- 程序必须载入内存中;
- 操作系统环境中,一般由操作系统完成;
- 独立环境中,必须手动安排,也可能通过执行代码置入只读内存来完成;
- 开始执行程序,接着调用main函数;
- 开始执行程序代码;
- 此时程序使用一个运行时栈,存储函数的局部变量和返回地址;
- 程序同时也可使用静态内存,存储静态内存中的变量在程序的整个执行过程中一直保留它们的值;
- 终止程序,正常终止main函数,或意外终止;
三,参考书籍
《编译原理》
《程序员的自我修养》
《高质量C/C++编程指南》
《C语言深度剖析》