计算机的翻译(编译和链接)过程

🎁个人主页:我们的五年

🔍系列专栏:C语言基本概念 

🌷追光的人,终会万丈光芒

🎉欢迎大家点赞👍评论📝收藏⭐文章

 

 

 

目录

🚗1.翻译环境和运行环境:

翻译过程:(编译+链接)

🚗2.预处理(预编译):

🚀注意:

🚗3.编译:

🛰词法分析:

🛰语法分析:

 🛰语义分析:

🚗4. 汇编:

🚗5.链接:

🚗6.运行环境:


 前言:

本次要讲的是计算机的翻译,还有翻译环境和运行环境。

翻译=编译(预处理+编译+汇编)+链接

🚗1.翻译环境和运行环境:

翻译环境:在这个环境中,源代码被转化为可执行的机器指令(二进制指令)。

运行环境:它用于实际执行代码。

翻译过程:(编译+链接)

翻译过程的要点:

1.源代码中会有多个.c文件,那么这些文件都会单独经过编译器,编译处理生成对应的目标文件。

2.在Windows环境下目标文件的后缀为.obj,在Linus环境下目标文件的后缀为.o

3.多个目标文件和链接库一起经过链接器处理生成最终的可执行的程序(后缀为.exe)。

4.链接库是运行时库(它是支持程序运行的基本函数集合)或者第三方库。

🚗2.预处理(预编译):

注:        gcc  -  E  test.c  -  o  test.i      //E表示进行预处理操作,o(ouput)为输出,表示test.c经过预编译以后生成一个test.i文件用于观察文件的变化,但是实际上编译和链接的时候不会生成这样一个  .i  文件,它只是一个中间文件,用完以后就会被销毁,但是我们可以进行操作,把他生成test.i文件以后,就不会被销毁。

●在预处理(预编译)阶段,源文件(.c)和头文件(.h)会被处理成后缀为 .i 的文件。

●在gcc环境下,源文件被处理成.i文件,指令如下:

1.将所以得#define删除,并展开所以得宏定义。(也就是会把所以得宏定义进行替代,就不会存在宏定义了)。

2.处理所以的条件编译指令,如:#if、#ifdef、#elif、#else、#endif。

3.处理#include预编译指令,将包含头文件的内容插到预编译指令的位置。该过程是递归进行的,也就是说头文件中还有可能包含其他头文件。

上面的删除宏定义,处理条件指令,处理#include预编译指令,都是和#相关的,所以上面三条都是把#处理掉。

4.删除所有的注释。

5.增加行号和文件标识,方便后期编译器生成调试信息等。

6.或保留所有的#progma编译器指令,编译器后期会使用。

🚀注意:

经过预处理以后的  .c  文件变成  .i  文件,文件不再包含宏定义,因为宏定义已经被展开。包含的头文件也插到  .i  文件中。所以我们无法确定宏定义和头文件是否包含正确的时候,我们可以查看.i 文件进行判断。

🚗3.编译:

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

gcc环境下的操作过程:

gcc  -  S  test.i  -  o  test.s

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

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

🛰词法分析:

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

上面程序进行词法分析后得到了16个记号: 

 

进行语法分析的时候,可以处理基本的词法是否使用正确,如:左边有括号是不是少了,是不是使用了中文的符号。

🛰语法分析:

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

 🛰语义分析:

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

🚗4. 汇编:

 此过程把.s为后缀的文件变为.o或者.obj的目标文件。

编器是将汇编代码转转变成机器可执行的指令,每⼀个汇编语句几乎都对应⼀条机器指令。就是根据汇编指令和机器指令的对照表⼀⼀的进行翻译,也不做指令优化

gcc -c test.s -o test.o

🚗5.链接:

链接是⼀个复杂的过程,链接的时候需要把⼀堆文件链接在⼀起才生成可执行程序。

链接过程主要包括:地址和空间分配,符号决议和重定位等这些步骤。

链接解决的是⼀个项目中多文件、多模块之间互相调用的问题。

也就是对指令进行优化,保留正确的地址。

🚗6.运行环境:

1. 程序必须载入内存中。在有操作系统的环境中:一般这个由操作系统完成。(电路板中,嵌入式)在独立的环境中,程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。

2. 程序的执行便开始。接着便调用main函数。

3. 开始执行程序代码。这个时候程序将使用⼀个运行时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程⼀直保留他们的值。

4. 终止程序。正常终止main函数;也有可能是意外终止。

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

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

相关文章

【翻译】REST API

自动伸缩 API 创建或更新自动伸缩策略 API 此特性设计用于 Elasticsearch Service、Elastic Cloud Enterprise 和 Kubernetes 上的 Elastic Cloud 的间接使用。不支持直接用户使用。 创建或更新一个自动伸缩策略。 请求 PUT /_autoscaling/policy/<name> {"rol…

【Vue3】openlayers加载瓦片地图并手动标记坐标点

目录 一、创建Vue3项目 二、openlayers加载瓦片地图&#xff08;引js文件版&#xff09; 2.1 将以下的文件复制到public下 2.2 index.html引入ol脚本 2.3 删除项目自带的HelloWorld.vue&#xff0c;创建Map.vue 2.4 编码Map.vue 2.5 修改App.vue 2.6 启动项目测试 三、…

Golang中实现调用Windows API向指定目标发送ARP请求

简介 Go库中很多实现的arp都是支持osx/linux/bsd之类的&#xff0c; 但几乎没有支持windows的&#xff0c; 也试了一些方式&#xff0c; 目前还是选用调用windows的API&#xff0c; 记录一下这一次windows的API的调用经验。 实现 代码 package main/* #cgo CFLAGS: -I. #cgo …

R语言数据探索和分析7-使用随机森林模型对中国GDP及其影响因素分析

一、研究背景和意义 国内生产总值&#xff08;GDP&#xff09;是宏观经济领域中最为关注的经济统计数据之一&#xff0c;它反映了一个国家或地区在一定时期内所创造的所有最终商品和服务的总价值。GDP的增长率不仅仅是一个国家经济健康状况的关键指标&#xff0c;还直接关系到…

Java17 --- SpringCloud之Zipkin链路追踪

目录 一、下载zipkin及运行 二、在父工程中引入pom依赖 三、在子工程8001引入相关pom依赖 3.1、修改yml配置文件 3.2、测试代码 四、在子工程80引入相关pom依赖 4.1、修改yml配置文件 4.2、测试代码 五、测试结果 一、下载zipkin及运行 运行控制台访问地址&#xff1…

Django后台项目开发实战五

完成两个功能&#xff1a; HR 可以维护候选人信息面试官可以录入面试反馈 第五阶段 创建 interview 应用&#xff0c;实现候选人面试评估表的增删改功能&#xff0c;并且按照页面分组来展示不同的内容&#xff0c;如候选人基础信息&#xff0c;一面&#xff0c;二面的面试结…

怎么在Mac上使用美图秀秀软件 macbookpro美图秀秀 苹果 Mac 电脑怎么下载美图秀秀

相信很多小伙伴们都接触过美图秀秀这款作图软件&#xff0c;他为用户提供了美化图片、人像美容、抠图、拼图、贴纸等等非常好用的功能&#xff0c;不过大家知道&#xff0c;有很多的软件都有着固定的适应渠道&#xff0c;例如有些游戏只有苹果产品可以运行&#xff0c;还有一些…

Jetson Orin NX L4T35.5.0平台LT6911芯片 调试记录(2)vi discarding frame问题调试

基于上篇调试记录 Jetson Orin NX L4T35.5.0平台LT6911芯片 调试记录(1)MIPI问题调试-CSDN博客 1.前言 当通过gstreamer持续捕获视频设备时,帧数会下降,并且I输入越高,丢失的帧数越多。 当达到4k30hz时,它完全无法使用,系统会在几秒钟的收集后崩溃并重新启动 4k30hz …

随便聊一下 显控科技 控制屏 通过 RS485 接口 上位机 通讯 说明

系统搭建&#xff1a; 1、自己研发的一个小系统&#xff08;采集信号&#xff0c;将采集的信号数字化&#xff09;通过COM口&#xff0c;连接显控屏 COM3 口采用 485 协议送到显控屏&#xff08;显控科技&#xff09;的显示屏展示出来&#xff09;。 2、显控屏 将 展示的数据…

23.哀家要长脑子了!

目录 1.290. 单词规律 - 力扣&#xff08;LeetCode&#xff09; 2.532. 数组中的 k-diff 数对 - 力扣&#xff08;LeetCode&#xff09; 3.205. 同构字符串 - 力扣&#xff08;LeetCode&#xff09; 4.138. 随机链表的复制 - 力扣&#xff08;LeetCode&#xff09; 5.599. 两…

解决layui的bug 在layui tree 组件中 禁用选中父节点后自动选中子节点功能

最近做权限管理后台&#xff0c;用了layui tree 组件&#xff0c;发现选中了父节点后&#xff0c;自动选中了子节点。不满足现实业务需求。所以微调了下源代码。 在用树形组件中&#xff0c;在用文档中 tree.setChecked(demoId, [2, 3]); //批量勾选 id 为 2、3 的节点 用这句…

VS code 同步odata服务

在做UI5得开发过程中&#xff0c;经常会出现odata需要更新 那么已经加载过得项目如何去跟新odata服务呢 可以通过如下步骤 1.右键打开应用信息 2.找到manage service models 3.点击编辑 4.选中 刷新并保存

Java毕业设计 基于SSM SpringBoot vue宠物领养平台

Java毕业设计 基于SSM SpringBoot vue宠物领养平台 SSM 宠物领养平台 功能介绍 首页 图片轮播 新闻信息 新闻类型 新闻详情 宠物百科 宠物百科类型 宠物百科详情 宠物 宠物类型 宠物详情 立即领养 留言 论坛 发布帖子 登录 个人中心 宠物收藏 宠物领养订单 后台管理 登录注…

YOLO自研模块:多尺度轻量化卷积模块

目录 一、原理 二、代码 三、配置文件 一、原理 不同大小的卷积核,提取目标特征的特征尺度不同,所以通过使用不同大小卷积核的卷积来提取特征就可以保证获取到目标的多尺度特征。 借鉴YOLOv8中,将通道数进行划分的操作,在卷积的输入过程中为了减小参数量,将输入通道数…

spring框架学习记录(1)

前半个月一直在应付期中考试&#xff0c;快被折磨似了orz 文章目录 SpringIoC(Inversion of Control) 控制反转与DI(Dependency Injection)依赖注入bean相关bean配置bean实例化bean的生命周期 依赖注入相关依赖注入方式依赖自动装配 容器创建容器获取bean Spring IoC(Inversi…

ClickHouse高原理与实践

ClickHouse高原理与实践 1 ClickHouse的特性1.1. OLAP1.2. 列式存储1.3. 表引擎1.4. 向量化执行1.5. 分区1.6. 副本与分片1.7 其他特性 2. ClickHouse模块设计2.1 Parser分析器与Interpreter解释器2.2 Storage2.3 Column与Field2.4 DataType2.5 Block2.6 Cluster与Replication …

【云原生】Docker 实践(二):什么是 Docker 的镜像

【Docker 实践】系列共包含以下几篇文章&#xff1a; Docker 实践&#xff08;一&#xff09;&#xff1a;在 Docker 中部署第一个应用Docker 实践&#xff08;二&#xff09;&#xff1a;什么是 Docker 的镜像Docker 实践&#xff08;三&#xff09;&#xff1a;使用 Dockerf…

Vue3-element-plus表格

一、element-plus 1.用组件属性实现跳转路由 <el-menu active-text-color"#ffd04b" background-color"#232323" :default-active"$route.path" //高亮 text-color"#fff"router><el-menu-item index"/article/channe…

活动回顾 | 春起潮涌——硬件驱动的量化交易与AI

4月20日&#xff0c;华锐技术ACLUB联合AMD在上海举办了“春起潮涌——硬件驱动的量化交易与AI”沙龙活动&#xff0c;会议围绕FPGA硬件加速、CPU&网卡调优、AI技术应用等展开&#xff0c;近50位量化IT与分享嘉宾一起探讨硬件技术在量化交易和AI领域的应用和创新。 FPGA在交…

AC自动机

AC自动机 AC自动机有一个很出色的功能&#xff1a;实现多模式匹配。 多模式匹配&#xff1a;模式串有多个&#xff0c;主串只有一个&#xff0c;要进行多次模式串匹配。如果用KMP就要一个一个模式串进行匹配&#xff0c;效率低。AC自动机就可以做到&#xff0c;只要经过一些预…