GCC编译过程,了解编译原理

2023-10-26

说明:这篇文件是在读《程序员的自我修养——链接、装载与库》的一点笔记,权当时学习的记录。

1、GCC编译过程分解

以HelloWorld程序为例

2、预编译

规则:

命令:gcc -E XXX.c -o XXX.i

 

3、编译

词法分析、语法分析、语义分析及优化 --------------->> 汇编代码文件

命令:gcc -S XXX.c -o XXX.s

3.1 编译过程

6步:扫描、语法分析、语义分析、源代码优化、代码生成和目标代码优化。

1、词法分析

源代码程序进入扫描器(scanner),将源代码的字符序列分割成一系列的记号(Token)。并将记号进行分类,如符号表(存放标识符)和文字表(存放数字、字符串常量)等。

2、语法分析

语法分析器(Grammer Parser)对记号(Token)进行语法分析,并生成语法树(Syntax Tree)。

如,array[index] = (index + 4) * (2 + 6) 生成的语法树图。

3、语义分析

语义分析器完成对表达式的语法层面的分析。它不知道语句真正含义,是对静态语义的分析。所谓静态语义,是编译期可确定的语义,包括声明、类型匹配和类型转换。对应的动态语义,则是运行期确定的语义。

语义分析结果,在语法树上标识类型。

4、中间语言生成

源代码优化器对源代码进行优化。如将编译期可确定的值进行优化。语法树如下:

5、目标代码生成与优化

代码生成器将中间代码转换成目标机器代码,依赖于目标机器。

目标代码优化器对上面生成的目标代码进行优化(如、寻址方式、位移代替乘法、删除多余的指令等)。

总结:编译器可以将一个源代码文件编译成一个未链接的目标文件。

4、汇编

汇编代码 --------------->> 机器指令

命令:as XXX.s -o XXX.o 或者 gcc -c XXX.s -o XXX.o

5、链接

符号(Symbol),表示一个地址。这个地址可以是一段子程序的起始地址,或是一个变量的起始地址。

代码按照功能或者性质划分。如语句块、函数、功能模块。变量的访问需要知道目标变量的地址,函数访问需要知道目标函数的地址,这就是模块划分后面临的模块间的通信问题。链接(Linking)将这些模块完美的拼接和组合起来。如下图所示:

静态链接,把各个模块之间相互引用的部分处理好,使得各模块间能够正确地衔接。包括,地址空间分配、符号决议和重定位等。

是一些常用代码被编译成目标文件后打包存放。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GCC编译过程,了解编译原理 的相关文章

  • linux编译安装kvm、qemu

    kvm作为主流虚拟化产品 其实它的用户层使用的是qemu 所以要安装使用kvm 一般需要安装kvm kmod以及qemu两部分 安装kvm kmod 1 首先下载kvm kmod源码并解压 2 进入源码目录 3 configure kern
  • windows下搭建编译chromium的开发环境

    本篇为windows下搭建编译chromium的方法 mac篇 mac下搭建编译chromium的开发环境 二七 CSDN博客 linux篇 linux 搭建和编译 chromium 环境 二七 CSDN博客 注意 搭建部署chromium
  • 编译实验(三)目标代码生成

    通过词法分析 语法分析 语义分析 最后产生了四元式 而代码生成则是通过四元式来完成 我们先从简单开始做起 编译实验项目下载链接 http download csdn net download supersmart dong 10224159
  • x86 细探:为什么要把迁移到 64 位 linux 称之为 x86 迁移

    一 引言 我们部门最近在把有些项目从原来的 AIX 平台迁移到 Linux 平台上 老大把这个项目自然而然的命名为了 x86 迁移 今天的我仔细思忖着这个名字 突然有些疑惑 x86 不是 32 位的吗 而我们迁移的目标系统是 64 位的 为
  • lib库中允许存在全局变量

    Linux动态库so 静态库a 都是可以允许存在全局变量的 但是全局变量最好加上自己特有的属性 也就是需要注意不能重名 否则很有可能会因为被覆盖然后导致出错
  • 在Windows下编译扩展OpenCV 3.4.2 + opencv_contrib

    请参考 https www cnblogs com jliangqiu2016 p 5597501 html 这里主要说一下注意点 1 编译过程中会提示缺少以下文件 vgg generated 48 i vgg generated 64 i
  • autoscan、aclocal、automake和autoconf区别【转】

    转自 https blog csdn net renhui1112 article details 96480535 autoscan 扫描源代码以搜寻普通的可移植性问题 比如检查编译器 库 头文件等 生成文件configure scan
  • SISD、MIMD、SIMD、MISD计算机的体系结构的Flynn分类法

    1 计算平台介绍 Flynn于1972年提出了计算平台的Flynn分类法 主要根据指令流和数据流来分类 共分为四种类型的计算平台 如下图所示 单指令流单数据流机器 SISD SISD机器是一种传统的串行计算机 它的硬件不支持任何形式的并行计
  • Android ffmpeg4.1 arm64位库裁剪

    ffmpeg4 1 Android arm64位库裁剪移植 目录 ffmpeg4 1 Android arm64位库裁剪移植 1 绪言 2 编译环境 3 源代码下载 4 编写编译脚本 4 1 编译脚本 4 2 常见问题 5 库裁剪 5 1
  • 教妹学Java(五):Java程序在编译和运行时发生了什么

    大家好 我是沉默王二 本篇文章通过我和三妹的对话来谈一谈 Java程序在编译和运行时发生了什么 没见过这么有趣的标题吧 语不惊人死不休 没错 本篇文章的标题就是这么酷炫 接受不了的同学就别点进来看了 所谓好奇心害死猫 能够接受的同学我只能说
  • 计算机原理-结构组成

    cpu 中央处理器 程序控制 操作控制 时间控制 数据处理 运算器 算数逻辑单元ALU 逻辑运行 累加计算器AC 为alu提供工作区 数据缓存寄存器 DR 暂存指令和数据 状态条件寄存器PSW 保存指令条件码 控制器 程序计数器PC 指令计
  • 用三元操作符替代if-else以降低CPU分支预测惩罚实现Unity内函数13倍提速

    测试对象 1 C Unity脚本 2 C DLL mcs build的动态链接库再导入Unity 3 C Native Code LLVM编译后导入Unity 被测试函数源码 两个随机数数组进行大小比较 一个数组保存大数 另一个保存小数 C
  • 静态链接与动态链接的区别

    我们大家在编程过程中对 链接 这个词并不陌生 链接所解决的问题即是将我们自己写的代码和别人写的库集成在一起 链接可以分为静态链接与动态链接 下文将分别讲解这两种方式的特点与其区别 静态链接 特点 在生成可执行文件的时候 链接阶段 把所有需要
  • 【学习笔记】数据存储的顺序与对齐_计算机原理

    学习笔记 数据存储的顺序与对齐 计算机原理 开了个新坑 做一个计算机原理的读书笔记 自用 仅做分享 数据存储的顺序 介绍了机器端模式 数据存储的对齐 这里介绍的是 数据结构的存储方式是根据给定的字节和自己本身的字节做对齐的 比如 4 4 4
  • 命令行下使用CL.exe编译多cpp文件工程

    一 CL exe是控制 Microsoft C 和 C 编译器与链接器的 32 位工具 编译器产生通用对象文件格式 COFF 对象 obj 文件 链接器产生可执行文件 exe 或动态链接库文件 DLL 用法如下 注意 所有编译器选项都区分大
  • 【VMware】虚拟机中Ubuntu无法连接网络的有效解决办法

    1 Ubuntu网络设置 依次单击 System Settings gt Network gt Wired gt Options 如下图所示 依次选择 General 勾选如下图所示的单选框 最后点击 Save 如下图所示 依次选择 IPv
  • Windows11镜像网盘链接

    Windows11镜像 大小10 39G 自己用于M1芯片的mac装虚拟机 网盘链接放入 有需要的朋友自取 链接 https pan baidu com s 1xBjGPq74 FKiEK MgIFTpA 提取码 3jw3
  • IntelliJ IDEA 编译程序出现非法字符的解决方法

    最近编码完成后总是报非法字符 项目启动不起来 网上有很多说是File gt Setting gt File Encoding 将IDE Encoding和Project Encoding 都设置为UTF 8就行 可是我试了不行 后来看到另外
  • 文件传输协议FTP与TCP/IP协议之间有什么关系

    TCP IP协议是目前网络所采用的一种框架协议 包括五层 应用层 传输层 网络层 链路层 物理层 FTP协议是TCP IP协议的一部分 严格意义上来说是应用层协议 FTP是一种应用程序 基于TCP IP协议 它定义了本地登录户机与远程服务器
  • OpenCV项目编译错误

    编译遇到如下错误 opencv 3 4 4 modules highgui src window gtk cpp 1062 error 218 No OpenGL support Library was built without Open

随机推荐

  • 雅可比矩阵机器学习_深度学习中的Matrix Calculus (一)

    绝大多数网络上对深度学习公式的推导教程notation混乱 而专门介绍Matrix Calculus的材料可能又过于繁杂 其实在深度学习中用到的矩阵微积分并不艰深 看完之后你就可以愉快的进行各种推导了 本文仅作为优秀资源的搬运总结 有余力的
  • SQL 备份表-造数据-还原表

    不影响日后工作的造数据步骤 1 备份表内的内容 2 清表内内容 3 给表造数据 4 还原表 1 备份表内的内容 create table lt 库名2 gt lt 表名2 gt as select from lt 库名1 gt lt 表名1
  • 搭建iscsi存储系统

    内容 常见硬盘介绍 NAS和SAN服务器概述 实战 配置IP SAN服务器 实战 IP SAN服务器日常操作 存储设备 阵列柜 SAS 容量小 300G 600G 900G 价格贵 SATA 容量大 500G 750G 1T 2T 3T 4
  • HackMyVM Influencer

    HackMyVM Influencer 靶机IP 192 168 173 148 信息收集 nmap端口扫描 开启80 2121端口 ftp连接2121端口 匿名用户登录 下载所有文件 查看note txt 依次对图片文件 进行密码爆破 在
  • for和do-while循环以及break和continue语句

    目录 for循环 语法形式 循环的执行流程图 for循环和while循环的区别 例子 do while循环 语法形式 循环的执行流程图 例子 break和continue语句 break和continue在不同循环中的区别 while fo
  • 20张程序员才懂的搞笑图!保准你笑出猪叫......

    温馨提示 请勿在以下场景食用本文 吃饭时 挤电梯时 路过精神病院时 HTML的4种黑法 扫地阿姨 HTML确实是一门编程语言啊 扫地阿姨 所以HTML程序员不能称自己是程序员 扫地阿姨 这个黑的太过分了吧 扫地阿姨 小姑娘我被你的外表欺骗的
  • Java基础之字符常量

    表示一个字符 一个字符常量要用一对英文半角格式的单引号 引起来 它可以是英文字母 数字 标点符号 以及由转义序列来表示的特殊字符 a 1 r u0000 u0000 表示一个空白字符 即在单引号之间没有任何字符 之所以能这样表示是因为 Ja
  • 线程安全集合类概述

    HashTable和Vector 遗留的线程安全实现 效率较低 HashTable map的实现 Vector list的实现 Collections中的带synchronized修饰实现类 如synchronizedMap synchro
  • 反爬机制之验证setcookie

    反爬表现 在使用python或rust进行爬虫的时候的有时会遇到请求返回一段含有只含有js代码的html页面如图 分析及优化文件 首先解决转义字符 x63 x73 x4b x48 x77 x71 x4d x49这种 转义字符可以通过prin
  • 新一配:区块链及其概念【转载】

    区块链是分布式数据存储 点对点传输 共识机制 加密算法等计算机技术的新型应用模式 区块链 Blockchain 是比特币的一个重要概念 它本质上是一个去中心化的数据库 同时作为比特币的底层技术 是一串使用密码学方法相关联产生的数据块 每一个
  • 考研数学-三角函数与反三角函数图像

    转载自 http math001 com inverse trigonometric functions 在三角函数的前面加上 arc 表示它们的反函数 f 1 x 即由一个三角函数值得出当时的角度 1 正弦函数 sin x 反正弦函数 a
  • 泰勒公式浅谈原理(转) ----- 深度好文, 一点是如何蕴含整个世界

    泰勒公式浅谈原理 转 上周写完了 三体 读后思考 泰勒展开 维度打击 黑暗森林 后收到一些邮件 进一步思考了关于泰勒展开的意义 也许我掌握的那些网络技术比如Linux Netfilter NAT之类 太过底层太过小众 所以大家几乎都是没有感
  • [论文阅读] (15)英文SCI论文审稿意见及应对策略学习笔记总结(letpub爬虫)

    娜璋带你读论文 系列主要是督促自己阅读优秀论文及听取学术讲座 并分享给大家 希望您喜欢 由于作者的英文水平和学术能力不高 需要不断提升 所以还请大家批评指正 非常欢迎大家给我留言评论 学术路上期待与您前行 加油 前一篇介绍英文论文实验评估
  • 在 .NET Core 中结合 HttpClientFactory 使用 Polly(下篇)

    译者 王亮作者 Polly 团队原文 http t cn EhZ90oq声明 我翻译技术文章不是逐句翻译的 而是根据我自己的理解来表述的 包括标题 其中可能会去除一些不影响理解但本人实在不知道如何组织的句子 译者序 这是 Polly and
  • c++11中auto&&是什么意思?

    为什么80 的码农都做不了架构师 gt gt gt By using auto var
  • Missing global shader FCopyVelocityGridCS‘s permutation 0, Please make sure cooking was successful.

    打包好的项目报了如下错误 如何解决这个bug呢 这个问题困扰了我很久 从2022年9月左右就无法打包到现在的2023年5月31号 没想到今天解决了 最近我花了一星期的时间来研究这个bug导致 当时以为是蓝图和材质代码导致 一个个查 吧资源的
  • Python快速入门多线程与多进程

    Python快速入门多线程与多进程 多线程 多线程的含义 进程我们可以理解为是一个可以独立运行的程序单位 比如打开一个浏览器 这就开启了一个浏览器进程 打开一个文本编辑器 这就开启了一个文本编辑器进程 但一个进程中是可以同时处理很多事情的
  • 链栈C++实现

    include
  • arcpy批量将excel一些列的点坐标制作成面

    使用Arcpy可以批量将Excel表格中的点坐标制作成面 并将对应组点的属性写入到对应面的属性中 import arcpy import xlrd 设置输入数据路径 excel file r C data points xlsx 包含点坐标
  • GCC编译过程,了解编译原理

    说明 这篇文件是在读 程序员的自我修养 链接 装载与库 的一点笔记 权当时学习的记录 1 GCC编译过程分解 以HelloWorld程序为例 2 预编译 规则 命令 gcc E XXX c o XXX i 3 编译 词法分析 语法分析 语义