程序翻译过程详解

news2024/12/27 13:35:10

一、快速认识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.coloradmin.cn/o/1388915.html

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

相关文章

004 Golang-channel-practice 左右括号匹配

第四题 左右括号打印 一个协程负责打印“(”,一个协程负责打印“)”,左右括号的数量要匹配。在这道题目里,我在main函数里进行了一个死循环。会产生一个随机数,随机数就是接下来要打印的左括号的数量。 例…

运筹说 第46期 | 目标规划-数学模型

经过前几期的学习,想必大家已经对线性规划问题有了详细的了解,但线性规划作为一种决策工具,在解决实际问题时,存在着一定的局限性:(1)线性规划只能处理一个目标,而现实问题往往存在多个目标;(2)…

聊聊如何实现动态加载spring拦截器

前言 之前写过一篇文章聊聊如何实现热插拔AOP,今天我们继续整一个类似的话题&#xff0c;聊聊如何实现spring拦截器的动态加载 实现核心思路 groovy热加载java 事件监听变更拦截器 实现步骤 1、在项目的pom引入groovy GAV <dependency><groupId>org.codehaus.…

C++ 设计模式之桥接模式

【声明】本题目来源于卡码网&#xff08;题目页面 (kamacoder.com)&#xff09; 【提示&#xff1a;如果不想看文字介绍&#xff0c;可以直接跳转到C编码部分】 【简介】什么是桥接模式 桥接模式&#xff08;Bridge Pattern&#xff09;是⼀种结构型设计模式&#xff0c;它的U…

【技术分享】远程透传网关-单网口快速实现三菱 Q03UDV PLC程序远程上下载

准备工作 一台可联网操作的电脑一台单网口的远程透传网关及博达远程透传配置工具网线一条&#xff0c;用于实现网络连接和连接PLC一台三菱 FX5U PLC及其编程软件一张4G卡或WIFI天线实现通讯(使用4G联网则插入4G SIM卡&#xff0c;WIFI联网则将WIFI天线插入USB口&#xff09; …

在校大学生可以考哪些 ?(38个考证时间表)

这是整理的在校大学生可以考的&#xff0c;有的对报名条件没有要求&#xff0c;有的是高中以上学历&#xff0c;还有一些应届生可以报考的。可以在支付宝搜索【亿鸣证件照】或者微信搜索【随时照】制作这些考证要求的证件照哦 1、教师资格证 2、英语四六级 3、计算机二级 4、普…

adb wifi 远程调试 安卓手机 命令

使用adb wifi 模式调试需要满足以下前提条件&#xff1a; 手机 和 PC 需要在同一局域网下。手机需要开启开发者模式&#xff0c;然后打开 USB 调试模式。 具体操作步骤如下&#xff1a; 将安卓手机通过 USB 线连接到 PC。&#xff08;连接的时候&#xff0c;会弹出请求&#x…

2. goLand安装及外配置参数通用用法

目录 概述测试代码解决外配置参数结束 概述 选择版本安装 go 安装的版本 1.go安装及相关配置 goLand 对于 习惯 idea 系列使用的人&#xff0c;还是很友好的。 测试代码 package mainimport ("flag""fmt""os" )func main() {name : flag.St…

layabox_2d游戏A*寻路实践

使用工具 Red Blob Games 效果 项目地址 LayaAStar2D: Laya2.0引擎2D游戏使用AStar实践。

加速 Android Studio 依赖项下载

在某些网络环境中&#xff0c;访问互联网可能受到限制&#xff0c;在Android Studio中&#xff0c;项目构建时可能需要下载依赖项&#xff0c;如果网络受到限制&#xff0c;就无法下载或下载速度非常慢只有十几 kb/s &#xff0c;设置可以帮助解决下载问题。 进入设置页面找到…

【杂七杂八】GyP-DataLoader

前言&#xff1a; pytorch :2.0.0cuda 11.8Jupyter Notebook:7.0.6所以 PyG不需要安装依赖包&#xff0c;直接cuda/pip install ; Jupyter Notebook 有扩展管理器&#xff0c;不需要也装不了 很多教程里的扩展管理插件 &#x1f601; 1 基本数据结构 torch_geometric.data.Data…

Spring AOP 源码分析

【阅读前提】&#xff1a; 需了解AOP注解开发流程&#xff1a;链接 一、注解 EnableAspectJAutoProxy 在配置类中添加注解EnableAspectJAutoProxy&#xff0c;便开启了AOP&#xff08;面向切面编程&#xff09; 功能。此注解也是了解AOP源码的入口。 EnableAspectJAutoProxy…

蓝桥杯备赛 | 洛谷做题打卡day2

​ 蓝桥杯备赛 | 洛谷做题打卡day2 嵌套循环yyds&#xff01;&#xff01; 题目来源&#xff1a;洛谷P2670 [NOIP2015 普及组] 扫雷游戏 题目背景 NOIP2015 普及组 T2 题目描述 扫雷游戏是一款十分经典的单机小游戏。在 n n n 行 m m m 列的雷区中有一些格子含有地雷&am…

❤ Uniapp使用二 ( 日常使用篇)

❤ Uniapp使用二 ( 日常使用篇) 一、表单 1、基础表单验证 form <form submit"formSubmit" reset"formReset"> <view class"uni-form-item uni-column"><view class"title">请选择类型{{selectvalue}}</view&…

海思SD3403,SS928/926,hi3519dv500,hi3516dv500移植yolov7,yolov8(9)

上一节yolov8的训练已经完成了,现在要开始做模型的转换了,这里和yolov7方式相似,但是有一些差异,尤其是yolov7的不带NMS部分的输出顺序和yolov8的输出顺序与格式是有差异的。 首先还是要自己手动加入rpn_op,这里包含了filter,sort,nms部分。 我们一个一个看,首先filter.py…

深度学习基础知识整理

自动编码器 Auto-encoders是一种人工神经网络&#xff0c;用于学习未标记数据的有效编码。它由两个部分组成&#xff1a;编码器和解码器。编码器将输入数据转换为一种更紧凑的表示形式&#xff0c;而解码器则将该表示形式转换回原始数据。这种方法可以用于降维&#xff0c;去噪…

高级分布式系统-第15讲 分布式机器学习--分布式机器学习算法

高级分布式系统汇总&#xff1a;高级分布式系统目录汇总-CSDN博客 分布式机器学习算法 按照通信步调&#xff0c;大致可以分为同步算法和异步算法两大类。 同步算法下&#xff0c;通信过程中有一个显式的全局同步状态&#xff0c;称之为同步屏障。当工作节点运行到同步屏障 …

MySQL索引创建原则和失效问题

一.索引创建原则 数据量较大,且查询比较频繁的表常作为查询条件、分组、排序的字段字段内容区分度高内容较长,使用前缀索引尽量创建联合索引要控制索引的数量如果索引列不能存储NULL值,请在创建表示使用NOT NULL约束它 二.索引失效 违反最左前缀法则范围查询右边的列,不能使用…

可持续技术:2024 年技术趋势的绿色创新

随着我们步入2024年&#xff0c;对可持续技术解决方案的关注从未如此强烈。从可再生能源到环保小工具&#xff0c;科技行业正朝着更环保、更可持续的未来大步迈进。 在快速发展的技术领域&#xff0c;创新是推动我们走向可持续未来的动力。随着我们步入2024年&#xff0c;对可持…

基于Docker Compose单机实现多级缓存架构2024

文章目录 一、环境参考二、专栏简介三、扩展 一、环境参考 NameVersionDocker Desktop for Windows4.23.0Openjdk8MySQL8.2.0Redis7.2Canal1.1.7OpenResty1.21.4.3-3-jammy-amd64Lua-Caffeine- 二、专栏简介 多级缓存实现过程比较长&#xff0c;将拆分为多个文章分步讲述。如…