程序编译的四个阶段

 程序编译的四个阶段 

#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.rhkb.cn/news/433063.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql数据库的基本管理

目录 一.数据库的介绍 二.mariadb的安装 三.软件基本信息 四.数据库开启 五.数据库的安全初始化 六.数据库的基本管理 七.数据密码管理 八.用户授权 九.数据库的备份 十.web控制器 一.数据库的介绍 1.什么是数据库 数据库就是个高级的表格软件 2.常见数据库 Mysql Oracl…

[大语言模型] 情感认知在大型语言模型中的近期进展-2024-09-26

[大语言模型] 情感认知在大型语言模型中的近期进展-2024-09-26 论文信息 Title: Recent Advancement of Emotion Cognition in Large Language Models Authors: Yuyan Chen, Yanghua Xiao https://arxiv.org/abs/2409.13354 情感认知在大型语言模型中的近期进展 《Recent A…

JVM 垃圾回收算法细节

目录 前言 GC Root 可达性分析 根节点枚举 安全点 安全区域 记忆集与卡表 写屏障 并行的可达性分析 前言 学习了几种垃圾收集算法之后&#xff0c; 我们再来看看它们在具体实现上有什么细节之处&#xff0c;我们所能看到的理论很简单&#xff0c;但是实现起来那…

如何把PDF样本册转换为网址链接

​随着互联网的普及&#xff0c;将纸质或PDF格式的样本册转化为网址链接&#xff0c;以便于在线浏览和分享&#xff0c;变得越来越重要。本文将为您详细讲解如何将PDF样本册转换为网址链接&#xff0c;让您轻松实现线上展示和分享。 一、了解PDF样本册与网址链接 1. PDF样本册…

详解电力物联网通常使用哪些通信规约?

在电力物联网行业中&#xff0c;通信规约是关键的技术之一&#xff0c;用于实现电网设备与控制中心之间的数据通信和信息管理。本篇就为大家简单说明电力物联网通常使用哪些通信规约。 1、IEC 60870-5-101/104 这是由国际电工委员会&#xff08;IEC&#xff09;制定的一系列标…

99%的人都不知道的AI绘图变现赚钱秘诀,都在这里了!

AI绘画发展至今&#xff0c;已经有很多实际落地的应用场景&#xff0c;这里介绍几种AI绘图热门变现方式 AI儿童绘本 各大平台上故事绘本、幼儿园儿歌、英文绘本、古诗词&#xff0c;从下图里&#xff0c;可以看出需求量很大 AI儿童绘本 实现方式 \1. gpt\2. leonardo.ai\3.…

Arduino的wifi连接,如何关闭低功耗模式?

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…

linuxC命令5

目录 2.1概念 2.2格式 5.1根据宏是否定义 5.2根据宏值 5.3防止头文件重复包含 指针函数 2.1概念 本质上是函数&#xff0c;返回值是指针类型 2.2格式 数据类型 * 函数名&#xff08;参数列表&#xff09; { 函数体&#xff1b; return 地址&#xff1b;//失败一般会返回NULL } …

虚幻蓝图Ai随机点移动

主要函数: AI MoveTo 想要AI移动必须要有 导航网格体边界体积 (Nav Mesh Bounds Volume) , 放到地上放大 , 然后按P键 , 可以查看范围 然后创建一个character类 这样连上 AI就会随机运动了 为了AI移动更自然 , 取消使用控制器旋转Yaw 取消角色移动组件 的 使用控制器所需的…

AI数字人直播爆火,数字人虚拟主播成品牌闲时直播最佳选择!

近年来&#xff0c;随着互联网的普及和发展&#xff0c;电商和直播平台在我国迅速崛起。根据中国网络信息中心的数据显示&#xff0c;我国直播用户7.5亿&#xff0c;使用率已经超过70%&#xff0c;直播已经成为企业重要的营销和销售通道。 一、在经历了几年的爆发式增长后&…

C++冷门知识点1

1.特殊情况汇总&#xff1a; 负数&#xff0c;空指针&#xff0c;叶节点&#xff0c;INT_MAX和INT_MIN 2.双指针法(快慢指针&#xff0c;头尾指针)&#xff0c;三数指针法(链表逆序那块) 3.一定要注意极端情况 2.e后边可以跟负数&#xff0c;但是不能跟小数 3.string的push_bac…

Git 使用方法

简介 Git常用命令 Git 全局设置 获取Git 仓库 方法二用的比较多 将仓库链接复制 在 git base here ----> git clone 仓库链接 工作区、暂存区、版本库 Git 工作区中文件中的状态 本地仓库的操作 远程仓库操作 git pull 将代码推送到远程仓库 1. git add 文件名 ---放…

Visual Studio导出动态库

1、创建新项目&#xff0c;选择如下 2、工程目录结构如下 3、编写pch.h文件&#xff0c;内容如下 // pch.h: 这是预编译标头文件。 // 下方列出的文件仅编译一次&#xff0c;提高了将来生成的生成性能。 // 这还将影响 IntelliSense 性能&#xff0c;包括代码完成和许多代码浏…

实现简易 vuedraggable 的拖拽排序功能

一、案例效果 拖拽计数4实现手动排序 二、案例代码 <draggable:list"searchResult.indicator":group"{ name: indicators }"item-key"field"handle".drag-handle-icon"><divclass"field-item"v-for"(item…

JAVA一键预约品质生活尽在掌握高效家政服务系统小程序源码

一键预约&#xff0c;品质生活尽在掌握 —— 高效家政服务系统 &#x1f3e0;【开篇&#xff1a;告别繁琐&#xff0c;拥抱品质生活】&#x1f3e0; 在这个快节奏的时代&#xff0c;我们总在为生活奔波&#xff0c;却往往忽略了家的温馨与整洁。你是否也曾为堆积如山的家务而烦…

禁止吸烟监测系统 基于图像处理的吸烟检测系统 YOLOv7

吸烟是引发火灾的重要原因之一。烟头在未熄灭的情况下&#xff0c;其表面温度可达200℃-300℃&#xff0c;中心温度甚至能高达700℃-800℃。在易燃、易爆的生产环境中&#xff0c;如化工厂、加油站、仓库等&#xff0c;一个小小的烟头就可能引发灾难性的火灾&#xff0c;造成巨…

HarmonyOS---权限和http/Axios网络请求

网络请求(http,axios) 目录 一、应用权限管理1.1权限的等级1.2授权方式1.3声明权限的配置1.4如何向用户进行申请 二、内置http请求使用三、Axios请求使用&#xff08;建议&#xff09;3.1 使用方式一3.2 使用方式二&#xff08;建议&#xff09; 一、应用权限管理 应用权限保护…

【Linux】环境变量(初步认识环境变量)

文章目录 1. 环境变量1.1 基本概念 2. 认识常见环境变量2.1 PATH2.2 HOME2.3 SHELL2.4 PWD2.5 USER 3. 理解环境变量 1. 环境变量 在main函数的命令行参数中&#xff0c;有argc、argv、env三个参数。 argc&#xff1a;命令函参数的个数argc&#xff1a;存放每个参数的具体数值…

54 循环神经网络RNN_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录循环神经网络使用循环神经网络的语言模型困惑度&#xff08;perplexity&#xff09;梯度剪裁 循环神经网络 使用循环神经网络的语言模型 输入“你”&#xff0c;更新隐变量&#xff0c;输出“好”。 困惑度&#xff08;perplexity&#xff…

vue中高德地图使用 Marker 标点 - 标点数据快到 1000 时页面卡顿问题解决(已解决 - 多方面原因)+ 海量点功能实现解决

目录 1.业务需求2.最初实现及出现的问题3.解决 - 1000 个标点时页面就出现 卡顿 问题4.使用海量点、聚合标点后还有卡顿&#xff0c;排查其他原因5.最终解决5.1页面中list数据渲染问题解决5.2地图相关实例不要放在 vue 的可响应数据中 页面展示 1.业务需求 需要在 高德地图 中标…