翻译环境(编译和链接)(简单讲解,理解图就行)

简介: 翻译环境(编译和链接)(简单讲解,理解图就行)

前言

       这是我们学习代码的最重要的一个知识点之一,因为我们要去运行一个代码并不是简单的去直接出结果,而是经过了很多我们看不到的步骤,我们在这里以C语言为例子在Linux的环境下讲解,大家没有学过Linux的不用担心,最后会有一个思维导图,直接看就行。


一、总体步骤

1. 翻译环境:在这个环境中,源代码会被翻译成机器可以读懂的二进制指令

2. 执行环境:实际执行代码

二、翻译环境

翻译环境从整体角度就是执行了下面的事情:


1. 源文件经过编译器生成对应的目标文件


2. 链接库和目标文件通过链接器生成对应的可执行程序


3. 链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它可以搜索程序员个人的程序库,将其需要的函数也链接到程序中。




a0a799149e34443f9447633b59a377be.png

二、具体化的翻译环境

三、解读翻译环境

3.1 预处理阶段

如图所示,预处理主要是处理我们的头文件,注释和预处理指令;

我们可以使用下面的指令来观察现象:

gcc -E test.c > test.i

预处理完成之后就停下来,预处理之后产生的结果都放在test.i文件中。

下面就是操作之后的图:

预处理阶段的test.i
头文件 被展开,展开后又700多行
注释 被删除
预处理指令 被替换

关于预处理指令可以看我的这篇博客:http://t.csdnimg.cn/Cl0OI

3.2 编译阶段

在编译阶段中我们也有相应的指令:

gcc -S test.c

编译完成之后就停下来,结果保存在test.s中。下面就是操作之后的图:

在这一步就是把C代码翻译成汇编指令,可以检查我们的语法,词法和语义。通常的编译错误就是我们的语法,词法或者语义出现了错误;

符号汇总就是将我们的全局变量,函数等汇总到一起。

168de9e227de46408e8d4ef846bab4b8.png

18273dbc097d479aa0c60e19e40d00e1.png

3.3 汇编阶段

在汇编阶段的指令是:

gcc -c test.c

汇编完成之后就停下来,结果保存在test.o中。下面是操作之后的图:

因为在test.o文件里放的都是二进制指令,我们是没办法看懂的,但是里面有一个ELF我们是可以看懂的。

因为在test.o里是按照ELF格式存储的,所以我们输入如下指令可以翻译ELF文件:

readily -a test.o

翻译之后,在汇编这里是 形成了符号表,符号表就是将符号汇总的放在一个表里,如下:

3.4 链接阶段

这个就是在多文件的时候,可以将多文件的符号表给合并到一起,因为我们每个.c文件都会经过编译,所以在最后链接到时候,链接就像一捆绳子,将很多个.c文件整合在一起。


合并段表:将多文件合并


合并符号表:合并多文件里的函数的定义和声明,各个符号表放在一起。


在这里的错误通常是链接失败,原因就是你在多文件中,某个函数没有定义,符号表里没有这个函数

四、执行

执行没啥说的,编译链接通过了,执行就没啥讲的了;

给大家一个指令来执行c语言的文件吧

//编译
gcc test.c
//编译通过生成a.out文件,再执行
./a,out


相关文章
|
索引 Python
Pandas 高级教程——高级时间序列分析
Pandas 高级教程——高级时间序列分析
605 4
|
9月前
|
机器学习/深度学习
过程奖励模型PRM成版本答案!谷歌DeepMind全自动标注逐步骤奖励PAV,准确率提升8%
研究团队提出了一种新的过程奖励模型(PRM),通过衡量每一步骤的进展来改进大型语言模型(LLM)的推理能力。与仅在最后提供反馈的结果奖励模型(ORM)不同,PRM能在多步骤推理中逐步提供反馈,从而改善信用分配。研究引入了过程优势验证者(PAV),用于预测证明策略下的进展,显著提升了测试时间搜索和在线强化学习(RL)的效率与准确性。实验表明,PAV相比ORM提高了8%以上的准确性和5至6倍的样本效率。该方法在Gemma2模型上得到了验证,并展示了在解决复杂问题上的潜力。尽管成果显著,但仍需进一步研究以优化证明策略的设计和减少拟合误差。
338 97
|
11月前
|
人工智能 自然语言处理 IDE
💡通义灵码:让每个人都能成为软件开发的「超级个体」
作为阿里巴巴达摩院推出的先进大模型技术,通义灵码不仅具备强大的自然语言理解和生成能力,更支持多种编程语言和框架,能够广泛适用于不同的开发场景。这意味着,开发者可以借助通义灵码,通过自然语言进行代码生成、自动化测试、文档编写等,甚至还可以根据需求生成完整的项目结构和业务逻辑。
676 9
💡通义灵码:让每个人都能成为软件开发的「超级个体」
|
XML Java 数据格式
Spring5入门到实战------2、IOC容器底层原理
这篇文章深入探讨了Spring5框架中的IOC容器,包括IOC的概念、底层原理、以及BeanFactory接口和ApplicationContext接口的介绍。文章通过图解和实例代码,解释了IOC如何通过工厂模式和反射机制实现对象的创建和管理,以及如何降低代码耦合度,提高开发效率。
Spring5入门到实战------2、IOC容器底层原理
探索Python中的列表推导式
【9月更文挑战第30天】在编程的世界里,简洁和高效总是我们追求的目标。Python的列表推导式正是这样一把利器,它允许我们在一行代码中生成列表,既清晰又高效。本文将深入浅出地介绍列表推导式的基础知识、高级技巧以及如何避免常见的陷阱,让你的代码更加优雅。
|
Java 测试技术 程序员
Maven(二)
Maven(二)
137 0
|
算法 调度
基于CCG算法的IEEE33配电网两阶段鲁棒优化调度matlab
基于CCG算法的IEEE33配电网两阶段鲁棒优化调度matlab
解决pip install安装速度慢的问题
我们在编程过程中,会经常遇到要下载包的问题,而下载包常用的就是pip命令,但是很多情况下直接下载速度比较慢,我们可以使用镜像进行加持
|
Java
Java基础知识: 解释一下面向对象编程(OOP)的概念。
Java基础知识: 解释一下面向对象编程(OOP)的概念。
210 0
避免在索引列上使用内置函数
避免在索引列上使用内置函数