从源文件到可执行文件

源代码:用某种编程语言编写的程序 ; 源文件:保存源代码的文件
用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文件加载到内存后开始运行时得到分配的。

因此,内存中的程序,就是由用于变量的内存空间、用于函数的内存空间、用于栈的内存空间、用于堆的内存空间四部分构成。

栈中对数据进行存储或舍弃的代码,由编译器自动生成,不需要程序员参与;但是堆需要。

程序中如果没有明确释放堆的内存空间,那么即使处理完,该内存空间也会残留,这个现象叫内存泄漏。

posted @   狂暴之刃  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示