目录
1.程序的翻译环境和执行环境
2.详解C语言程序的编译和链接
2.1翻译环镜
2.2翻译的几个阶段
2.2.1预编译
2.2.2编译
词法分析
符号汇总
2.2.3汇编
生成符号表
2.3链接
1.合并段表
2.合并符号表和重定位
2.4运行环境
1.程序的翻译环境和执行环境
在ANSI C的任何一种实现环境中,存在两个不同的环境
- 第一种是翻译环境,在这个环境中源代码被转换为可执行的机器指令
- 第二种是执行环境,它用于实际执行代码
2.详解C语言程序的编译和链接
2.1翻译环镜
- 组成一个程序的每个源文件通过编译过程分别抓换成目标代码(object code)
- 每个目标文件文件由链接器(linker)捆绑在一起,形成一个单一而完整的可执行程序
- 链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它可以搜索程序员个人的程序库,将其需要的函数也 链接到程序中
2.2翻译的几个阶段
2.2.1预编译
预编译的过程:
- 注释的替换(删除) 注释被替换成一个空格
- 头文件的包含 #include < >
- #define 符号的替换
所有的预处理指令都是在预编译阶段处理的 (文本操作)
2.2.2编译
词法分析
假如有下面一段代码
array[index] = (index+4)*(2+6)
将源代码程序输入扫描器,扫描器的任务就是简单的进行词法分析,把代码中的字符分割成一系列的记号(关键字、标识符、字面量、特殊字符等)
上面程序进行词法分析后得到了16个记号:
生成一棵语法树
符号汇总
一个工程中可以包含多个.c文件,如何在一个.c文件中调用另一个.c文件中的函数呢
这里我们了解一个概念叫做符号汇总
假设有这样的代码
进行符号汇总
注意:符号汇总只能汇总全局变量
2.2.3汇编
把汇编代码翻译成了二进制的指令,生成了.o文件(目标文件)
生成符号表
假设给汇总的符号给上地址,生成一个符号表
2.3链接
1.合并段表
2.合并符号表和重定位
2.4运行环境
程序执行的过程:
- 程序必须载入内存中。在有操作系统的环境中:一般这个由操作系统完成。在独立的环境中,程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成
- 程序的执行便开始。接着便调用main函数
- 开始执行程序代码。这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程中一直保留他们的值
- 终止程序。正常终止main函数;也有可能是意外终止