机器运行的是本地代码(Native Code)用某种编程语言编写出来的程序是源代码,保存源代码的文件是源文件。源文件只是文本文件,并不能直接运行,因为CPU只能运行本地代码(机器语言代码)。因此,源代码必须被转换为本地代码。
本地代码里有什么?Window中.EXE文件的程序内容,就是本地代码。只有机器能够理解,人不能理解。将它DUMP一下,即每字节以2位16进制(2进制和16进制的转换规则中,二进制中每4位可以转换为十六进制中1位)的形式表现,就可以发现,本地代码其实是数值的集合。每一个数值都代表了一个命令或一个数据。
从源文件到可执行文件的过程:第一步:转换源代码:编译器编译器:将编程语言编写的源代码转换为本地代码的程序。编译完成的程序为.obj目标文件,内容是本地代码。但是还不能够运行。转换每种高级编程语言都需要其专有的编译器,例如C语言的C编译器。同种编程语言在不同CPU下的编译器也不同。编译器也是程序,因此也需要适合它的运行环境。因此,确定一个编译器的种类,需要确定哪种编程语言+哪种CPU+哪种运行环境。而实际上购买和下载时,通常指需要确定编译器产品名称+版本号即可。第二步:生成.EXE文件与启动:链接器经过编译器的编译,源文件已经被转换成了.obj目标文件。链接:将多个目标文件结合起来,生成一个.EXE可执行文件。链接器:运行链接的程序。库文件,即.lib文件,是指将多个目标文件集成保存在一个文件里的形式。标准函数:在库文件中收录的函数。在程序中,不通过源代码另行编写,而通过库文件提供的函数。如果主程序中使用了标准函数,在运行链接程序时,链接器就需要指定收录它的库文件,将库文件中需要的.obj目标文件(包含此标准函数)抽取出来,与其他目标文件共同生成一个.EXE可执行文件。在链接时,必须链接一个特殊的目标文件,它记述了同所有程序起始位置相结合的处理内容,成为程序的启动。
存储着目标文件的实体,并直接和EXE文件结合的库文件形式称为静态链接库。静态(static=静态的)同动态(dynamic=动态的)是相反的意思。存储着sprintf()的目标文件的cw32lib就是静态链接库。sprintf(提供了通过指定格式把数值转换成字符串的功能。通过结合导入库文件,执行时从DLL文件中调出的MessageBox()函数这一信息就会和EXE文件进行结合。这样,链接器链接时就不会再出现错误消息,从而就可以顺利编写EXE文件。
栈是用来存储函数内部临时使用的变量(局部变量),以及函数调用时所用的参数的内存区域。堆是用来存储程序运行时的任意数据及对象的内存领域。
标签:可执行文件,文件,EXE,第八章,源文件,编译器,源代码,链接 From: https://www.cnblogs.com/locojo/p/17149173.html