读书笔记:8.1:对源文件进行编译可得到目标文件。例如,对源文件sample.c进行编译可得到目标文件sample.obj。目标文件的内容就是本机代码。
链接器会从库文件中提取必要的目标文件并将它们拼接成一个EXE文件。在程序运行时进行动态链接的DLL文件也属于库文件。
将导入库中的信息链接到EXE文件,由此程序就可以在运行时调用DLL中的函数了。
堆是一种可以根据程序自身的请求来分配和释放的内存空间。
本机代码的英文是native code.其中native包含母语的意思。对CPU来说,用它的母语机器语言来编写的程序就是本机代码。用其他编程语言编写的源代码,必须翻译成本机代码才能够被CPU理解和执行。
8.2:转储(dump)是指将文件内容按1字节2位十六进制数的形式显示出来。
8.3:负责将用C语言等高级语言编写的源代码翻译成本机代码的程序称为编译器。用不同的编程语言编写的源代码需要使用该语言专用的编译器来进行编译。用于将C语言源代码翻译成本机代码的编译器称为C编译器。
编译器会读取源代码的内容并将其翻译成本机代码。编译器需要对读取的源代码进行词法分析、语法分析、语义分析等处理,这样才能够生成本机代码。
CPU的类型不同,其对应的本机代码也不同。因此,不仅不同的编程语言所使用的编译器不同,不同类型的CPU所使用的编译器也不同。
编译器本身也是一种程序,因此也有其对应的运行环境。
8.4:BCC32编译器是一个名为bcc32c.exe的命令行工具田。在Windows命令提示符中运行以下命令,C语言源文件sample.c就会被编译。将多个目标文件拼接在一起生成一个EXE文件的过程称为链接,用于完成这一操作的程序称为链接器(又称 链 接 编 辑 器 或 链 接 程 序)BCC32的链接器是名为ilink32.exe的命令行工具。在Windows命令提示符中执行以下命令,就可以将所有必要的目标文件链接起来,生成名为sample.exe的EXE文件。
8.5:链接时的选项“-Tpe-c-x-aa代表要生成用于Windows的EXE文件。可以看到指定了c0w32.obj和sample.obj这两个目标文件。其中,sample.obj是sample.c编译后生成的目标文件,c0w32.obj包含了一些通用代码,需要链接在所有程序的开头,这些代码被称为启动代码(startup code)。import32.lib和cw32.lib这样的文件称为库文件。库文件是由多个目标文件打包而成的。
8.6:Windows操作系统中包含可供应用程序使用的各种功能,这些功能都是以函数的形式来提供的,这样的函数称为Windows API(ApplicationProgrammingInterface,应用程序接口)。Windows API的目标文件通常不是以库文件的形式存在的,而是以一种称为DLL(动态链接库)的特殊库文件的形式存在的。包含目标文件本身可以直接链接到EXE文件的库文件称为静态链接库(static link library)其中“静态”与“动态”是一对反义词sprintf()的目标文件所在的cw32.lib就属于静态链接库。sprintf()函数提供了将数值按指定格式转换成字符串的功能。
8.7:链接器会在EXE文件的开头记录需要进行内存地址转换的各个位置这些信息被称为重定位信息。
在EXE文件中,重定位信息中记录的是变量和函数的相对地址。所谓相对地址,就是某个地址与基地址之间的相对距离,也就是偏移量。要想使用相对地址,就需要进行一些额外的处理。在源代码中,变量和函数都是分散在各个位置的,但在链接后的EXE文件中,变量和函数会被集中起来分成两组连续排列。
8.8:栈是用来存放函数内部临时使用的变量(局部变量)以及调用函数时传递的参数等数据的内存空间。堆是在程序运行时用来存放任意数据的内存空间。EXE文件中并不包含栈和堆的区域,EXE文件加载到内存并运行的那一刻,栈和堆所需的内存空间才得到分配。内存中的程序是由变量空间、函数空间、栈空间和堆空间共4个区域组成的。
8.9:编译器和解释器的区别是————编译器是在程序运行之前对整个源代码进行翻译,而解释器则是在程序运行时对源代码逐行进行翻译。一般来说,C语言和C++都属于编译型语言,Python则属于解释型语言。
多文件编译是指将一个程序分为多个源文件,并对其分别进行编译,最后合并生成一个EXE文件。这样做的好处是可以缩短单个源文件的长度,方便对程序代码进行管理