在阅读《程序时怎样跑起来的》第八章后,我认识到了源文件变为可执行文件的过程,包括必备的因素和运行的条件。源文件指的是程序员利用高级语言写的代码文件,而在第七章中提到,CPU能识别的是本地代码也叫机器语言,而源文件到本地代码的过程就叫做“编译”,通常利用对应语言的编译器进行编译。但是在编译过后依然不能直接执行,因为在编写代码时,会出现部分代码是直接引用“库中的”函数,而非程序员自己写的,因此在编译源代码时这些库中的函数并不会被计算机读懂,因为计算机无法通过函数表面去看函数所对应的源代码,因此在部分情况下是需要将库中函数(也叫做标准函数)的源代码“一同告知计算机,这就是链接,是通过链接器来进行的。
而且,即使我们不指定引用函数的目标文件,计算机也会自动识别的,因为引用标准函数的文件的后缀是.lib。通过这一点,计算机就会自动找到对应目标文件了。但是在部分情况下,有些函数也并非标准函数,就如书中所说的MessageBox()这个函数是Windows系统的弹窗程序,储存在DLL文件中,而DLL文件并不在库文件,因此,如果遇到使用API程序的源代码,也需要将对应函数的目标文件进行链接,这种文件叫导入库(但实际并不在库中,而是在DLL文件中),因此这种文件相对于库文件来说并非实体,只是当你输入目标文件名时,他不会在库中找到目标文件,而是在DLL文件中找,因此能够直接在库中找到文件的形式叫做静态链接库。
并且再运行程序时是调用程序数据在内存中的地址,由于EXE可执行文件作为本地代码,没有被分配地址,因此会分配虚拟地址,调用时将虚拟地址转变为实际地址,添加再分配信息,如此EXE文件就有了相对地址(以函数起始位置为基点进行偏移),同时在可执行文件运行时,会开辟新的内存空间,分别为栈和堆。他们二者的功能不一,栈空间存储临时变量,当超过所在作用域时会自动清除。而堆空间中存储的是运行中的任意数据和对象,这一则需要程序员手动清理,否则会出现内存泄露,久而久之导致内存不足。