【编译原理】程序运行的四个阶段,从源代码到可执行文件的完整过程解析

引言

程序的运行过程经历了多个阶段,从源代码到最终的可执行文件,涉及了预处理、编译、汇编和链接等步骤。本篇博客将深入解析程序运行的四个主要阶段,并结合一个简单的示例来说明每个阶段的作用。

四个阶段

阶段一:预处理(Preprocessing)

在这个阶段,预处理器将源代码中的预处理指令(如 #include#define 等)替换为实际的内容。预处理器会根据指令展开头文件,处理宏定义,并删除注释等。

阶段二:编译(Compilation)

编译器将预处理后的源代码转换为汇编代码。它会对每个源文件进行词法分析、语法分析和语义分析,生成相应的中间代码,并进行优化。

阶段三:汇编(Assembly)

汇编器将编译生成的中间代码转换为机器可读的汇编代码,也就是机器码的文本表示。这个阶段将源代码转换为机器语言的汇编指令,但还没有生成可执行文件。

阶段四:链接(Linking)

链接器将汇编生成的目标文件(object file)以及可能的库文件链接在一起,生成最终的可执行文件。它会解析各个目标文件之间的符号引用和符号定义关系,将它们合并成一个完整的程序。

示例:从源代码到可执行文件的完整过程

在 Linux 中,我们可以通过一个简单的 C 语言程序来演示程序运行的四个阶段,并介绍相应的编译命令。假设我们有一个名为 hello.c 的源文件,内容如下:

#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}

接下来,我们将演示预处理、编译、汇编和链接的过程,并介绍相应的 Linux 编译命令。

预处理(Preprocessing)

在预处理阶段,我们可以使用 gcc 命令进行预处理。运行以下命令:

gcc -E hello.c -o hello.i

这将会将 hello.c 文件预处理后的结果保存为 hello.i 文件。

编译(Compilation)

在编译阶段,我们可以使用 gcc 命令进行编译。运行以下命令:

gcc -S hello.i -o hello.s

这将会将预处理后的文件 hello.i 编译成汇编文件 hello.s

汇编(Assembly)

在汇编阶段,我们可以使用 gcc 命令进行汇编。运行以下命令:

gcc -c hello.s -o hello.o

这将会将汇编文件 hello.s 汇编成目标文件 hello.o

链接(Linking)

在链接阶段,我们可以使用 gcc 命令进行链接。运行以下命令:

gcc hello.o -o hello

这将会将目标文件 hello.o 以及可能的库文件链接在一起,生成最终的可执行文件 hello

运行程序

最后,我们可以直接运行生成的可执行文件 hello

./hello

这将会输出 “Hello, World!”,表示程序已经成功运行。

总结

程序运行的四个阶段分别是预处理、编译、汇编和链接。每个阶段都有其特定的作用,通过相互配合,将源代码转换为最终的可执行文件。了解这些阶段可以帮助开发者更好地理解程序的运行过程,并优化代码的编译和链接过程,提高程序的性能和可维护性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

K8S哲学 - statefulSet 灰度发布

kubectl get - 获取资源及配置文件 kubectl get resource 【resourceName -oyaml】 kubectl create - 指定镜像创建或者 指定文件创建 kubectl create resource 【resourceName】 --imagemyImage 【-f my.yaml】 kubectl delete kubectl describe resource resourc…

删除虚拟机存储策略中vSAN默认存储策略

登录vSphere Client&#xff0c;展开左上角设置-策略和配置文件-虚拟机存储策略&#xff0c;可以查看系统默认创建的虚拟机存储策略。这些存储策略由系统自动生成&#xff0c;其中有一部分存储策略仅用于vSAN数据存储&#xff0c;作为vSAN 默认存储策略以应用于&#xff0c;当在…

day-26 H 指数

思路 利用Arrays.sort()函数排序&#xff0c;然后从后面开始计算H指数 解题方法 H指数初始化为零&#xff0c;排序后从数组最后一个元素开始&#xff0c;如果当前元素大于等于H指数&#xff0c;则比较前一个元素&#xff0c;并将H指数加1&#xff0c;直到循环结束。 Code cl…

ubuntu安装LVGL/lv_img_conv并在thinkphp中进行调用生成bin文件

项目需求&#xff1a;需要处理图片成为bin文件&#xff0c;并以二进制的方式传给蓝牙设备&#xff0c;当前仅介绍如何安装&#xff0c;对lvgl功能和简介不做过多描述 项目库地址&#xff1a;https://github.com/lvgl/lv_img_conv 安装过程比较简单 一&#xff0c;确保node.j…

Colab - Introduction to Object Detection using TensorFlow Hub

Colab - Introduction to Object Detection using TensorFlow Hub 1. 源由2. TensorFlow Hub3. 目标检测3.1 举例 - EfficientDet/D4 COCO 20173.2 下载示例图像3.2.1 显示部分样本3.2.2 定义一个将类别ID映射到类别名称和颜色的字典 3.3 加载模型3.4 单张照片执行推理3.4.1 推…

STM32入门学习之ADC

1.ADC在STM32进行数据采集时十分重要。通过ADC可以将外界的数字信号转换为模拟信号&#xff0c;以满足采样的需求。(资料参考于正点原子) STM32 拥有 1~3 个 ADC &#xff08; STM32F101/102 系列只有 1 个 ADC &#xff09;&#xff0c;这些 ADC 可以独立使用&#…

20240504在RK3588的Buildroot系统下使用i2cdetect xxxx ppppp

20240504在RK3588的Buildroot系统下使用i2cdetect 2024/5/4 10:45 rootok3588:/# rootok3588:/# i2cdetect -y 0 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- …

2024年第六届先进材料、机械和制造国际会议(AMMM 2024)即将召开!

2024年第六届先进材料、机械和制造国际会议&#xff08;AMMM 2024&#xff09;将于2024年9月6-8日在日本东京举行。AMMM 2024将以国际材料&#xff0c;机械和制造为主题&#xff0c;吸引到来自多个领域的研究人员和学者相聚在一起分享知识&#xff0c;讨论想法&#xff0c;并了…

【系统架构师】-选择题(十二)

1、网闸的作用&#xff1a;实现内网与互联网通信&#xff0c;但内网与互联网不是直连的 2、管理距离是指一种路由协议的路由可信度。15表示该路由信息比较可靠 管理距离越小&#xff0c;它的优先级就越高&#xff0c;也就是可信度越高。 0是最可信赖的&#xff0c;而255则意味…

Typora编辑markdown的技巧

参考视频的B站链接&#xff1a; 手把手教你撰写Typora笔记 在其中选择了常用的部分做标记。 一、标题 使用ctrl数字键&#xff0c;可以快捷的把一行文字变成n级标题 二、源代码模式 可以在下图所示进入 三、设置typora能够自动显示粘贴的图片 打开“偏好设置”&#xff0…

利用 Zstandard (zstd) 高效压缩数据

目录标题 1. Zstandard 压缩算法概述主要特性&#xff1a; 2. Zstandard 在实践中的应用应用案例&#xff1a; 3. 如何使用 Zstandard3.1 安装 Zstandard3.2 使用命令行工具3.3 集成到程序中 4. 总结 在大数据时代&#xff0c;如何高效地存储和传输数据成为了许多企业和开发者面…

Elasticsearch 数据聚合

Bucket聚合&#xff08;桶聚合&#xff09; 对文档做分组&#xff0c;aggs 按照文档字段值或日期进行分组&#xff0c;能参与分词的字段不能做聚合&#xff0c;如text类型的字段 例如&#xff1a;根据城市名称做聚合&#xff0c;也就是城市名称对数据进行分组统计。可以加qu…

OSPF优化

OSPF的优化主要目的是为了减少LSA的更新量 路由汇总-----可以减少骨干区域的LSA数量 特殊区域-----可以减少非骨干区域的LSA数量 OSPF路由汇总 域间路由汇总 域间路由汇总在ABR设备上进行操作 [GS-R2-ospf-1-area-0.0.0.1]abr-summary 192.168.0.0 255.255.224.0 [GS-R3-o…

面经总结系列(二): 面壁智能大模型算法工程师

&#x1f468;‍&#x1f4bb;作者简介&#xff1a; CSDN、阿里云人工智能领域博客专家&#xff0c;新星计划计算机视觉导师&#xff0c;百度飞桨PPDE&#xff0c;专注大数据与AI知识分享。✨公众号&#xff1a;GoAI的学习小屋 &#xff0c;免费分享书籍、简历、导图等&#xf…

设计模式之数据访问对象模式

在Java编程的浩瀚星海中&#xff0c;有一个模式低调却强大&#xff0c;它像是一位默默无闻的超级英雄&#xff0c;支撑起无数应用的数据脊梁——那就是数据访问对象&#xff08;DAO, Data Access Object&#xff09;模式&#xff01;想象一下&#xff0c;如果你能像操纵魔法一样…

网络基础(全)

协议 ”协议“就是一种约定。那么协议需要需要管理吗&#xff1f;答案是当然需要管理呀。 操作系统要进行协议管理——先描述&#xff0c;在组织协议本质就是软件&#xff0c;软件是可以进分层的协议在设计的时候&#xff0c;就是被层状的划分的为什么要划分为层状结呢&#…

综合能源系统:Modbus转IEC104网关解决方案

Modbus转IEC104网关BE102 方案概述 Modbus和IEC104是两种通信协议&#xff0c;各自适用于不同行业和场景&#xff0c;其中Modbus常见于工业自动化&#xff0c;而IEC104则主导电力行业。在某些项目中&#xff0c;需要将Modbus设备的数据传至IEC104电力平台&#xff0c;但两者协…

[嵌入式系统-65]:RT-Thread-组件:FinSH控制台, 用户与RT Thread OS实时命令行交互工具

目录 FinSH 控制台 1. FinSH 简介 2. FinSH 内置命令 - 内核代码自身提供的命令 显示线程状态 显示信号量状态 显示事件状态 显示互斥量状态 显示邮箱状态 显示消息队列状态 显示内存池状态 显示定时器状态 显示设备状态 显示动态内存状态 3. 自定义 FinSH 命令 …

【5/01-5/03】 Arxiv安全类文章速览

知识星球 首先推荐一下我们的知识星球&#xff0c;以AI与安全结合作为主题&#xff0c;包括AI在安全上的应用和AI本身的安全&#xff1b; 加入星球你将获得&#xff1a; 【Ai4sec】&#xff1a;以数据驱动增强安全水位&#xff0c;涵盖内容包括&#xff1a;恶意软件分析&…

MATLAB中功率谱密度计算pwelch函数使用详解

MATLAB中功率谱密度计算pwelch函数使用详解 目录 前言 一、pwelch函数简介 二、pwelch函数参数说明 三、pxx pwelch(x)示例 四、[pxx,f]pwelch(x,window,noverlap,nfft,fs)示例 四、[pxx,f] pwelch(x,window,noverlap,nfft,fs,freqrange,spectrumtype)示例 五、多通道功…
最新文章