《程序是怎样跑起来的》第八章

我们把用某种编程语言编写的程序就称为源代码,保存源代码的文件称为源文件。源代码是无法直接运行的,这是因为,CPU能直接解析并运行的不是源代码而是本地代码的程序。对CPU来说,母语就是机器语言,而转换成机器语言的程序就是本地代码。用任何编程语言编写的源代码,最后都要翻译成本地代码,否则CPU就不能理解。

编译器负责转换源代码,能够把C语言等高级编程语言编写的源代码转换成本地代码的程序称为编译器。根据CPU类型的不同,本地代码的类型也不同。因而,编译器不仅和编程语言的种类有关,和CPU的类型也是相关的。

编译器转换源代码后,就会生成本地文件。不过,本地文件是无法直接运行的。为了得到可以运行的EXE文件,编译之后还需要进行“链接”处理。编译后生成的不是EXE文件,而是扩展名为“.obj"的目标文件。 把多个目标文件结合,生成1个EXE文件的处理就是链接,运行连接的程序就称为链接器。库文件指的是把多个目标文件集成保存到一个文件中的形式。链接器指定库文件后,就会从中把需要的目标文件抽取出来,并同其他目标文件结合生成EXE文件。

EXE文件中给变量及函数分配了虚拟的内存地址。在程序运行时,虚拟的内存地址会转换成实际的内存地址。链接器会在EXE文件的开头,追加转换内存地址所需的必要信息。这个信息称为再配置信息。

当程序加载到内存后,除此之外还会生成两个组,那就是栈和堆。栈是用来存储函数内部临时使用的变量(局部变量),以及函数调用时所用的参数的内存区域。堆是用来存储程序运行时的任意数据及对象的内存领域。栈中对数据进行存储和舍弃(清理处理)的代码,是由编译器自动生成的,因此不需要程序员的参与。使用栈的数据的内存空间,每当函数被调用时都会得到申请分配,并在函数处理完毕后自动释放。与此相对,堆的内存空间,则要根据程序员编写的程序,来明确进行申请分配或释放。

 

posted @ 2019-03-31 22:03  封爵古怪  阅读(93)  评论(0编辑  收藏  举报