对于本章,首先我们需要了解源代码和源文件,用某种编程语言编写的程序,就是源代码保存源代码的文件就是源文件,而且用C语言编写的源文件的扩展名通常是".c"。但若想要程序运行还需要将源代码转换成本地代码,因为计算机的"大脑"CPU能直接解析的是本地代码。既然我们知道了,要转换成本地代码,那么本地代码的内容到底是什么呢?其实就是各种数值的罗列,而每个数值都表示某一个命令或数据。那么是什么负责转换源代码为本地代码的呢?就是编译器,它能够把C语言等高级编程语言编写的源代码转换成从本地代码的程序,而因CPU类型的不同,本地代码类型的不同,以及运行环境不同所需要的编译器也是不同的。另外还有一种交叉编译器,它生成的是和运行环境中CPU不同的CPU所使用的本地代码。 但编译器转换源代码后得到的目标文件,目标文件中是本地代码,但却无法直接运行,因此,还需要把多个目标文件结合生成一个EXE文件处理(也称为链接处理),而运行链接的程序就称为链接器。进行链接处理(链接器指定库文件后把需要的目标文件抽取出来再同其他目标文件结合生成EXE文件。其中库文件指的是把多个目标文件集成保存在一个文件中的形式)之后就要和启动结合起来,也就是目标文件记述的是同所有程序起始位置相结合的处理内容。此外,我们还需要知道外部符号指的是其他目标文件中的变量或者函数,标准函数是指通过库文件形式和编译器一起提供的。
API:以函数的形式为应用提供了各种功能,其目标文件是存储在名为DLL文件的特殊库文件中。
DLL文件:是程序运行时动态结合的文件。 静态链接库:存储捂着目标高文件的实体并直接和EXE文件结合的库文件。
再配置信息:链接器在EXE文件的开头追加转换内存地址所需要的必要信息。 在EXE文件中变量和函数的内存地址的值是如何来的?是EXE文件中给变量及函数分配了,虚拟的内存地址。
程序加载时会生成栈和堆。栈:用来存储函数内部临时使用的变量,以及含数调用时所用的参数的内存区域。堆:用来存储程序运行时的任意数据集对象的内存领域。两者的相似之处:它们的内存空间都是在程序运行时得到申请分配的。不同之处:栈对数据进行存储和舍弃代码是由编译器自动生成的,不需要程序员的参与,因此,每当函数被调用时都会得到申请分配并在函数处理完毕之后自动释放,而堆则需要根据程序员编写的程序来名确进行申请分配或者释放。 内存泄露:没有在程序中明确释放堆的内存空间,即使在处理完毕后,该内存空间仍会一直残留的现象。
补充:1、编译器是在运行前对所有源代码进行解释处理,而且解释器是在运行时对源代码进行解释处理。2、分割编译指的是将整个程序分为多个源代码来编写,然后分别进行编译,最后链接成一个EXE文件。3、Build指的是连续执行编译和链接。4、使用DLL文件的好处:可以节约内存和磁盘。 对函数内容进行修正时更加简便。
标签:可执行文件,文件,EXE,代码,源文件,编译器,源代码,链接 From: https://www.cnblogs.com/G-y-l-123/p/18026258