程序翻译过程详解

一、快速认识gcc和g++

        gcc和g++都是编译器,C语言可以用gcc或者是g++来进行编译,但推荐使用gcc来进行编译。但C++语言只能用g++编译器来进行编译。

1.1语言和编译器的自举的过程

        为了更好地认识gcc和g++,在这里可以给大家介绍一下语言和编译器的自举的过程。在早期计算机刚产生的时候其实是只有二进制代码的,也只有用二进制代码写的编译器,直到后来有了汇编语言的诞生。但是汇编语言产生之初是没有可以编译汇编语言的编译器的,那怎么办呢?人们只好先用二进制语言写一个汇编编译器,这样才可以编译汇编代码。汇编代码可以在用二进制语言写的汇编编译器上运行以后,也就意味着人们可以使用汇编代码写程序进而写软件了,这时用汇编代码写的汇编编译器(编译器同样是一款软件)也就应运而生了。同样的道理,C语言刚产生的时候,同样没有用C语言写的C语言编译器,只有用汇编语言写的C语言编译器,后来才可以用C语言来写C语言编译器。从此以后,C语言就可以用C语言来编译了,这就叫语言的自举过程。

1.2语言的翻译过程

        从上面语言的自举过程我们可以看到,语言的翻译过程是分阶段的。也就是说,假设要将C语言翻译成二进制语言,绝不是一步到位地直接将C语言直接翻译成二进制语言,一定是先将C语言翻译成汇编语言,再将汇编语言翻译成二进制语言。因为将C语言翻译成汇编语言,将汇编语言翻译成二进制语言这两个工作在语言的发展过程中前人所写过的编译器已经可以实现这两个功能,所以说语言的翻译过程一定是分阶段的,所以也就有了预处理,编译,汇编,链接这几个步骤。

二、程序的翻译过程

1、预处理

1.1头文件展开

所谓的头文件展开,其实在预处理阶段的时候,将头文件的内容拷贝至源文件当中。

1.2去注释

1.3宏替换

1.4条件编译

ifdef,elif,endif

-D选项可以动态地给代码增加条件,实现条件编译

预处理完C语言程序还是C语言程序。

gcc -E C文件名 -o 所形成的文件的文件名,-E的意思就是从现在开始程序的翻译过程,当预处理阶段做完的时候就停下来。

2、编译

-S的意思就是从现在开始程序的翻译过程,当编译阶段做完的时候就停下来。编译完形成的文件就是汇编代码了。

3、汇编

-c的意思就是从现在开始程序的翻译过程,当汇编阶段做完的时候就停下来。汇编过程形成的.o文件叫可重定位二进制文件,这个二进制文件是不能执行的,需要经过链接过程才能形成可执行程序。

4、链接

链接就是可以形成可执行程序。我们需要知道的是,平台要支持开发,就必须提前在系统中安装好语言的头文件和库文件, 链接的实质就是将我们自己写的程序所形成的.o文件同系统提供的静态库或动态库中的.o文件链接起来形成可执行程序

三、动静态库的理解

动静态库其实就是一系列.o文件。

动态库:.so,用于动态链接

静态库:.a,用于静态链接

        静态链接:将自己需要的代码直接拷贝到自己的可执行程序中。所以说,允许你进行拷贝的库就叫做静态库,拷贝完以后我的可执行程序就不需要再依赖于库了。静态库的优点就是不需要再依赖于库,程序在同类型平台中都可以直接运行使用。缺点也是比较明显的,就是可执行程序的体积会比较大,比较占据资源(磁盘资源,网络资源,内存资源)。

        动态链接:允许你进行链接的库就叫做动态库。可执行程序依据编译器所给出的动态库的地址去动态库中找到相应的方法进行链接,这个过程就叫做库调用。找到以后进行函数返回,链接完成后可执行程序就可以运行了。动态库的优点就是比较节省资源,不同的程序中不会出现过多重复的代码。缺点就是一旦库丢失,所有依赖于该库的程序就都不能运行了。

        gcc -o 所形成的文件的文件名   C文件名这条指令默认是使用静态链接的,如果想使用静态链接形成可执行程序,要使用gcc -o 所形成的文件的文件名   C文件名 -static这条指令。动态链接是gcc的默认行为,

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

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

相关文章

盘点那些好用的知识库软件,赶紧收藏起来

知识库软件,这个听起来有些书呆子味道的工具,实际上在企业运营中起着至关重要的作用。它就像公司的大脑,储存着我们的知识,并在我们需要时随时供应。下面,我要向你推荐五款好用的知识库软件,让你的信息管理…

开启C++之旅(下):引用、内联函数及现代特性(auto和范围for循环)

上次介绍了:开启C之旅(上):探索命名空间与函数特性(缺省参数和函数重载) 今天就接着进行c入门的知识讲解 文章目录 1.引用1.1引用概念1.2引用特性1.3常引用其他情况 1.4引用使用场景1.4.1做参数1.4.2做返回…

.net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别

//全局过滤器 builder.Services.AddMvc(m > { m.Filters.Add<AllResultFilter>(); }); 1、实现过滤器 public class AllResultFilter : IResultFilter {/// <summary>/// 结果执行后方法/// 不可更改结果/// </summary>/// <param name"con…

vue下载文件流效果demo(整理)

在 Vue 项目中&#xff0c;你可以使用 FileSaver.js 库来方便地下载文件流。FileSaver.js 封装了不同浏览器的下载方式&#xff0c;使得下载文件更加简单和兼容。以下是一个完整的示例方法&#xff1a; 首先&#xff0c;安装 FileSaver.js 库&#xff1a; <template>&l…

使用Go语言的HTTP客户端和服务器

使用Go语言进行HTTP客户端和服务器开发是一种高效且强大的方式。Go语言的标准库提供了对HTTP协议的全面支持&#xff0c;使得创建HTTP客户端和服务器变得简单。 首先&#xff0c;让我们来看一下如何创建一个简单的HTTP服务器。在Go中&#xff0c;可以使用net/http包来创建HTTP…

墙地砖外形检测的技术方案-图像分割

基础原理 由于对碗口进行缺口检测&#xff0c;因此只需要碗口的边界信息。得到陶瓷碗区域填充后的图像&#xff0c;对图像进行边缘检测。这是属于图像分割中的内容&#xff0c;在图像的边缘中&#xff0c;可以利用导数算子对数字图像求差分&#xff0c;将边缘提取出来。 案例…

Odrive 学习系列三:在odrive工程中添加SEGGER RTT 日志输出功能

一、背景: 对于嵌入式来讲,有个日志输出真真真真的太重要啦! SEGGER JLink自带的RTT日志输出对于老嵌入式而言更是开发利器。 Odrive本身的工程是不带这个功能的,尽管使用stlink可以查阅寄存器等,但感觉还是差了点意思。因此在本系列第二节的基础上,希望能给Odrive工程添…

蓝桥杯AcWing学习笔记 9-2复杂DP的学习(下)

蓝桥杯 我的AcWing 题目及图片来自蓝桥杯C AB组辅导课 复杂DP&#xff08;下&#xff09; 非传统DP问题思考方式&#xff0c;全新的DP思考方式&#xff1a;从集合角度来分析DP问题——闫式DP分析法 例题 AcWing 1303. 斐波那契前 n 项和 矩阵乘法快速幂 此题并非dp问题…

《 乱弹篇(三)》

题记 前两篇《乱弹》&#xff0c;一是乱弹了“北宋名相寇准的《六悔铭》”&#xff0c;并议及“不择手段&#xff0c;只谋功利”&#xff1b;二是乱弹了晚清重臣、湘军统帅曾国藩的为官之道和处世哲学&#xff0c;并介绍了他在《冰鉴》一书里用来识人的对联和口诀。 这两篇《…

网络安全自学入门:(超详细)从入门到精通学习路线规划,学完即可就业

很多人上来就说想学习黑客&#xff0c;但是连方向都没搞清楚就开始学习&#xff0c;最终也只是会无疾而终&#xff01;黑客是一个大的概念&#xff0c;里面包含了许多方向&#xff0c;不同的方向需要学习的内容也不一样。 算上从学校开始学习&#xff0c;已经在网安这条路上走…

第08章_面向对象编程(高级)拓展练习(关键字:static,代码块,关键字:final,抽象类和抽象方法,接口,内部类,枚举类,注解,包装类)

文章目录 第08章_面向对象编程&#xff08;高级&#xff09;拓展练习01-关键字&#xff1a;static1、银行账户类2、图形类3、数组工具类4、二分查找5、二分查找6、素数7、阅读代码&#xff0c;分析运行结果8、阅读代码&#xff0c;分析运行结果 02-代码块9、阅读代码&#xff0…

【嘉立创EDA-PCB设计指南】1.PCB基本概念及原理图绘制

前言&#xff1a;本文详解PCB基本概念以及实现MCU最小系统原理图的绘制&#xff08;原理图包括MCU芯片GD32F103C8T6、外部晶振、输出端口、USB输入口、5v转3v3稳压输出、复位按键、唤醒按键、LED&#xff09;。为本专栏后面章节实现PCB绘制做准备。 最终绘制的原理图如下所示&…

鸿蒙开发-UI-布局-层叠布局

鸿蒙开发-UI-布局 鸿蒙开发-UI-布局-线性布局 文章目录 前言 一、基本概念 二、对齐方式 三、Z序控制 四、使用场景 总结 前言 上文详细学习了线性布局&#xff0c;学习了线性容器内子元素在主轴以及交叉轴上的排列方式&#xff0c;子元素自适应相关的知识点&#xff0c;本文继…

强化学习(二)多臂老虎机 “Multi-armed Bandits”——2

1、增量算法估计动作价值 由之前的内容可知&#xff0c;某一个动作被选择 n − 1 n-1 n−1 次后&#xff0c;该动作的价值估计值为 Q n ≐ R 1 R 2 ⋯ R n − 1 n − 1 Q_n\doteq\dfrac{R_1R_2\cdotsR_{n-1}}{n-1} Qn​≐n−1R1​R2​⋯Rn−1​​ 很明显&#xff0c;随着…

小规模团队更适合什么样的客户管理系统?

小规模团队更适合什么样的客户管理系统&#xff1f; 一般情况下&#xff0c;小规模对客户管理系统的需求通常有以下特点&#xff1a; 团队规模&#xff1a;小规模&#xff0c;不超过10人——尽可能降低使用成本使用人员&#xff1a;销售人员使用——无代码基础&#xff0c;最…

学习JavaEE的日子 day12 构造方法 类的制作

Day12 需求&#xff1a;创建人类的对象&#xff0c;并操作对象 分析&#xff1a; 人类 - Person 属性&#xff1a;name、sex、age 方法&#xff1a;eat、sleep 场景&#xff1a;创建多个对象&#xff0c;去操作对象 //测试类&#xff1a;该类中有main方法&#xff0c;测试我们写…

Mybatis配置动态数据源以及参数传递等

Mybatis必知必会 一、Mybatis动态加载数据源 在配置数据源连接时,在企业的真实开发中数据源一般都会写在配置文件中&#xff0c;而不会直接写在mybatis的核心配置文件中 所以,Mybatis为了方便开发人员去动态的获取数据源连接制定了一些特定的标签用于加载这些数据源。 具体做法…

【leetcode刷题】模拟专题

模拟 一、替换所有的问号1、题目链接2、解析3、代码 二、提莫攻击1、题目链接2、解析3、代码 三、Z字形变换1、题目链接2、解析3、代码 四、外观数列1、题目链接2、解析3、代码 五、数青蛙1、题目链接2、解析3、代码 一、替换所有的问号 1、题目链接 leetcode链接 2、解析 3、…

2024年人才缺口大,学网络安全找不到工作?原因竟然在这!

为什么网络安全人才缺口那么大&#xff0c;但很多人还是找不到工作&#xff1f;其实大家都忽略了1个重点&#xff0c;那就是不清楚企业在招什么样的人。 我花了2天的时间统计了主流招聘网站的岗位信息&#xff0c;发现了一个惊人的真相&#xff0c;那就是企业都喜欢招这3种人&…

深度学习笔记(四)——使用TF2构建基础网络的常用函数+简单ML分类实现

文中程序以Tensorflow-2.6.0为例 部分概念包含笔者个人理解&#xff0c;如有遗漏或错误&#xff0c;欢迎评论或私信指正。 截图和程序部分引用自北京大学机器学习公开课 TF2基础常用函数 1、张量处理类 强制数据类型转换&#xff1a; a1 tf.constant([1,2,3], dtypetf.floa…