gcc编译过程简介

gcc编译过程简介

文章目录

  • gcc编译过程简介
    • 预编译
    • 编译
      • 语法分析
      • 语法分析
      • 语义分析
      • 中间语言生成
      • 目标代码生成和优化
    • 汇编
    • 链接

GCC编译程序的过程可以分为以下四个步骤:

  1. 预处理(preprocessing)
  2. 编译(compilation)
  3. 汇编(assembly)
  4. 链接(linking)
hello.c
Preprocessing
stdio.h
Preprocessed--hello.i
Compilation--gcc
Assembly--hello.c
Assembly--as
Object File--hello.o
Linking--ld
Static Library--libc.a
Executable--a.out

实例代码:

#include <stdio.h>int main()
{printf("hello\n");return 0;
}

预编译

预编译过程主要处理那些源代码文件中以#开始的预编译指令。

gcc -E hello.c -o hello.i

编译

编译过程就是把预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后生产相应的汇编代码文件,这个过程往往是我们所说的整个程序构建的核心部分,也是最复杂的地方之一。

gcc -S hello.i -o hello.s

编译过程一般分为6步:扫描、语法分析、语义分析、源代码优化、代码生成和目标代码优化

Scanner
Parser
Semantic Analyzer
Source Code Optimizer
Code Generator
Code Optimizer
Source Code
Tokens
Syntax Tree
Commented Syntax Tree
Intermediate Representation
Target Code
Final Target Code

语法分析

首先源代码程序被输入到扫描器(Scanner),扫描器只是简单的进行词法分析,运用一种类似于有限状态机(Finite State Machine)的算法可以很轻松的将源代码的字符序列分割成一系列的记号(Token)。
有一个叫做lex的程序可以实现词法扫描,他会按照用户之前描述好的词法规则将输入的字符串分割成一个个记号。

语法分析

语法分析器(Grammar Parser)将对由扫描器产生的记号进行语法分析,从而产生语法树(Syntax Tree)。整个分析过程采用了上下文无关语法(Context-free Grammar)的分析手段。简单地说,由语法分析器生成的语法树就是以表达式(Expression)为节点的树。
语法分析器也有一个工具叫做yacc(Yet Another Compiler Compiler)。他也像lex一样,可以根据用户给定的语法规则对输入的记号序列进行解析,从而构建出一颗语法树。对于不同的编程语言,编译器的开发者只须改变语法规则,而无需为每个编译器编写一个语法分析器,所有他又被称为“编译器编译器”。

语义分析

语义分析器(Semantic Analyzer)负责语义分析,语法分析仅仅是完成了对表达式的语法层面的分析,但是他并不了解这个语句是否真正有意义。编译器所能分析的语义是静态语义(Static Semantic),所谓静态语义是指在编译器可以确定的语义,与之对应的动态语义(Dynamic Semantic)就是只有在运行期才能确定的语义。
经过语义分析阶段之后,整个语法树的表达式都被标识了类型,如果有些类型需要做隐式转换,语义分析程序会在语法树中插入相应的转换节点。

中间语言生成

现代的编译器有着很多层次的优化,往往在源代码级别会有一个优化过程,源码级优化器(Source Code Optimizer)会在源代码级别进行优化。

直接在语法树上做优化比较困难,所有源代码优化器往往将整个语法树转换成中间代码(Intermediate Code),他是语法树的顺序表示,其实它已经非常接近目标代码了,但是它一般跟目标机器和运行时环境是无关的。
中间代码使得编译器可以被分为前端和后端,编译器前端负责产生机器无关的中间代码,编译器后端将中间代码转换成目标机器代码。这样对于一些可以跨平台的编译器而言,他们可以针对不同的平台使用同一个前端和针对不同机器平台的数个后端。

目标代码生成和优化

源代码优化器产生的中间代码标志这下面的过程都属于编译器后端。编译器后端主要包括代码生成器(Code Generator)和目标代码优化器(Target Code Optimizer)。

汇编

汇编器是将汇编代码转变成机器可执行的指令,每一个汇编语句几乎都对应一条机器指令。所以汇编器的汇编过程相对于编译器来说比较简单,他没有复杂的语法,也没有语义,也不需要做指令优化,只是根据汇编指令和机器指令的对照表一一翻译即可,“汇编”这个名字也来源于此。

as hello.s -o hello.o
# gcc -c hello.s -o hello.o
# gcc -c hello.c -o hello.o

链接

链接(Linking)的主要内容就是把各个模块之间相互引用的部分都处理好,使得各个模块之间能够正确衔接。
链接过程主要包括了地址和空间分配(Address and Storage Allocation)、符号决议(Symbol Resolution)和重定位(热咯擦提欧尼)
等这些步骤。

符号决议有时候也被称为符号绑定(Symbol Binding)、名称绑定(Name Binding)、名称决议(Name Resolution)。

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

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

相关文章

(单机架设教程)凯旋|当年的QQ游戏

前言 今天给大家带来一款单机游戏的架设&#xff1a;凯旋 &#xff0c; 当年的QQ游戏 如今市面上的资源参差不齐&#xff0c;大部分的都不能运行&#xff0c;本人亲自测试&#xff0c;运行视频如下&#xff1a; 凯旋单机 搭建教程 此游戏架设需要安装虚拟机&#xff0c; 没有…

[AIGC] 深入了解标准与异常重定向输出

在操作系统和编程环境下&#xff0c;有时我们需要更加精细地控制程序的输入或输出过程&#xff0c;这就涉及到了标准输入输出流&#xff0c;以及重定向的概念。接下来&#xff0c;我们将详细介绍标准输出、标准错误输出&#xff0c;以及如何进行输出重定向。 文章目录 1. 标准输…

Vue+Proj4Leaflet实现地图瓦片(Nginx代理本地地图瓦片为网络url)加载并实现CRS投影转换(附资源下载)

场景 Leaflet中加载离线OSM瓦片地图(使用OfflineMapMaker切割下载离线png地图文件)&#xff1a; Leaflet中加载离线OSM瓦片地图(使用OfflineMapMaker切割下载离线png地图文件)_offline map maker-CSDN博客 Leaflet快速入门与加载OSM显示地图&#xff1a; Leaflet快速入门与…

Golang-slice理解

slice golang-slice语雀笔记整理 slicego为何设计slice&#xff1f;引用传递实现扩容机制 go为何设计slice&#xff1f; 切片对标其他语言的动态数组&#xff0c;底层通过数组实现&#xff0c;可以说是对数组的抽象&#xff0c;底层的内存是连续分配的所以效率高&#xff0c;可…

Proxmox VE(PVE)上手配置指南

Proxmox VE&#xff08;PVE&#xff09;是一款开源虚拟化管理平台&#xff0c;集成了KVM和LXC技术&#xff0c;支持虚拟机和容器管理。它提供了一个基于Web的用户界面&#xff0c;支持高可用性集群、备份和恢复、实时迁移等功能&#xff0c;适用于企业级虚拟化环境。. 以下为安…

博客都在使用的打字机效果,居然这么简单?

效果展示 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>body …

C语言 | Leetcode C++题解之第199题二叉树的右视图

题目&#xff1a; 题解&#xff1a; #define MAX_NODE_NUM 100 int* rightSideView(struct TreeNode* root, int* returnSize){if (root NULL) {*returnSize 0;return NULL;}int *res (int *)malloc(sizeof(int) * MAX_NODE_NUM);int cnt 0;struct TreeNode **record (st…

详解 HTTP 中间人攻击

什么是中间人攻击&#xff1f; 攻击者将自己插入通信过程中&#xff0c;以窃取&#xff0c;篡改数据。通信的两端不知道中间人的存在&#xff0c;他们以为在与对方直接通信&#xff0c;实际上他们的通信已经被监听或干扰。WIFI 路由器被破解之后就能进行中间人攻击。 中间人攻…

50-4 内网信息收集 - 本机信息收集

一、内网信息收集 内网信息收集可以从以下几个方面进行:本机信息收集、域内信息收集、内网资源探测等。通过这些步骤,我们可以全面了解当前主机的角色和所处内网的拓扑结构,从而选择更合适、更精准的渗透方案。 二、本机基础信息收集 在本机基础信息收集阶段,可以执行以下…

EasyExcel数据导入

前言&#xff1a; 我先讲一种网上信息的获取方式把&#xff0c;虽然我感觉和后面的EasyExcel没有什么关系&#xff0c;可能是因为这个项目这个操作很难实现&#xff0c;不过也可以在此记录一下&#xff0c;如果需要再拆出来也行。 看上了网页信息&#xff0c;怎么抓到&#x…

周记-2024第26周-6.25~6.30

现在是周日晚上21:58&#xff0c;我开始做本周总结。 工作 .1 开始接手量产模型的训练&#xff0c;新工作有新的小组长&#xff0c;我还是有些羞怯&#xff0c;不是很好意思频繁找他。要自信一点&#xff0c;大方一点&#xff0c;一个堂堂男子汉&#xff0c;怎么感觉工作中娘…

SpringBoot + mkcert ,解决本地及局域网(内网)HTTPS访问

本文主要解决访问SpringBoot开发的Web程序,本地及内网系统,需要HTTPS证书的问题。 我测试的版本是,其他版本不确定是否也正常,测试过没问题的小伙伴,可以在评论区将测试过的版本号留下,方便他人参考: <spring-boot.version>2.3.12.RELEASE</spring-boot.vers…

朋友问我Java中“::”是什么意思?我汗流浃背了......

目录 一&#xff1a;什么是&#xff1a;&#xff1a;&#xff1f; 二&#xff1a;方法引用的几种类型 1.引用静态方法 2.引用特定对象的实例方法 3.引用特定类型的任意对象的实例方法 4.引用构造方法 三&#xff1a;方法引用的适用场景 四&#xff1a;总结 一&#xff1…

ssh转发功能入门

端口转发概述 端口转发&#xff0c;能够将其他TCP端口的网络数据通过SSH链路转发&#xff0c;并且提供了ssh的加密和解密的服务。 ssh端口转发有如下这些优点&#xff1a; 提供了ssh的加密传输&#xff0c;利于安全能够突破防火墙限制 目前ssh端口转发有如下几种方式&#x…

spring模块(二)SpringBean(2)BeanWrapperImpl

一、介绍 1、简介 BeanWrapper是Spring中一个很重要的接口&#xff0c;Spring在通过配信息创建对象时&#xff0c;第一步首先就是创建一个BeanWrapper。 Spring低级JavaBeans基础设施的中央接口。通常来说并不直接使用BeanWrapper&#xff0c;而是借助BeanFactory或者DataBi…

eFuse基本概念

From&#xff1a;GTP-4o eFuse&#xff08;电子熔丝&#xff09;是一种在集成电路&#xff08;IC&#xff09;设计中常用的可编程熔丝技术。它在芯片中起着至关重要的作用&#xff0c;主要用于配置、调整、修复和安全相关的功能。以下是关于 eFuse 在芯片中的用途和相关技术的…

学习一下宏的##和...

##&#xff1a;如果参数不存在则忽略逗号和参数 ...&#xff1a;可变参数 栗子&#xff1a; #define Debug(fmt, args...) LOG("DEBUG", fmt, ##args) ...: ... 是C和C预处理器中的一个特殊标记&#xff0c;用于表示一个可变数量的参数。在宏定义中&#xff0c;可…

【课程总结】Day13(上):使用YOLO进行目标检测

前言 在上一章《【课程总结】Day11&#xff08;下&#xff09;&#xff1a;YOLO的入门使用》的学习中&#xff0c;我们通过YOLO实现了对图片的分类任务。本章的学习内容&#xff0c;将以目标检测为切入口&#xff0c;了解目标检测流程&#xff0c;包括&#xff1a;数据标准、模…

使用NFS网关功能将HDFS挂载到本地系统

HDFS安装教程 HDFS安装教程http://t.csdnimg.cn/2ziFd 使用NFS网关功能将HDFS挂载到本地系统 简介 HDFS提供了基于NFS&#xff08;Network File System&#xff09;的插件&#xff0c;可以对外提供NFS网关&#xff0c;供其它系统挂载使用。 NFS 网关支持 NFSv3&#xff0c;并…

【操作系统】进程管理——进程的概念、组成和特征(个人笔记)

学习日期&#xff1a;2024.6.29 内容摘要&#xff1a;进程的基本概念和特征、状态和转换 进程的概念 程序与进程 程序&#xff1a;是静态的&#xff0c;是存放在磁盘里的可执行文件&#xff0c;就是一系列的指令集合 进程&#xff08;Process&#xff09;&#xff1a;是动态…