程序编译的四个阶段

news2024/11/16 10:16:42

 程序编译的四个阶段 

#include <stdio.h>

int main(){
	printf("Hello World~");
	
	return 0;
}

hello.c程序的生命周期从一个高级C语言程序开始,这种形式容易被人读懂。 但这无法直接被计算机读懂。为了在系统上运行hello.c程序,每条C语言都必须被其他程序转化为一系列的低级机器语言指令。

机器语言是一种以01的表现形式的二进制代码,因此源程序的编译过程就是:将以高级语言编写的程序转换为二进制代码的形式的可执行目标程序。


浅理解

由于现在正处于初步理解阶段,所以这里先进行“浅理解”:

浅理解:不要求深入探讨原理等复杂内容,仅从表面用法和便于记忆的角度进行讲解。重点是快速上手和形成初步印象的内容。主求会用,略求原理。


预处理阶段

在这个阶段,预处理器会根据预处理指令(如#include、#define 等)对源代码进行处理。对于#include <stdio.h>,预处理器会将头文件 stdio.h 的内容插入到当前代码位置,展开宏定义,并处理条件编译指令等。其目的是为后续的编译阶段准备完整且经过初步处理的源代码文本。

编译阶段

编译器将预处理后的源代码转换为低级的中间表示形式,通常是一种类似于汇编语言但更为抽象的形式。在这个过程中,编译器会进行语法分析、语义分析和代码优化等操作。语法分析检查代码是否符合 C 语言的语法规则;语义分析确保代码在语义上是正确的,例如变量的使用是否合法等;代码优化则旨在提高生成代码的效率。如果在这个阶段发现语法错误或语义错误,编译器会报告错误信息。

汇编阶段:

汇编器将编译阶段生成的中间表示形式转换为特定机器架构的汇编语言代码。汇编语言是一种低级语言,更接近机器语言,但仍然相对易于人类阅读和理解。在这个阶段,汇编器会将各种指令和操作转换为对应的机器指令的助记符形式。

链接阶段:

链接器将多个目标文件(可能包括由当前代码生成的目标文件以及其他库文件中的目标文件)链接在一起,生成可执行程序。如果代码中调用了外部库函数(如 printf),链接器会将这些函数的实现与当前代码进行链接,确保程序在运行时能够正确地调用这些函数。链接阶段还会处理符号解析、地址分配等任务,以确保程序能够正确地加载和运行。

通俗理解

预处理阶段

这个阶段就像是给代码做准备工作。比如说,代码里有#include <stdio.h>,在这个阶段,就会把`stdio.h`这个文件里的内容拿过来放到咱这个代码里。就好像你要做一顿饭,先把要用的调料啥的都准备好放在旁边。预处理阶段还会处理一些其他的指令,比如宏定义啥的。总之,就是把代码整理得更完整,为后面的阶段做准备。

编译阶段:

时候呢,就开始把咱的 C 语言代码翻译成机器能懂的语言啦。不过这时候还不是最终的机器语言,更像是一种中间形式。就好比你跟一个外国人说话,你把你的话翻译成一种他能大概明白的中间语言。这个阶段会检查语法错误啥的,如果有错误就会告诉你,让你去改。

汇编阶段:

在这个阶段,把上一个阶段得到的中间语言进一步翻译成机器语言,但是是一种比较低级的机器语言,叫做汇编语言。这就像是把那个中间语言再进一步细化,变成更具体的指令。可以想象成把一个复杂的任务分解成一个个小步骤,每个小步骤都用特定的指令表示。

链接阶段:

最后这个阶段呢,就是把咱的程序和其他需要的东西连接在一起。比如说,如果你的程序用到了一些别人写好的库函数,像`printf`函数就是在`stdio.h`这个库里的。在链接阶段,就会把你的程序和这些库连接起来,让你的程序能正常运行。就好像你做好了一道菜,最后要装盘,把菜和盘子组合在一起,这样才能端上桌。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2167645.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

科研绘图系列:R语言组合多个图形

文章目录 介绍加载R包画图介绍 通过patchworkR包组合多个ggplot数据图形对象。 加载R包 library(ggplot2) library(patchwork)画图 画图theme_set(theme_bw() +theme(

2024年408真题计算机网络篇

1 https://zhuanlan.zhihu.com/p/721169467。最小割可以看作是切断水流的最薄弱环节——通过切断这些关键的“水管”&#xff0c;就可以完全阻止水从源点流到汇点。 在下列二进制数字调制方法中&#xff0c;需要2个不同频率载波 的是 A. ASK B. PSK C. FSK D. DPSK 解答…

Linux终端简介

Linux终端简介 导语基本终端交互终端读写标准/非标准模式重定向处理 终端对话 termios结构模式相关输入模式输出模式控制模式本地模式特殊控制字符终端速度其他函数 终端输出终端类型terminfo 击键动作检测虚拟控制台&伪终端总结参考文献 导语 本章基本是以一个简单的用户…

PlayerPerfs-不同平台的存储位置

一 .PlayerPrefs存储的数据存在哪里 不同平台存储位置不一样 Windows PlayerPrefs 存储在 HKCU\Software\[公司名称]\[产品名称] 项下的注册表中 其中公司和产品名称是 在“Project Settings”中设置的名称。 查看方法&#xff1a; 运行 regedit HKEY…

手游和应用出海资讯:三七新游首月收入突破700万元;领英尝试推出游戏功能以增加用户使用时长

NetMarvel帮助游戏和应用广告主洞察全球市场、获取行业信息&#xff0c;以下为9月第四周资讯&#xff1a; ● 《AFK Journey》收入突破 1.5 亿美元 ● 《黑神话&#xff1a;悟空》IGN年度游戏投票第一掉至第三 ● 三七发布新游首月收入突破700万元 ● 开罗游戏《哆啦A梦的铜锣烧…

Ubuntu22.04安装paddle

查看系统版本信息 使用命令lsb_release -a查看系统版本 rootLAIS01:~# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.5 LTS Release: 22.04 Codename: jammy查看系统支持的cuda版本&#xff0c;使用命令nvidia-smi&#…

Llama 3.2来了,多模态且开源!AR眼镜黄仁勋首批体验,Quest 3S头显价格低到离谱

如果说 OpenAI 的 ChatGPT 拉开了「百模大战」的序幕&#xff0c;那 Meta 的 Ray-Ban Meta 智能眼镜无疑是触发「百镜大战」的导火索。自去年 9 月在 Meta Connect 2023 开发者大会上首次亮相&#xff0c;短短数月&#xff0c;Ray-Ban Meta 就突破百万销量&#xff0c;不仅让马…

HT6872 4.7W防削顶单声道D类音频功率放大器

■ 特点 防削顶失真功能(Anti-Clipping Function,ACF) 优异的全带宽EMI抑制性能 免滤波器数字调制&#xff0c;直接驱动扬声器 输出功率 1.40W(VDD3.6V,RL4Ω,THDN10%) 2.80W(VDD5.0V,RL4Ω,THDN10%) 4.70W(VDD6.5V,RL4Ω,THDN10%) 高信噪比SNR:95dB(VDD6.5V,Av24dB. THDN1%) 低…

监控IDS和IPS增强网络安全性

入侵检测系统&#xff08;IDS&#xff09;和入侵防御系统&#xff08;IPS&#xff09;是当今使用的最复杂的网络安全设备之一&#xff0c;它们检查网络数据包并阻止可疑数据包&#xff0c;并提醒管理员有关攻击企图的信息。 在当今威胁不断变化的网络环境中&#xff0c;防火墙…

学习threejs,添加环境光和点光源

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言二、&#x1f340;绘制任意字体模型…

人工智能之机器学习常见算法

摘要 之前一直对机器学习很感兴趣,一直没时间去研究,今天刚好是周末,有时间去各大技术论坛看看,刚好看到一篇关于机器学习不错的文章,在这里就分享给大家了. 机器学习无疑是当前数据分析领域的一个热点内容。很多人在平时的工作中都或多或少会用到机器学习的算法。这里IT经理网…

【Linux实践】实验六:LINUX系统管理

【Linux实践】实验六&#xff1a;LINUX系统管理 实验目的实验内容实验步骤及结果1. 包管理工具2. VMware Tools3. 修改主机名4. 网络配置① 临时修改② 永久修改 5. 查找文件6. 前后台执行7. 查看进程8. 结束进程 实验目的 4、掌握Linux下软件包管理&#xff0c;包括命令rpm、…

公交IC卡收单管理系统 多处 SQL注入致RCE漏洞复现

0x01 产品简介 公交IC卡收单管理系统是城市公共交通领域中不可或缺的一部分,它通过集成先进的集成电路技术(IC卡)实现了乘客便捷的支付方式,并有效提高了公共交通运营效率。系统集成了发卡、充值、消费、数据采集、查询和注销等多个功能模块,为公交公司和乘客提供了全面、…

领夹麦克风哪个品牌音质最好,主播一般用什么麦克风

在这个信息爆炸的时代&#xff0c;清晰的声音传达显得尤为重要。无论是激情澎湃的演讲&#xff0c;还是温馨动人的访谈&#xff0c;一款优质的无线领夹麦克风都能让声音清晰的传播。但市场上产品繁多&#xff0c;如何挑选出性价比高、性能卓越的无线领夹麦克风呢&#xff1f;本…

c4d.python 旋转一个对象

How to Rotate an Object 第一种方法 import c4ddef main():selected doc.GetActiveObject()if selected:#获取这个物体的矩阵,设置它的偏移再设置回来.mg selected.GetMg()mg c4d.utils.MatrixRotY(c4d.utils.DegToRad(45.))selected.SetMg(mg)main() 第二种方法 import…

图书系统|图书个性化推荐系统|基于springboot的图书个性化推荐系统设计与实现(源码+数据库+文档)

图书个性化推荐系统目录 目录 基于springboot的图书个性化推荐系统设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 2、具体的表设计如下所示&#xff1a; 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#x…

Web 自动化实战经验硬核总结

一、元素定位常用方法 1. xpath规则说明 "/" : 表示从根节点选取 "//" : 从匹配选择的当前节点选择 "" : 选取属性 "*" : 匹配任何元素节点 "*" : 匹配任何属性节点 1.1 属性使用说明 placeholder 用法&#xff1a…

游戏录制没有声音怎么办?简单的解决方法分享

在享受游戏乐趣的同时&#xff0c;不少玩家也喜欢通过录制游戏视频来分享自己的精彩瞬间或是攻略心得。然而&#xff0c;有时在满心欢喜地开始录制后&#xff0c;却发现录制的视频竟然没有声音&#xff0c;这无疑是一大遗憾&#xff0c;今天我们就来看看这个问题怎么解决吧~ 游…

vue 中获取数值但是只获取到了 Promise 属性,获取不到其中的值

左边的请求能获取到数据&#xff0c;右边的不行&#xff1f; 改成这样即可

即插即用篇 | YOLOv8 引入单头视觉Transformer模块 | CVPR 2024

本改进已同步到YOLO-Magic框架! 最近,高效的视觉Transformer在资源受限的设备上以低延迟表现出了出色的性能。传统上,它们在宏观层面上采用44的Patch嵌入和四阶段结构,而在微观层面上使用多头配置的复杂注意力机制。本文旨在通过内存高效的方式解决各个设计层面的计算冗余问…