程序的编译、链接和执行

news/2024/7/7 19:22:56

参考:程序的编译、链接和执行 - 知乎

处理C语言程序:

预处理、编译、汇编、链接、加载

预处理(Preprocessing)

翻译一段 C 语言程序的第一步是预处理。这一步主要处理所有以“#”号开头的行。比如当我们遇到 #include "header.h" 的时候,就直接把 header.h 文件里的所有内容插入到这儿。由此可见,一段 C 语言程序经过预处理之后还是一段 C 语言程序。

编译(Compilation)

第二步是编译,也就是将一段 C 语言程序翻译为一段汇编语言程序。汇编语言比 C 语言要底层多了,基本上就是机器指令的文字版,每一行汇编语言对应着一条机器指令。往往 C 语言程序里的一行要被翻译成好几行汇编语言程序才行。不同的高级语言(如 C、Fortran、Pascal 等等)有不同的预处理器和编译器,但它们在经过编译之后都变成了同一种汇编语言,于是后面的步骤和工具大家都是通用的了。

汇编(Assembly)

第三步是汇编,即把文字版的汇编语言程序真正翻译成由 0 和 1 组成的机器指令,并把它们打包输出成一个 relocatable object program(下文简称目标文件)。如果说汇编语言程序人类还勉强能看懂,经过这一步之后得到的目标文件就真的是一堆二进制乱码了。

链接(Linking)

第四步是链接,用来把多个目标文件合并成一个可执行文件。比如说我们写了一个 hello world 程序,其中调用了 C 语言标准库里的 printf() 函数来打印。我们的 hello world 的主函数和 printf() 函数存放在两个不同的目标文件里,经过这一步之后它们就被合并到一起了。(这里讲的是静态链接。如果是动态链接的话,printf() 在这一步暂时不合并进来,而是在下一步程序运行的时候才被加载。)

加载(Loading)

上一步所生成的可执行文件终于可以被操作系统加载运行了。操作系统会将这个可执行文件中的代码和数据从磁盘复制到内存中,并跳转到该程序的第一条指令处(也叫做入口点,entry point)开始执行。


http://lihuaxi.xjx100.cn/news/260081.html

相关文章

重磅!深度学习知识总结和调参技巧开放下载了

近年来,人工智能正在进入一个蓬勃发展的新时期,这主要得益于深度学习和CV领域近年来的发展和成就。在这其中,卷积神经网络的成功也带动了更多学术和商业应用的发展和进步。为了避免“内卷”,更多人选择学习进阶,但是仍…

强化学习,路在何方?

↑↑↑关注后"星标"Datawhale每日干货 & 每月组队学习,不错过Datawhale干货 来源:DeepRL实验室,转自:睿慕课▌一、深度强化学习的泡沫2015年,DeepMind的Volodymyr Mnih等研究员在《自然》杂志上发表论文…

ElasticSearch中结构化查询(term、terms、range、exists、match、bool)

term查询 term 主要用于精确匹配哪些值,比如数字,日期,布尔值或 not_analyzed 的字符串(未经分析的文本数据类型): { "term": { "age": 26 }} { "term": { "date": "2014-09-01&q…

Quartz定时任务学习(四)调度器

org.quartz.Scheduler 类层次 作为一个 Quartz 用户,你要与实现了 org.quartz.Scheduler 接口的类交互。在你调用它的任何 API 之前,你需要知道如何创建一个 Scheduler 的实例。取而代之的是用了某个工厂方法来确保了构造出 Sheduler 实例并正确的得到初…

强大的 IDEA 代码生成

欢迎关注方志朋的博客,回复”666“获面试宝典Java 开发过程经常需要编写有固定格式的代码,例如说声明一个私有变量,logger或者bean等等。对于这种小范围的代码生成,我们可以利用 IDEA 提供的 Live Templates功能。刚开始觉得它只是…

暴雨之后,评估与重建可以用这个数据集

作者:神经星星来源:HyperAI超神经场景描述:连续多日的暴雨给郑州和河南部分城市,带来了严重的洪涝灾害,牵动了全国人民的心。灾难面前,现阶段的科技和具体解决方案,也能发挥出关键作用。关键词&…

樊振东拟保送上海交大!评论区变大型P图现场

点击上方“视学算法”,选择加"星标"或“置顶”重磅干货,第一时间送达本文来源:南方都市报、中国青年报综合自国家体育总局科教司、上海交通大学等4月12日,国家体育总局科教司在官网发布,“关于2022年优秀运动…

数据流、控制流

控制流:数据流进行分析的基础。 数据流分析: 通常用于程序没有运行时静态分 析源代码,以预测程序动态运行时的过程.数据流 分析并不是 真 正 的 运 行 程 序,而是在运行之前进 行静态地分析,预测程序真正…