读《程序是怎么跑起来的》第8章

CPU可以解析和运行的程序形式是机器语言;将多个目标文件结合生成EXE文件的工具是链接器;扩展名为.obj的目标文件的内容是本地代码;把多个目标文件收录在一起的文件是库文件;仅包含WindowsDLL文件中存储的函数信息的文件称为导入库;在程序运行时,用来动态申请分配的数据和对象的内存区域形式是堆。链接器会从库文件中抽取必要的目标文件并将其结合到EXE文件中。此外,还存在一种程序运行时结合的DLL形式的库文件。把导入库信息结合到EXE文件中,这样程序在运行时就可以利用DLL内的函数了。堆的内存空间会根据程序的命令进行申请及释放。本地这个术语有“母语的”意思。对CPU来说,母语就是机器语言,而转换成机器语言的程序就是本地代码。用任何编程语言编写的源代码,最后都要翻译成本地代码,否则CPU就不能理解。也就是说,即使是用不同编程语言编写的代码,转换成本地代码后,也都变成用同一种语言来表示了。WindowsEXE文件的程序内容,使用的就是本地代码。

编译器首先读入代码的内容,然后再把源代码转换成本地代码。编译器中就好像有一个源代码同本地代码的对应表。但实际上,仅仅靠对应表是无法生成本地代码的。读入的源代码要经过语法解析、句法解析、语义解析等,才能生成本地代码。编译器本身也是程序的一种,所以也需要运行环境。例如,有Windows用的C编译器,Linux用的C编译器等。此外,还有一种交叉编译器,它生成的是和运行环境中CPU不同的CPU所使用的本地代码。例如,在Pentium系列CPUWindows这一运行环境下,也可以SHMIPSCPU用的Windows CE程序,而这就是通过使用交叉编译器来实现的。

编译器转换源代码后,就会生成本地文件。不过,本地文件是无法直接运行的。为了得到可以运行的EXE文件,编译之后还需要进行“链接”处理。把多个目标文件结合,生成1EXE文件的处理就是链接,运行连接的程序就称为链接器。链接器会从指定的库文件,把需要的目标文件抽取出来,并同共创目标文件结合生成EXE文件。EXE文件中给变量及函数分配了虚拟的内存地址。在程序运行时,虚拟的内存地址会转换成实际的内存地址。链接器会在EXE文件的开头,追加转换内存地址所需的必要信息。这个信息称为再配置信息。程序加载到内存后,有变量组和函数组,同时还会额外生成两个组,那就是栈和堆。栈是用来存储函数内部临时使用的变量(局部变量),以及函数调用时所用的参数的内存区域。堆是用来存储程序运行时的任意数据及对象的内存领域。

猜你喜欢

转载自www.cnblogs.com/gltks/p/10611861.html
今日推荐