`
23号
  • 浏览: 133938 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

gcc

阅读更多

八月初 Mark Mitchell 发布了 GCC 4.3.2 版本,GCC是GNU编译集合,包括C, C++, Objective-C, Fortran, Java, and Ada编译器等。从这里下载最新的GCC: http://gcc.gnu.org/mirrors.html



让我们了解一下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进行软件编译将更加简洁和快速。

来自:ibm.com

分享到:
评论

相关推荐

    gccversion 12.1.0(GCC)

    《使用GNU Compiler Collection (GCC) 12.1.0》是GNU Press出版的一本关于GCC的指南,由Richard M. Stallman和GCC开发者社区共同撰写。GCC,全称为GNU Compiler Collection,是一套广泛使用的开源编译器集合,支持...

    离线安装GCC与GCC-C++

    - 源码安装完成后,可以通过`gcc --version`和`g++ --version`命令来验证GCC和GCC-C++是否成功安装,并查看其版本信息。 离线安装GCC与GCC-C++虽然过程相对复杂,但能确保在没有网络的环境中也能进行编译工作,这...

    gcc9.3rpm离线安装包

    GCC(GNU Compiler Collection)是GNU项目的一个核心组件,它是一个开源的、跨平台的编译器集合,用于将源代码转换成可执行程序。GCC 支持多种编程语言,包括C、C++、Fortran、Ada和Go等。在Linux和类Unix系统中,...

    tdm64-gcc安装包

    **tdm64-gcc安装包** `tdm64-gcc` 是一款专为Windows操作系统设计的64位版本的GCC(GNU Compiler Collection)编译器。GCC是开源的,由GNU项目维护,它包含了C、C++、Objective-C、Fortran、Ada和Go等多种编程语言...

    linux中gcc4.8.5,下载解压即可直接使用,linux系统GCC编译

    Linux中的GCC(GNU Compiler Collection)是开源的、跨平台的编译器套件,用于将C、C++、Fortran、Objective-C等编程语言的源代码编译为可执行文件。GCC 4.8.5是该系列的一个稳定版本,发布于2015年,虽然不是最新版...

    gcc yum源安装

    根据所提供的文件信息,我们将详细解释如何通过YUM源在Linux系统中安装不同版本的GCC(GNU编译器集合)。首先,将讲述Linux系统中GCC的重要性,以及如何通过YUM源安装特定版本的GCC。接着,我们根据内容片段提供的...

    gcc4.4.7 离线安装

    在IT行业中,GCC(GNU Compiler Collection)是广泛使用的开源编译器套件,它支持多种编程语言,包括C、C++、Fortran等。在CentOS 6.5这样的旧版Linux系统上,由于软件仓库中的版本可能较旧,有时需要离线安装更新的...

    Keil5配置GCC编译器_Keil5配置GCC编译器_

    它默认集成了ARMCC编译器,但有时候开发者可能希望使用GCC编译器,因为GCC是开源且跨平台的,具有更广泛的社区支持和丰富的库资源。本篇文章将详细讲解如何在Keil5中配置和使用GCC编译器。 一、安装GCC编译器 首先...

    GCC_广义互相关_gcc时延_互相关时延_gcc_matlab

    在信号处理领域,广义互相关(Generalized Cross-Correlation, GCC)是一种重要的时延估计方法,尤其在声源定位、同步系统和通信工程中应用广泛。GCC 算法是基于传统的互相关函数(Cross-Correlation Function, CCF...

    gcc-13.3.0.tar.gz

    GCC(GNU Compiler Collection,GNU编译器套件)是由GNU开发的编程语言编译器。GNU编译器套件包括C、C++、 Objective-C、 Fortran、Java、Ada和Go语言前端,也包括了这些语言的库(如libstdc++,libgcj等。) GCC的...

    gcc、gcc++ 离线安装包

    GCC(GNU Compiler Collection)是GNU项目的一部分,是一个开源的、跨平台的编译器套件,主要用于C、C++、Objective-C、Fortran、Ada、Go等编程语言。它不仅包含编译器,还包括预处理器、链接器和其他相关工具。在...

    gcc-8.5.0源码包

    **GCC 8.5.0 源码分析与编译指南** GCC(GNU Compiler Collection)是GNU项目的一部分,是一个广泛使用的开源编译器套件,支持多种编程语言,包括C、C++、Objective-C、Fortran、Ada、Go等。在本篇文章中,我们将...

    gcc各个版本下载_gcc-4.8.5.rar

    GCC,全称GNU Compiler Collection(GNU编译器集合),是由GNU项目开发并维护的一套开源编译工具集。它不仅包含C、C++、Fortran、Ada和Objective-C等编程语言的编译器,还提供了预处理器、链接器及其他相关的工具。...

    gcc_广义互相关_gcc时延_GCC互相关_gcc_源码.rar

    在IT领域,GCC(GNU Compiler Collection)是一种广泛使用的开源编译器套件,它支持多种编程语言,如C、C++、Fortran、Objective-C等。这个压缩包文件的标题和描述都涉及到“广义互相关”、“GCC时延”和“GCC互相关...

    arm-linux-gcc和arm-elf-gcc 区别

    "arm-linux-gcc和arm-elf-gcc 的区别" arm-linux-gcc 和 arm-elf-gcc 是嵌入式交叉编译工具链中最常用的两个 GCC 工具链,它们之间的主要区别在于使用不同的 C 库文件。arm-linux-gcc 使用 GNU 的 Glibc,而 arm-...

    GCC 11.2 离线安装包

    GCC,全称GNU Compiler Collection,是GNU项目的一部分,是一套由GNU开发的开源编译器套件,用于将源代码转换为计算机可执行的程序。GCC支持多种编程语言,包括C、C++、Fortran、Ada和Objective-C等。版本11.2是GCC...

    gcc 4.8.5离线安装包

    GCC,全称GNU Compiler Collection(GNU编译器集合),是一个开源的、跨平台的编译器套件,用于将源代码编译成可执行程序。它不仅包含C、C++、Fortran、Objective-C等语言的编译器,还提供了预处理、汇编和链接工具...

    gcc、gcc-c++安装包及依赖包4.4.7-23

    GCC(GNU Compiler Collection)是GNU项目的一部分,是一个开源的、跨平台的编译器套件,用于将源代码编译成可执行程序。它不仅包括C编译器(gcc),还包括C++(g++)、Objective-C、Fortran、Ada和其他语言的编译器...

    gcc10.1.0安装,gcc安装包+依赖包.rar

    GCC(GNU Compiler Collection)是GNU项目的一个重要组成部分,它是一个开源的、跨平台的编译器集合,支持C、C++、Fortran、Objective-C、Ada等编程语言。本教程将详细讲解如何在Linux环境下安装GCC 10.1.0版本,并...

Global site tag (gtag.js) - Google Analytics