源代码:用某种编程语言编写的程序 ; 源文件:保存源代码的文件
用C语言编写的源文件的扩展名通常是“.c”。源文件是简单的文本文件,windows自带的记事本即可编写。
CPU能直接解释并运行本地代码而不是源代码。用任何编程语言编写的源代码,最后都要翻译成本地代码,否则CPU无法理解,
本地代码的内容人类无法理解,所以才有了C语言等编程语言来编写源代码,在转化为本地代码
Dump:把文件的内容,每个字节用二位十六进制数表示的方法。本地代码就是各种数值的罗列,这些数值就是本地代码的真面目。每个数值都表示一个命令或数据。
编译器:把源代码转换成本地代码的程序。
CPU不同,本地代码的类型也不同,编译器与CPU有关,也与编程语言的种类有关。
编译器本身也是程序的一种,也需要运行环境
交叉编译器:生成的是和运行环境中的CPU不同的CPU使用的本地代码。
编译器三个关键词(1)何种编程语言 (2)哪种cpu (3)运行环境
仅靠编译是无法得到可执行文件的
编译器将源代码转换成本地文件后,此时本地文件无法直接运行,得到可以运行的EXE文件
编译后还需要进行“链接处理” 编译后生成的不是EXE文件,而是扩展名为“.obj”的目标文件。虽然目标文件的内容是本地代码,但是当前程序还处于未完成状态。
把多个目标文件结合,生成一个EXE文件的处理就是链接。 运行链接的程序就是链接器。
库文件指的是把多个目标文件集成保存在一个文件中的形式
Windows以函数的形式为应用提供了各种功能。这些形式的函数称为API
API储存在DLL文件的特殊库文件中, DLL是程序运行时动态结合的文件
EXE文件作为单独的文件储存在硬盘中。 EXE文件中给变量及函数分配了虚拟的内存地址,程序运行时,虚拟转换成实际的。 链接器会在EXE文件开头追加转换内存地址所需的必要信息(再配置信息)
再配置信息就成为了变量和函数的相对地址。相对地址表示的是相对于基点地址的偏移量,就是相对距离
程序加载时生成栈和堆
程序加载到内存后,额外生成两个组,栈和堆。
栈:储存函数内部临时使用的变量,以及函数调用时所用的参数的内存区域
堆:存储程序运行时的任意数据及对象的内存区域
EXE文件中不存在栈和堆,栈和堆需要的内存空间是在EXE文件加载到内存后开始运行时得到分配的。
因此,内存中的程序,就是由用于变量的内存空间、用于函数的内存空间、用于栈的内存空间、用于堆的内存空间四部分构成。
栈中对数据进行存储或舍弃的代码,由编译器自动生成,不需要程序员参与;但是堆需要。
程序中如果没有明确释放堆的内存空间,那么即使处理完,该内存空间也会残留,这个现象叫内存泄漏。
标签:可执行文件,文件,EXE,代码,内存空间,源文件,编译器,源代码 From: https://www.cnblogs.com/zhhhhh/p/18028023