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

引言

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

四个阶段

阶段一:预处理(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.mzph.cn/news/831736.shtml

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

相关文章

第五篇:通信脉络:探索计算机外设与总线体系的精髓

通信脉络&#xff1a;探索计算机外设与总线体系的精髓 1 引言 在这个技术日新月异的时代&#xff0c;理解计算机系统的基本构成要素 —— 总线和外设 —— 对于每个从事技术工作的人来说都是至关重要的。这些组件不仅是计算机通信的基石&#xff0c;也直接影响着系统的性能、效…

Enum,你学会了吗?

大家后&#xff0c;我是小七。 今天给大家分享下java.lang包下面Enum类的面试点&#xff0c;本文阅读需3分钟。 Java轮子 分享程序员日常、职场、互联网项目、开发经验&#xff0c;专注技术提升 12篇原创内容 公众号 在 Java 编程中&#xff0c;枚举类型&#xff08;Enum&…

水仙花数问题

问题描述&#xff1a; 求出0&#xff5e;100000之间的所有“水仙花数”并输出。 “水仙花数”是指一个n位数&#xff0c;其各位数字的n次方之和确好等于该数本身&#xff0c;如:153&#xff1d;1^3&#xff0b;5^3&#xff0b;3^3&#xff0c;则153是一个“水仙花数”。 #in…

一个完全免费、私有且本地运行的搜索聚合器-FreeAskInternet

什么是 FreeAskInternet FreeAskInternet 是一个完全免费、私有且本地运行的搜索聚合器&#xff0c;使用 LLM 生成答案&#xff0c;无需 GPU。用户可以提出一个问题&#xff0c;系统将使用 searxng 进行多引擎搜索&#xff0c;并将搜索结果组合到 ChatGPT3.5 LLM 中&#xff0…

如何优雅的分析你的微信朋友圈和聊天记录

微信朋友圈、个人聊天记录、微信群聊天记录&#xff1a; 蓝奏云&#xff1a;链接:​www.lanzoub.com/b00rn0g47e 密码:9hww

Pytorch基础:torch.load_state_dict()方法在加载时不会检查类型

相关阅读 Pytorch基础https://blog.csdn.net/weixin_45791458/category_12457644.html?spm1001.2014.3001.5482 笔者在使用torch.nn.module的load_state_dict中出现了一个问题&#xff0c;一个被注册的张量在加载后居然没有变化&#xff0c;一开始以为是加载出现了问题&#…

漏洞挖掘之某厂商OAuth2.0认证缺陷

0x00 前言 文章中的项目地址统一修改为: a.test.com 保护厂商也保护自己 0x01 OAuth2.0 经常出现的地方 1&#xff1a;网站登录处 2&#xff1a;社交帐号绑定处 0x02 某厂商绑定微博请求包 0x02.1 请求包1&#xff1a; Request: GET https://www.a.test.com/users/auth/weibo?…

SpringCloud微服务:Eureka 和 Nacos 注册中心

共同点 都支持服务注册和服务拉取都支持服务提供者心跳方式做健康检测 不同点 Nacos 支持服务端主动检测提供者状态&#xff1a;临时实例采用心跳模式&#xff0c;非临时&#xff08;永久&#xff09;实例采用主动检测模式Nacos 临时实例心跳不正常会被剔除&#xff0c;非临时实…

深度学习中权重初始化的重要性

深度学习模型中的权重初始化经常被人忽略&#xff0c;而事实上这是非常重要的一个步骤&#xff0c;模型的初始化权重的好坏关系到模型的训练成功与否&#xff0c;以及训练速度是否快速&#xff0c;效果是否更好等等&#xff0c;这次我们专门来看看深度学习中的权重初始化问题。…

my-room-in-3d中的电脑,电视,桌面光带发光原理

1. my-room-in-3d中的电脑&#xff0c;电视&#xff0c;桌面光带发光原理 最近在github中&#xff0c;看到了这样的一个项目&#xff1b; 项目地址 我看到的时候&#xff0c;蛮好奇他这个光带时怎么做的。 最后发现&#xff0c;他是通过&#xff0c;加载一个 lightMap.jpg这个…

让我们一起来领悟带环问题的核心思想

一、带环的链表&#xff1a; 本质还是快慢指针来解决 关于如下一个带环链表怎么去找到他们想碰到的节点呢&#xff1f;&#xff1f;&#xff1f;&#xff1f;我们可以想到快慢指针&#xff0c;第一个快点走&#xff0c;若是有环就会进入环&#xff0c;此时快指针每次走2步&am…

2.1 上海雷卯电子PLC

PLC&#xff08;可编程逻辑控制器&#xff09;像是工厂自动化系统的“大脑”&#xff0c;负责监控和控制各种生产过程。PLC 能够精确地协调各类设备的操作&#xff0c;实现生产流程的自动化和优化。通过编程&#xff0c;它可以根据不同的生产需求灵活调整控制逻辑&#xff0c;提…

可视化大屏应用场景:智慧安防,保驾护航

hello&#xff0c;我是大千UI工场&#xff0c;本篇分享智慧安防的大屏设计&#xff0c;关注我们&#xff0c;学习N多UI干货&#xff0c;有设计需求&#xff0c;我们也可以接单。 实时监控与预警 可视化大屏可以将安防系统中的监控画面、报警信息、传感器数据等实时展示在大屏上…

快速幂笔记

快速幂即为快速求出一个数的幂&#xff0c;这样可以避免TLE&#xff08;超时&#xff09;的错误。 传送门&#xff1a;快速幂模板 前置知识&#xff1a; 1) 又 2) 代码&#xff1a; #include <bits/stdc.h> using namespace std; int quickPower(int a, int b) {int…

TiDB系列之:部署TiDB集群常见报错解决方法

TiDB系列之&#xff1a;部署TiDB集群常见报错解决方法 一、部署TiDB集群二、unsupported filesystem ext3三、soft limit of nofile四、THP is enabled五、numactl not usable六、net.ipv4.tcp_syncookies 1七、service irqbalance not found,八、登陆TiDB数据库 一、部署TiDB…

搜款网商品列表API接口:高效获取时尚潮流商品的新途径

API接口概述 搜款网商品列表API接口允许开发者根据设定的条件&#xff08;如分类、价格区间、关键词等&#xff09;查询搜款网上的商品信息&#xff0c;并返回符合条件的商品列表。通过调用该接口&#xff0c;您可以轻松获取到搜款网上最新、最热的时尚商品数据&#xff0c;为…

批量视频剪辑新选择:一键式按照指定秒数分割视频并轻松提取视频中的音频,让视频处理更高效!

是否经常为大量的视频剪辑工作感到头疼&#xff1f;还在一个个手动分割、提取音频吗&#xff1f;现在&#xff0c;我们为你带来了一款全新的视频批量剪辑神器&#xff0c;让你轻松应对各种视频处理需求&#xff01; 首先&#xff0c;进入媒体梦工厂的主页面&#xff0c;并在板…

TFT显示屏偶发无法点亮

一. 问题描述 最近接到一起客诉&#xff1a;设备偶发显示屏不亮。复现现象时&#xff0c;发现有如下规律&#xff1a; 上电后&#xff0c;如果显示屏正常启动&#xff0c;则在使用过程中会一直正常。反之&#xff0c;如果显示屏一上电就无法显示&#xff0c;则一直黑屏。 是…

安卓硬件访问服务

安卓硬件访问服务 硬件访问服务通过硬件抽象层模块来为应用程序提供硬件读写操作。 由于硬件抽象层模块是使用C语言开发的&#xff0c; 而应用程序框架层中的硬件访问服务是使用Java语言开发的&#xff0c; 因此&#xff0c; 硬件访问服务必须通过Java本地接口&#xff08;Jav…

vector的使用

1.构造函数 void test_vector1() {vector<int> v; //无参的构造函数vector<int> v2(10, 0);//n个value构造&#xff0c;初始化为10个0vector<int> v3(v2.begin(), v2.end());//迭代器区间初始化,可以用其他容器的区间初始化vector<int> v4(v3); //拷贝…