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