【C语言编译与链接】--翻译环境和运行环境,预处理,编译,汇编,链接

article/2025/7/28 10:51:45

目录

一.翻译环境和运行环境

 二.翻译环境

2.1--预处理(预编译) 

2.2--编译

2.2.1--词法分析 

2.2.2--语法分析 

2.2.3--语义分析 

2.3--汇编

2.4--链接 

三.运行环境 


🔥个人主页:@草莓熊Lotso的个人主页

🎬作者简介:C++研发方向学习者

📖个人专栏:《C语言》

⭐️人生格言:生活是默默的坚持,毅力是永久的享受。


一.翻译环境和运行环境

--在ANSI C的任何一种实现中,存在两个不同的环境:

  1. 翻译环境,在这个环境中源代码被转换为可执行的机器指令(二进制指令)。
  2. 执行环境,它用于实际执行代码。


 二.翻译环境

--那么我们翻译环境是怎么把源代码转换为可执行的机器指令的呢?这里我们就得详细的了解一下翻译环境所做的事。

翻译环境是由编译链接两个大的过程组成,而编译又可以分解成:预处理(预编译),编译,汇编这三个过程。

 ⼀个C语言的项目中可能有多个 .c 文件⼀起构建,那多个 .c 文件如何生成可执行程序呢?

  • 多个.c文件单独经过编译器,编译处理生成对应的目标文件。
  • 注:在Windows环境下的目标文件的后缀是 .obj ,Linux环境下目标文件的后缀是 .o
  • 多个目标文件和链接库⼀起经过链接器处理生成最终的可执行程序。
  • 链接库是指运行时库(它是支持程序运行的基本函数集合)或者第三方库。

我们再把编译器展开为3个过程看看(以gcc为例),如下图:

2.1--预处理(预编译) 

--在预处理阶段,源文件和头文件会被处理成为.i为后缀的文件。如果我们想要在gcc环境下进行观察对test.c文件预处理后的.i文件,命名如下:

1.   gcc  -E  test.c  -o  test.i

 预处理阶段主要处理那些源文件中#开始的预编译指令。比如:#include,#define,处理的规则如下所示:

  • 将所有的 #define 删除,并展开所有的宏定义。
  • 处理所有的条件编译指令,如: #if#ifdef#elif#else#endif
  • 处理#include 预编译指令,将包含的头文件的内容插入到该预编译指令的位置。这个过程是递归进行的,也就是说被包含的头文件也可能包含其他文件。
  • 删除所有的注释
  • 添加行号和文件名标识,方便后续编译器生成调试信息等。
  • 保留所有的 #pragma 的编译器指令,编译器后续会使用。

经过预处理后的 .i 文件中不再包含宏定义,因为宏已经被展开。并且包含的头文件都被插入到 .i 文件中。所以当我们无法知道宏定义或者头文件是否包含正确的时候,可以查看预处理后的 .i 文来确认。

这里先简单的介绍一下,后面会更新预处理详解来更加深入的分享预处理的相关知识。

2.2--编译

 --编译过程就是预处理后的文件进行一系列的:词法分析,语法分析,语义分析及优化,生成相应汇编代码文件。

编译过程的命令如下:

1.  gcc  -S  test.i  -o  test.s

对下面代码进行编译的时候,会怎么做呢?假设有下面的代码:

1.   array[index] = (index+4)*(2+6);

2.2.1--词法分析 

--将源代码程序被输入扫描器,扫描器的任务就是简单的进行词法分析,把代码中的字符分割成一系列的记号(关键字,标识符,自变量,特殊字符等)。

上面的代码进行词法分析后得到了如下16个记号:

记号类型
array标识符
[左方括号
index标识符
]右方括号
=赋值
(左圆括号
index标识符
+加号
4数字
)右圆括号
*乘法
(左圆括号
2数字
+加号
6数字
)右圆括号

2.2.2--语法分析 

接下来语法分析器将会对扫描产生的记号进行语法分析,从而产生语法树。这些语法树是以表达式为节点的树。

2.2.3--语义分析 

语义分析器来完成语义分析,即对表达式的语法层面分析。编译器所能做的分析是语义的静态分析。静态语义分析通常包括声明和类型的匹配,类型的转换等。这个阶段会报告错误的语法信息。

2.3--汇编

汇编器是将汇编代码转变成机器可执行的指令(2进制的指令),每⼀个汇编语句几乎都对应⼀条机器指令。就是根据汇编指令和机器指令的对照表一一的进行翻译,也不做指令优化。
汇编的命令如下:
1.    gcc  -c  test.s  -o  test.o

2.4--链接 

  • 链接是⼀个复杂的过程,链接的时候需要把⼀堆文件链接在⼀起才生成可执行程序。
  • 链接过程主要包括:地址和空间分配,符号决议和重定位等这些步骤。
  • 链接解决的是⼀个项目中多文件、多模块之间互相调用的问题。
比如:
在⼀个C的项目中有2个.c文件( test.c add.c ),代码和图示如下:
test.c:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>//声明外部符号的
extern int g_val;
extern int Add(int, int);int main()
{int a = 10;int b = 20;int c = Add(a, b);printf("c = %d\n", c);printf("g_val = %d\n", g_val);return 0;
}

add.c:

#define _CRT_SECURE_NO_WARNINGSint g_val = 2025;//全局变量
int Add(int x, int y) //函数
{return x + y;
}

运行结果:

编译过程图示解析: 

我们来思考两个问题:

  1. 我们能不能把add.c里的代码全部注释掉?
  2. 我们能不能只吧add.c里的Add改成ADD或者add?

答案是都不可以,无论是上述那种情况,最后都会发生编译错误


三.运行环境 

  1. 程序必须载入内存中。在有操作系统的环境中:⼀般这个由操作系统完成。在独立的环境中,程序 的载⼊必须由手工安排,也可能是通过可执行代码置入只读内存来完成。
  2. 程序的执行开始。接着便调用main函数。
  3. 开始执行程序代码。这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回 地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程 ⼀直保留他们的值。
  4. 终止程序。正常终止main函数;也有可能是意外终止。

往期回顾:

【通关文件操作(上)】--文件的意义和概念,二进制文件和文本文件,文件的打开和关闭,文件的顺序读写

【通关文件操作(下)】--文件的顺序读写(续),sprintf和sscanf函数,文件的随机读写,文件缓冲区,更新文件

结语:本篇文章就到此结束了,继前面一篇文章后,在此篇文章中给大家分享了编译与链接中的翻译环境和运行环境,预处理,编译,汇编,链接等知识点,后续会继续分享预处理的详解,如果文章对你有帮助的话,欢迎评论,点赞,收藏加关注,感谢大家的支持。


http://www.hkcw.cn/article/fvdrCVmfJe.shtml

相关文章

matlab实现VMD去噪、SVD去噪,源代码详解

为了更好的利用MATLAB自带的vmd、svd函数&#xff0c;本期作者将详细讲解一下MATLAB自带的这两个分解函数如何使用&#xff0c;以及如何画漂亮的模态分解图。 VMD函数用法详解 首先给出官方vmd函数的调用格式。 [imf,residual,info] vmd(x) 函数的输入&#xff1a; 这里的x是待…

深入理解复数加法与乘法:MATLAB演示

在学习复数的过程中&#xff0c;复数加法与乘法是两个非常基础且重要的概念。复数的加法和乘法操作与我们常见的实数运算有所不同&#xff0c;它们不仅涉及到数值的大小&#xff0c;还有方向和相位的变化。在这篇博客中&#xff0c;我们将通过MATLAB演示来帮助大家更好地理解复…

html+css+js趣味小游戏~Treasure Arena多人竞技(附源码)

下面是一个简单的记忆卡片配对游戏的完整代码&#xff0c;使用HTML、CSS和JavaScript实现&#xff1a; html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"wid…

Linux之文件进程间通信信号

Linux之文件&进程间通信&信号 文件文件描述符文件操作重定向缓冲区一切皆文件的理解文件系统磁盘物理结构&块文件系统结构 软硬链接 进程间通信匿名管道命名管道system V共享内存 信号 文件 首先&#xff0c;Linux下一切皆文件。对于大量的文件&#xff0c;自然要…

笔试强训:Day6

一、小红的口罩&#xff08;贪心优先级队列&#xff09; 登录—专业IT笔试面试备考平台_牛客网 #include<iostream> #include<queue> #include<vector> using namespace std; int n,k; int main(){//用一个小根堆 每次使用不舒适度最小的cin>>n>&…

国密SSL证书和国产SSL证书有什么区别

国密SSL证书和国产SSL证书在定义、算法标准、安全性能、兼容性、应用场景及自主可控性等方面存在显著区别&#xff0c;具体分析如下&#xff1a; 定义与背景 国密SSL证书 采用中国自主研发的密码算法&#xff08;如SM2、SM3、SM4&#xff09;&#xff0c;符合国家密码管理局发…

OramaCore 是您 AI 项目、答案引擎、副驾驶和搜索所需的 AI 运行时。它包括一个成熟的全文搜索引擎、矢量数据库、LLM界面和更多实用程序

一、软件介绍 文末提供程序和源码下载 OramaCore 是您的项目、答案引擎、副驾驶和搜索所需的 AI 运行时。 它包括一个成熟的全文搜索引擎、矢量数据库、LLM具有行动计划和推理功能的接口、用于根据数据编写和运行您自己的自定义代理的 JavaScript 运行时&#xff0c;以及更多…

实验设计与分析(第6版,Montgomery)第5章析因设计引导5.7节思考题5.14 R语言解题

本文是实验设计与分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅珏生译) 第5章析因设计引导5.7节思考题5.14 R语言解题。主要涉及方差分析&#xff0c;正态假设检验&#xff0c;残差分析&#xff0c;交互作用图。 dataframe<-data.frame( strengthc(9.60,9.…

Maven---配置本地仓库

目录 5. 5.1在Maven路径下新建文件夹用于本地仓库存储 5.2 复制本地仓库路径 5.3 找到配置文件路径&#xff0c;使用VSCode方式打开 5.4 新增一行代码 5.5 复制本地仓库路径&#xff0c;设置存储路径 5.1在Maven路径下新建文件夹用于本地仓库存储 5.2 复制本地仓库路径 5…

Docker环境构建:MySQL 双主四从集群

Java系列文章 文章目录 Java系列文章前言一、环境准备与Docker配置1.1 环境配置1.2 目录结构1.3 读写分离1.3.1 读写分离方案1.3.2 自定义Docker网络 二、双主四从节点配置2.1 创建MySQL_1节点2.1.1 Mysql_1容器2.1.2 Navicat创建连接2.1.3 创建配置账户 2.2 创建MySQL_2节点2.…

低频 500kHz vs 高频 1MHz,FP6291C与FP6291升压芯片应用在不同场景该怎么选择?

FP6291C 与 FP6291 均为电流模式升压型 DC-DC 转换器&#xff0c;内置功率 MOSFET 和内部补偿网络。这一特性极大简化了外部电路设计&#xff0c;不仅降低了 PCB 空间占用&#xff0c;还能有效控制成本。两者均支持软启动功能&#xff0c;可显著减少浪涌电流&#xff0c;提升系…

leetcode题解513:找树左下角的值(递归中的回溯处理)!

一、题目内容&#xff1a; 题目要求找到一个二叉树的最底层最左边节点的值。具体来说&#xff0c;我们需要从根节点开始遍历二叉 树&#xff0c;找到最深的那层中的最左边的节点&#xff0c;并返回该节点的值。因为要先找到最底层左侧的值&#xff0c;所以我们选择遍历顺序一定…

React项目在ios和安卓端要做一个渐变色背景,用css不支持,可使用react-native-linear-gradient

以上有个模块是灰色逐渐到白的背景色过渡 如果是css&#xff0c;以下代码就直接搞定 background: linear-gradient(180deg, #F6F6F6 0%, #FFF 100%);但是在RN中不支持这种写法&#xff0c;那应该写呢&#xff1f; 1.引入react-native-linear-gradient插件&#xff0c;我使用的是…

Nginx进阶篇(Nginx静态资源概述、Nginx静态资源配置指令、Nginx静态资源优化配置、Nginx静态资源压缩)

文章目录 1. Nginx静态资源概述2. Nginx静态资源配置指令2.1 listen指令2.2 server_name指令2.2.1 精确匹配2.2.2 补充知识&#xff1a;hosts文件2.2.3 通配符匹配2.2.4 正则表达式匹配2.2.5 匹配的执行顺序 2.3 location指令2.3.1 uri以指定模式开始&#xff08;/&#xff09;…

SAP 生产订单收货数量超额报错问题研究

工单收货接口报错有点奇怪&#xff0c;明明是生产订单收货&#xff0c;报错消息中却一直说采购订单收货。 其实之前有发现&#xff0c;只是知道原因&#xff08;收货数量超过工单总数量&#xff09;&#xff0c;没太关注描述问题&#xff0c;这次好好研究下。 首先检查消息号&…

【连接器专题】SD卡座规格书审查需要审哪些方面?

在审查SD卡座规格书时,我们需要考虑哪些方面? 首先在拿到一份SD卡座的详细规格书时,一般供应商给到的规格书中包括了一些基础信息、产品图纸信息、技术参数信息,同时有些供应商会给出产品可靠性测试报告。因此我们会从这几个要素去看规格书。 基础信息 基础信息一般会给变更…

sward V1.1.4版本发布,支持文档审批及文档导出

sward是一款国产开源企业级知识管理工具&#xff0c;包含知识库管理、文档管理、文档协作、文档分享等模块&#xff0c;支持普通文档、markdown等格式&#xff0c;产品简洁易用、开源免费。本周sward发布V1.1.4版本&#xff0c;增加了文档审批和文档导出为word的功能&#xff0…

谷云科技发布业内首份 Oracle OSB 迁移到 iPaaS 技术白皮书

随着企业数字化转型的加速推进&#xff0c;从传统企业服务总线ESB向现代化集成平台iPaaS迁移已成为行业发展的必然趋势。Oracle Service Bus&#xff08;OSB&#xff09;在ESB产品市场中长期以来一直占据着较高的市场份额。然而&#xff0c;许多用户由于担心技术迁移的复杂性和…

特伦斯 S75 电钢琴:重塑音乐感知,臻享艺术之境

在音乐文化蓬勃发展的当下&#xff0c;电钢琴已成为音乐爱好者探索旋律世界的热门之选。在这方充满无限可能的音乐领域&#xff0c;特伦斯 S75 电钢琴以其超凡的设计与卓越的性能&#xff0c;打破传统电钢琴的局限&#xff0c;为用户带来无与伦比的音乐体验&#xff0c;宛如一颗…

立控信息智能装备柜:科技赋能军队装备管理现代化

在军事装备管理领域&#xff0c;高效、安全、智能化的存储解决方案至关重要。传统的人工管理模式不仅效率低下&#xff0c;还容易因人为疏忽导致装备丢失或管理混乱。​LKONE智能装备柜凭借先进的物联网技术、生物识别安全系统和智能管理功能&#xff0c;为军队提供了一套高效、…