让我们了解一下GCC 4:
在过去的几年中,GNU Compiler Collection (GCC)一直在做GCC 3 到 GCC 4 的主要版本转换。GCC 4是一个重要的版本,GCC 4 新增了很多新的最优化框架(和新的中间代码生成),新的架构和语言支持,多种新属性和选项变化。了解GCC 4新的属性和它们的优点很有必要。
GCC是所有开发的基石,不管是对开源世界和闭源世界。它让操作系统和架构能够运行。当一个新的处理器出现,它必须依赖一个GCC版本支持(GCC在后台为它提供代码生成)。GCC也让开源操作系统Linux得以运行,让Linux进入嵌入开发领域成为现实……
但是GCC并不是静止的,新的处理器架构不停的出现,新的研究发现更好的方式来生成最优化代码,所以GCC也在一直在发展中,并且成功的发布了新的主要版本GCC 4。本文将浏览GCC的核心修改,让你熟悉新的编译标准。
首先简短复习一下的GCC历史:
GCC 最初是GNU C Compiler,由大名鼎鼎的 Richard Stallman 同学 在1987年首次发布。Richard开始这个项目于1984年,期望建立一个免费的C编译器,能够被使用和修改。GCC 最初跑在早期的Sun和DEC VAX系统上。
作为一个开源的编译器(意味着源代码是公开的),其他开发者也在热心帮助修复bug,更重要的是升级GCC支持新的语言和其他目标架构。不久以后,它的名称变成GNU Compiler Collection,它已经支持多种语言和最流行的架构。
GCC发布历史:
今天GCC已经成为最流行的编译器,支持Ada, Fortran, the Java? language, C 的变种 (C++ 和 Objective-C),以及覆盖了最大范围的处理器架构(支持30种处理器家族),GCC源代码移植到了超过60种平台,也是目前现存的最复杂的开源系统,GCC现在拥有大概150万行源代码。
在开始之前简单了解GCC的基本架构:
编译器是一种pipeline管道架构,通过不同的层次为不同类型的数据进行通讯(见下图)。前台编译器针对特殊语言,包括特定语言的语法分析器,解析为树状结构和中间状态代码(使用注册转换语言Register Transfer Language:RTL)。后台编译器提供与语言无关的解析和针对特定目标架构的创建结构。为了达到这个目标,最优化使用RTL创建更快速或者更简洁代码(如果可能,两者同时兼顾)。最优化的RTL被代码生成器获取,然后生成目标代码。
GCC 4的核心转换:
GCC 4 提供许多标准编译器组件的修改,最大更改是通过引进树静态单一分配(tree Static Single Assignment:SSA)格式对代码最优化的支持。GCC 4 对于 警告warning和错误error的展示是非常彻底的(事实上,一些特定的警告信息在GCC 4中已经显示为错误)。GCC 4的一个退步是它并不是GCC 3创建对象的字节编译,这意味着GCC 3编译的代码必须通过GCC 4重新编译。不幸的是,这样的成本就要增加。
让我们看看GCC 4 的主要进步。
4.0 发布系列:
4.0系列(4.0.4是最后版本),是GCC 进入 第4版的第一步,所以并不推荐使用在生产环境中,这个版本包含很多修改,一个是前面介绍的树静态单一分配SSA,另外一个是autovectorization自动矢量化。
在GCC 4之前,中间代码名叫Register Transfer Language (RTL),RTL是一个低层的代码,非常类似于汇编语言(从LISP S-expressions获得灵感)。RTL的问题是它对转换成最终目标提供了优化,确失了解释信息。当需要支持更好的分析和优化的时候,Tree SSA 设计用来同时独立于语言和目标。
Tree SSA 引入了两个新的中间代码,第一个叫 GENERIC ,这是一个普通的树结构,用来形成前台树格式。 GENERIC 树转换为 GIMPLE格式和子序列控制流图来支持基于SSA的最优化。最后SSA树转换为RTL,这用于后台来做最终目标的代码生成。简单的说,就是,引入Tree SSA的好处就是提供新的中间代码让高层和低层的最优化都做到最好。
GCC 4另外一个有趣的变化是添加了loop vectorizer 循环矢量(也是基于Tree SSA框架)。Autovectorization 自动矢量化让编译器标识代码内的分级进程循环,让目标处理器能够获得矢量指令的优势。结果是获得更加严格和高效的目标代码。另一个基于循环优化的是Swing Modulo Scheduling (SMS),通过减少构造层平行数量来构建最小循环指令管道。
最后 4.0 系列引入很多C 和 C++ 修改,新的Fortran 前台,支持Fortran 90 和 95 (而不是古老的Fortran 77,GCC 3支持)。新的Ada 2005功能,支持更多Ada新的架构。
4.1发布系列:
改进的属性支持和更精确的分支可能性预判。两个很有用的优化是更好的内联支持和减少本地指令缓存能力。如果函数是内联方式,编译器不再频繁执行。而且热点调用区域将更可能通过内联来保持代码数量尽可能小,获得内联函数的优势。GCC能够帮助分段函数进入热点或者冷静区域。保持热点函数放在一起,获得更好的指令缓存。
前台做了系列更新,包括支持Objective-C++。同时有大量针对java核心库(libgc)的更新。后台引入对IBM® System z? 9-109 处理器支持,包括支持128位指令代码,Electronics Engineers (IEEE)浮点数,和内建原子内存存取能力。如果这些还不够吸引眼球,那么后台现在还能够发出保护堆栈攻击的指令,这意味着,如果缓冲buffer溢出被检测到,将重新排列保护指针不会崩溃。一些内建功能也被更新,用来保护缓冲buffer不会被过量请求占用。
4.2发布系列:
4.2版本继续支持更好的优化,同时包括语言和处理器架构的进步。后台更新包括对Sun的UltraSPARC T1处理器支持(代码名称Niagara),同时支持Broadcom的SB-1A MIPS 芯片。前台修补了C++可视化处理机制,支持Fortran 2003 输入/输出流扩展。但是4.2最有趣的更新是添加了C,C++和Fortran编译器的OpenMP功能。
OpenMP是一个多线程实现,允许编译器生成平行任务和数据代码。
OpenMP一个概念:代码能够通过区域注释,这块区域平行处理能够被处理器直接使用。代码转换成多线程程序,用来处理代码块存在,然后在代码块结束后进入每个线程。
下图提供了处理器如何工作的示例。
4.3发布系列:
这个发布系列显示功能和支持架构的加速进步 (比如很多陈旧的架构支持被删除)。新的语言支持,比如添加对Fortran 2003支持。新的处理器支持,包括支持Coldfire 处理器家族, IBM System z9 EC/BC 处理器,Cell broadband engine 晶格宽带引擎架构的互协作处理器单元(Synergistic Processor Unit :SPU),支持SmartMIPS等。你将发现Thumb2的编译和库支持(简洁的ARM指令)以及对ARMv7架构支持,支持 Core2 处理器和Geode处理器家族。
4.3 发布以后:
已经开始4.4版本开发了,这个版本即将发布,在4.4版本中OpenMP的3.0版本规格将应用到C, C++, 和 Fortran中。
编译器现在允许你定义一个在函数层进行优化的级别,(代替文档层,原先是缺省设置)。这个功能提供优化参数,提供独立的选项做优化。
最后处理器将添加Picochip支持,这是一个16位多核处理器。
GCC的未来?
GCC的未来是光明的。GCC将支持更多的处理器和架构,GCC几乎涵盖整个开发语言。开发方面还支持一系列不同的语言,比如Mercury,GHDL(一个用于VHDL的GCC前台语言),和 统一的并行C语言(Unified Parallel C language :UPC)。
由于GCC的进步,几乎所有的软件将从GCC的进步中获得好处(从Linux和Berkeley软件到Apache等),通过GCC 4进行软件编译将更加简洁和快速。
相关推荐
gcc深入分析
对gcc进行深入分析的几篇文章,涉及configure, makefile的详细解说,对gcc的源码也有深入分析。虽然用的是gcc-2.6,但是仍然有相当的参考价值。作者主页 http://www.chong2.com/ mara@chong2.com下载。
GCC源码分析(十四) — rtx结构体,指令与栈分配
一、rtx表达式 RTL(Register Transfer Language)全称叫寄存器传输语言,其采用类似LISP语言的列表形式描述了每一条指令的语义动作.RTL语言中最基础的数据结构体就是RTX(struct rtx_def),类似于树节点(tree)在AST中的作用,RTX(rtx_def)表达式节点是RTL语言中最基本的数据类型(RTX 是 RTLeXpression). 在gcc中,rtx结构体实际上是一个指向rtx_def结构体的指针,其类似AST中树节点(tree)是用来...
Gcc核心源代码分析
Gcc核心源代码分析
深入分析GCC
深入分析GCC 目录 前言章 GCC概述 11.1 GCC的产生与发展 11.2 GCC的特点 21.3 GCC代码分析 3第2章 GCC源代码分析工具 42.1 vim ctags代码阅读工具 42.2 GNU gdb调试工具 62.3 GNU binutils工具 82.4 shell工具及graphviz绘图工具 112.5 GCC调试选项 13第3章 GCC总体结构 163.1 ...
初识Linux —— 理解gcc编译器
学习了vim编辑器,我们能够在Linux下写代码,那我们如何让代码运行起来呢?现在就来学习使用gccgcc。
剖析gcc-v输出
剖析gcc -v输出 - 克拉默与矩阵 - 博客园
GCC 源码剖析
从今天开始,逐行分析GCC 源码,争取每周至少更新一次
深入剖析gcc和g++的区别
深入剖析gcc和g++的区别
五本CPP经典书籍&gcc源代码地址
svn://gcc.gnu.org/svn/gcc/trunk这个是GCC源代码的地下SVN的。 1.The C++ Programming Language Special 3rd Edition.pdf 2.Addison.Wesley.Effective.C.Plus.Plus.55.Specific.Ways.to.Improve.Your.Programs.and.Designs.3rd.Edition.May.2005.eBook-DDU.chm 3.Addison-Wesley - Design Patterns @ Elements of Reusable Object-Oriented Software.pdf 4.ISO 14882 C++2003.pdf 5.Addison.Wesley.Modern.C++.Design-.Generic.Programming.and.Design.Patterns.Applied.pdf
从GCC源码剖析C语言编译流程——深入GCC内部架构
本文深入剖析GCC源码,详细解析C语言编译流程的四个关键阶段:预处理、编译、汇编和链接。通过GCC内部架构的拆解,包括前端语法分析、中间表示GIMPLE、优化器和后端代码生成,帮助开发者深入理解编译原理。文章还提供GCC优化实战案例和源码阅读技巧,助力提升编译技术实践能力。
GCC的四步剖析
<br /><br />GCC的命令剖析--四步走<br />从上面我们知道GCC编译源代码生成最终可执行的二进制程序,GCC后台隐含执行了四个阶段步骤。<br />GCC编译C源码有四个步骤:预处理-----> 编译 ----> 汇编 ----> 链接<br />现在我们就用GCC的命令选项来逐个剖析GCC过程。<br />1)预处理(Pre-processing)<br />在该阶段,编译器将C源代码中的包含的头文件如stdio.h编译进来,用户可以使用gcc的选项”-E”进行查看。<br />
【Linux学习笔记】gcc编辑器和动静态库的深度剖析
哈喽,各位小伙伴大家好!上期我们讲了Linux用户和文件权限的深度剖析 今天我们讲的是gcc编辑器和动静态库的深度剖析。话不多说,我们进入正题!向大厂冲锋!
剖析gcc -v输出
分析gcc -v的详细信息的意义 首先我们需要清楚一点,我们并不能完全弄清楚gcc -v的所有信息,因为毕竟我们并不是GCC编译器集合的实现者,对于这些信息,他们才是最清楚的。由于我们不能将所有的信息都搞清楚,所以我们只分析关键信息。虽然我们不能将所有信息都全部弄清楚,但是分析里面的关键信息还是非常有意义的,我们可以通过这些信息弄清楚很多事情,比如: ①通过这些信息,我就知道gcc其实最...
【Linux】gcc优化选项剖析
编译器各个级别的优化选项都优化了些什么
深入剖析 linux GCC 4.4 的 STL string
深入剖析 linux GCC 4.4 的 STL string Posted on 2012 年 11 月 26 日 by zieckey 本文通过研究STL源码来剖析C++中标准模板块库std::string运行机理,重点研究了其中的引用计数和Copy-On-Write技术。 平台:x86_64-redhat-linux gcc version 4.4.6 20110731 (Red
2728




被折叠的 条评论
为什么被折叠?



