编译与链接(想了解编译与链接,那么看这一篇就足够了!)

        前言:在我们练习编程的时候,我们只需要将代码写入、运行,就可以得到计算之后的结果了,但是你有没有想过,为什么就可以得到计算之后的结果呢,它的底层又到底是什么呢?


✨✨✨这里是秋刀鱼不做梦的BLOG

✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客

那么废话不多说,我们直接开始讲解,先来看一下讲解内容:

目录

1.翻译环境

        (1)编译

        [ 1 ]预处理阶段

        [ 2 ]编译阶段

        [ 3 ]汇编阶段

        (2)链接

2.运行环境


1.翻译环境

        由于操作系统只能执行机器指令(二进制指令),所以翻译环境阶段要做的就是将写入的代码转化为二进制指令,而翻译环境是由编译和链接两个大的过程组成,编译又可以分解成:预处理、编译、汇编三个过程。

大致如图:

接下来让我们一个一个来讲解:

        

        (1)编译

编译流程大致分为了四个步骤:

        [ 1 ]预处理阶段

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

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

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

        [ 2 ]编译阶段

编译过程就是将预处理后的文件进行一系列从而生成相应的汇编代码文件,编译过程可分为6步:扫描(词法分析)、语法分析、语义分析、源代码优化、代码生成、目标代码优化

1. 词法分析:扫描器将源代的字符序列分割成一系列的记号。

2. 语法分析:语法分析器将记号产生语法树。

3. 语义分析:静态语义(在编译器可以确定的语义),动态语义(只能在运行期才能确定的语义)。

4. 源代码优化:源代码优化器,将整个语法书转化为中间代码(中间代码是与目标机器和运行环境无关的),中间代码使得编译器被分为前端和后端,编译器前端负责产生机器无关的中间代码,编译器后端将中间代码转化为目标机器代码。

5. 目标代码生成:代码生成器。

6. 目标代码优化:目标代码优化器。

        [ 3 ]汇编阶段

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

所以编译阶段大致可以使用以下方式描述:

        (2)链接

链接的简介:

链接(linking)是将各种代码和数据片段收集并组合成为一个单一文件的过程,这个文件可被加载(复制)到内存并执行。链接可以执行于编译时(compile time),也就是在源代码被翻译成机器代码时;也可以执行于加载时(load time),也就是在程序被加载器(loader)加载到内存并执行时;甚至执行于运行时(run time),也就是由应用程序来执行。链接是由叫链接器(linker)的程序自动执行的

        链接过程主要包括:地址和空间分配,符号决议和重定位等这些步骤,其解决的是一个项目中多文件、多模块之间互相调用的问题。

        那么为什么要有链接过程呢:因为编译只是将我们写的代码变成了二进制形式,它还要需要和系统组件(比如标准库、动态链接库等)结合起来,这些组件都是程序运行所必须的。
 

所以链接简而言之就是一个 “封装打包” 的过程,它将所有二进制形式的目标文件和系统组件合成一个可执行文件,当然完成链接的过程也需要一个特殊的软件——链接器。

以上我们就大致了解了程序是如何将源文件转化为可执行程序的了。

2.运行环境

我们知道程序必须载入内存中,在有操作系统的环境中:一般这个由操作系统完成。而在独立的环境中,程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。
 

那么运行的流程是什么样的呢?以下为程序运行的大致流程:

1. 程序的执行时便开始,接着便调用main函数。
2. 开始执行程序代码,这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程一直保留他们的值。
3. 终止程序,正常终止main函数;也有可能是意外终止。

那么这样我们也就大致了解了程序是如何运行的了。


以上就是所有关于编译与链接的全部内容了~~~

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

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

相关文章

气象预测新篇章:Python人工智能的变革力量

Python是功能强大、免费、开源,实现面向对象的编程语言,在数据处理、科学计算、数学建模、数据挖掘和数据可视化方面具备优异的性能,这些优势使得Python在气象、海洋、地理、气候、水文和生态等地学领域的科研和工程项目中得到广泛应用。可以…

数据结构与算法分析2栈、队列

1.栈和队列本质上都是表,所以他们都有两种实现方式,链表实现和数列实现。栈的特点是后进先出。 2.栈的实现 3.应用有: 4.栈的危险操作:用尽栈空间,导致内容占用到别的寄存器里面去了,从而出现异常。还有尾…

武汉星起航:借亚马逊平台优势助力商家精准营销

在全球经济一体化的背景下,跨境电商已成为推动国际贸易发展的重要引擎。作为跨境电商领域的佼佼者,亚马逊平台以其全球化销售渠道和强大的数据分析能力,为商家提供了前所未有的商机。武汉星起航电子商务有限公司深知亚马逊平台的优势&#xf…

企业为什么要用MES管理系统来升级改造生产车间

随着信息技术的迅猛发展,工业制造领域正经历着深刻的变革。在这个大背景下,MES管理系统的引入和应用,已成为企业升级改造生产车间、提升竞争力的关键手段。本文将从多个维度探讨企业为何要用MES管理系统来升级改造生产车间。 MES管理系统能够…

查询优化-提升子查询-UNION类型

瀚高数据库 目录 文档用途 详细信息 文档用途 剖析UNION类型子查询提升的条件和过程 详细信息 注:图片较大,可在浏览器新标签页打开。 SQL: SELECT * FROM score sc, LATERAL(SELECT * FROM student WHERE sno 1 UNION ALL SELECT * FROM student…

云计算——大模型应用发展的“理想支点”

在数字化浪潮中,人工智能技术的突飞猛进为千行百业带来了前所未有的转型机遇。近期出现的Sora模型能够根据文本描述生成高质量的视频内容,为多领域带来大模型技术飞跃的冲击。如何推进大模型应用,已成为各行业面临的重要课题之一。 打造硬核…

亚信安慧AntDB数据库分布式架构剖析之snapshot sender进程

本文主要介绍亚信安慧AntDB数据库的分布式架构下的特有进程之snapshot sender进程的设计,与snapshot receiver进程是一对,也是分布式架构的核心进程之一。 进程简介 与Snapshot Receiver进程相对应,该进程的作用从整体上看也只包含两个方面&a…

Shopee 4月市场趋势及选品分析,shopee虾皮品类爆款预测

废话不多说,马上进入本周Shopee“现象爆品”、“热门爆品趋势”及“热搜词周榜"版块,帮助商家及时了解Shopee最新市场现状,掌握选品趋势。 1 现象爆品 近几来,为健康“买单”,已经成为全年龄层群体的“刚需”。 图…

第P1周:实现mnist手写数字识别

>- **🍨 本文为[🔗365天深度学习训练营](https://mp.weixin.qq.com/s/0dvHCaOoFnW8SCp3JpzKxg) 中的学习记录博客** >- **🍖 原作者:[K同学啊 | 接辅导、项目定制](https://mtyjkh.blog.csdn.net/)** 目录 一、前言 二、我…

青年才俊的聚集地 带你一览DATE 2024会议现场

会议之眼 快讯 第27届欧洲设计、自动化和测试会议(Design, Automation and Test in Europe Conference )已于2024 年 3 月 25 日-27日在西班牙瓦伦西亚圆满举办!DATE第一届会议是在 1998 年在法国巴黎召开的。从那时起,DATE 会议…

ICLR 2024 | FeatUp: A Model-Agnostic Framework for Features at Any Resolution

论文:https://arxiv.org/abs/2403.10516代码:https://github.com/mhamilton723/FeatUp 背景动机 深层特征是计算机视觉研究的基石,捕获图像语义并使社区即使在零或少样本情况下也能解决下游任务。然而,这些特征通常缺乏空间分辨率…

俄罗斯深陷芯片自主困境,良率仅5成 |百能云芯

俄罗斯的芯片产业一直以来都面临着诸多挑战,尤其是在当前的国际形势下,这些挑战更加凸显。随着俄乌冲突的爆发,西方国家对俄罗斯实施了一系列经济制裁,导致俄罗斯科技产业受到了严重影响。据了解,俄国最大的本土芯片厂…

vue3使用vuedraggable实现拖拽(有过渡)

1. 安装与使用 vue中vuedraggable安装: pnpm i -S vuedraggablenext或者 yarn add vuedraggablenext注意:vue2和vue3安装的是不同版本的vuedraggable,写法上也会有一些区别。 比如在vue3中使用拖拽,要以插槽的方式,…

C# 操作 Word 全域查找且替换(含图片对象)

目录 关于全域查找且替换 Word应用样本 SqlServer数据表部分设计样本 范例运行环境 配置Office DCOM 设计实现 组件库引入 实现原理 查找且替换的核心代码 窗格内容 页眉内容 页脚内容 形状内容 小结 关于全域查找且替换 C#全域操作 Word 查找且替换主要包括如下…

GK7205V500国科微 GK7205RNCFV500 GOKE

GK7205V300 芯片是国科针对 IPC 市场推出的新一代支持 H.265 编码的低功耗 IPC SOC 芯片。 该芯片集成专用的 ISP,拥有高效的视频编码处理性能,支持 H.265 编码,满足客户各种差异化业务需求。集 成了 RTC、POR、Audio codec 以及丰富的外设…

大话设计模式之策略模式

策略模式是一种行为设计模式,它允许在运行时选择算法的行为。这种模式定义了一族算法,将每个算法都封装起来,并且使它们之间可以互相替换。 在策略模式中,一个类的行为或其算法可以在运行时改变。这种模式包含以下角色&#xff1…

Elasticsearch:语义搜索即服务处于卓越搜索的中心

作者:来自 Elastic Sherry Ger, Stephen Brown 对于许多企业来说,搜索卓越中心(center of excellence - COE)向其用户提供搜索服务,从不同的数据源中整理知识,并将搜索功能集成到其内部和外部应用程序中。…

Tensorflow2.0笔记 - metrics做损失和准确度信息度量

本笔记主要记录metrics相关的内容,详细内容请参考代码注释,代码本身只使用了Accuracy和Mean。本节的代码基于上篇笔记FashionMnist的代码经过简单修改而来,上篇笔记链接如下: Tensorflow2.0笔记 - FashionMnist数据集训练-CSDN博…

AI 异构计算机设计方案:902-基于6U VPX 高带宽PCIe的GPU AI 异构计算机

基于6U VPX 高带宽PCIe的GPU AI 异构计算机 一、产品概述 基于6U 6槽 VPX 高带宽PCIe的GPU AI 异构计算机以PCIe总线为架构,通过高带宽的PCIe互联,实现主控计算板、GPU AI板卡,FPGA接口板,存储板的PCIe高带宽互联访问&…

揭秘百度百科审核内幕,百科词条审核究竟需要多久?

百度百科作为国内最大的网络百科全书平台之一,致力于提供全面、准确的知识服务,同时也承担着审核百科词条的工作。在互联网时代,人们对信息的需求日益增长,因此百度百科的审核工作显得尤为重要。那么,百度百科词条审核…