一、课前热身
1. CPU 可以解析和运行的程序形式称为什么代码?
答:机器代码
2. 将多个目标文件结合生成 EXE 文件的工具称为什么?
答:链接器
3. 扩展名为 .obj 的目标文件的内容,是源代码还是本地代码?
答:本地机代码
4. 把多个目标文件收录在一起的文件称为什么?
答:库文件
5. 仅包含 Windows 的 DLL 文件中存储的函数信息的文件称为什么?
答:导入库
6. 在程序运行时,用来动态申请分配的数据和对象的内存区域
答:堆
形式称为什么?
二、计算机只能运行本地代码
- 用某种编程语言编写的程序就称为源代码 ,保存源代码的文件称为源文件。
- 源代码是无法直接运行的。这是因为,CPU 能直接解析并运行的不是源代码而是本地代码的程序。作为计算机大脑的Pentium 等 CPU,也只能解释已经转换成本地代码的程序内容。用任何编程语言编写的源代码,最后都要翻译成本地代码,否则 CPU 就不能理解。
三、本地代码的内容
- Windows 中 EXE 文件的程序内容,使用的就是本地代码。接下来就让我们来看一下本地代码的内容吧。
四、编译器负责转换源代码
- 能够把 C 语言等高级编程语言编写的源代码转换成本地代码的程序称为编译器。每个编写源代码的编程语言都需要其专用的编译器。
- 根据 CPU 类型的不同,本地代码的类型也不同。因而,编译器不仅和编程语言的种类有关,和 CPU 的类型也是相关的。
- 交叉编译器,它生成的是和运行环境中的 CPU 不同的 CPU 所使用的本地代码。例如,在 Pentium 系列 CPU 的 Windows 这一运行环境下,也可以作成 SHA及 MIPS 等 CPU 用的 Windows CEB程序,而这就是通过使用交叉编译器来实现的。
五、仅靠编译是无法得到可执行文件的
- 编译器转换源代码后,就会生成本地文件。不过,本地文件是无法直接运行的。为了得到可以运行的 EXE 文件,编译之后还需要进行“链接”处理。
六、程序加载时会生成栈和堆
- 当程序加载到内存后,除此之外还会额外生成两个组,那就是栈和堆。栈是用来存储函数内部临时使用的变量(局部变量 ),以及函数调用时所用的参数的内存区域。 堆是用来存储程序运行时的任意数据及对象的内存领域。
- EXE 文件中并不存在栈及堆的组。栈和堆需要的内存空间是在EXE 文件加载到内存后开始运行时得到分配的。因而,内存中的程序,就是由用于变量的内存空间、用于函数的内存空间、用于栈的内存空间、用于堆的内存空间这 4 部分构成的。