第8章从源文件到可执行文件

本地代码:本地代码的内容就是数值的罗列集合(二进制的数据展示)
编译器:负责将源代码转换为本地代码,每种语言都有其专用的编译器
交叉编译:在当前平台编译另外平台的本地代码,例如在win上编译linux平台运行的本地代码
文件需要链接的原因:将源代码编译后只是对程序员书写的代码进行了编译,还需要将在源代码中进行引入的库文件,函数这些引入的功能进行编译整合在一起,整合后的文件才是完整的执行程序,因此需要进行链接操作。当前的语言通常在编译的同时进行了链接,因此只需要编译后就可以得到可执行程序。
库文件: 把多个目标文件集成保存到一个文件中的形式,链接器指定库文件后会将需要用到的库文件函数提取出来与其它目标文件结合生成可执行程序
标准函数: 不是通过源码形式,而是通过库文件和编译器一起提供的。这样的函数称为标准函数,如语言自带的标准库函数
动态链接库DLL及导入库: 程序运行时动态结合,不存在库文件的静态代码(只存在DLL文件目标路径信息),运行时才导入库文件的相关功能,因此也成导入库
静态链接库: 存储着目标文件的实体,并直接与可执行程序结合的库文件形式
可执行程序运行的必要条件: 需要程序内函数与变量的内存地址
虚拟内存地址: 在可执行程序加载到内存执行时,由于每次程序运行时,系统分配给程序内部的变量与函数的内存地址都不相同,因此为了避免这个问题,系统给程序内的变量与函数分配的为虚拟内存地址
当程序加载到内存后,会分配生成堆、栈内存空间来进行运行时的数据保存
堆:用来存储程序运行时的任意数据及对象的内存领域(全局变量)
栈:用来存储函数内部临时使用的变量(局部变量),已经函数调用时所用的参数内存领域
内存中的程序构成: 由用于变量的内存空间、用于函数的内存空间(这两部分用于复制可执行程序到内存)、用于栈的内存空间、用于堆的内存空间(程序运行时申请分配用于存储运行时数据)
使用栈的数据内存空间,每当函数调用时都会进行申请分配,并在函数处理完毕后自动释放(编译器管理)
使用堆的内存空,需要根据程序员编写的程序明确进行分配释放(程序员自己管理)

posted @ 2024-02-23 14:20  mazhu  阅读(28)  评论(0)    收藏  举报