澳门新葡亰信誉平台游戏Go 1.7 改善了编译速度并且会生成更快的代码

by admin on 2020年5月1日

Go 1.7的开发周期即将接近下一个里程牌版本,不过Go的提交者Dave
Cheney报告了在即将发布的释放版本中,团队在提升语言工具链方面所做的努力。

在发布了 6 个 rc 版本之后,Go 1.7 终于正式发布了。Go
现在的发布周期基本是半年一个版本,新的功能特性的开发主要集中在前 3
个月,之后会冻结起来,原则上只接受 bug
修复和文档更新,最终完成测试和发布。Go 1.7
的变化主要在工具链、运行时和库的实现上。语言规范只有一处很小的变化。编译工具链方面,引入
SSA
应该是新版本最大的特性之一。“开发资讯”之前也介绍过该特性:引入SSA之后,Go语言程序的执行性能将明显提升
。引入该特性之后,编译器能够生成更紧凑、执行更高效的代码。该特性默认开启,可以使用“-ssa=0”参数关闭。基准测试表明,编译的
Go 程序执行时间可减少
5-35%。包中的元数据格式从之前的文本格式修改为更紧凑的二进制格式。生成的包会更小。可以通过“-newexport=0”关闭该特性。得益于编译器和链接器的改进,使用
Go 1.7 构建的二进制文件通常会比使用 Go 1.6
构建的小,有些情况下减少会多达
20-30%。性能是不变的主题,通过新的编译器后端,以及对垃圾收集器和核心库的优化,大部分程序都会运行得更快。国外最受欢迎的游戏流媒体视频网站
Twitch 的很多系统中就用到了 Go。根据Twitch 工程师Rhys Hiltner
的博客,他们使用了 6 月的 Go 1.7 预发布版本,在没有手动调优的情况下,GC
停顿时间都有更好的表现。就 Twitch 的聊天系统而言,通常停顿时间接近 1
毫秒,与调优过的 1.6 相比,都有 10 倍提升。支持的系统方面,增加了对
macOS 10.12 Sierra 的支持。更多细节见 Go 1.7 发布说明:。如果对 Go 1.8
感兴趣,可以查看 出处:微信公众平台:开发资讯 ,作者:臧秀涛

澳门新葡亰信誉平台游戏 1

Cheney指出,基于当前的开发状态,Go
1.7将会很轻易地成为史上最棒的Go释放版本。在工具链提升方面的努力主要聚焦在两个领域:

八月初 Mark Mitchell 发布了 GCC 4.3.2 版本,GCC是GNU编译集合,包括C,
C++, Objective-C, Fortran, Java, and Ada编译器等。从这里下载最新的GCC:
让我们了解一下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进行软件编译将更加简洁和快速。

  • 编译和连接时间;

  • 代码生成。

在编译时间方面,自从由C转向Go以来,Go编译器就饱受较差的性能所困扰。这个问题已经有了很多的讨论,在面向Go
1.7的版本中,最近的工作已经完成,它致力于减少编译器所使用的内存量并且在连接时间方面也有所提升。相对于Go
1.5.3,这能够将总的编译时间降低大约20-30%,如下图所示:

澳门新葡亰信誉平台游戏 2

我们可以看到,Go
1.4.3编译器的性能依然要明显优于当前的1.7版本。不过,当前的性能提升也不应该被低估,尤其是新的Go编译器包含了一个全新的代码生成后端,在性能方面,它还没有完全成熟。

还需要提及的是自举(bootstrap)Go编译器的决策其实与性能无关,而是使用Go来取代C会在开发方面所带来的优势,这包括易于编写正确的代码、调试、更好的工具以及对并行的支持等等。实际上,Go编译器的代码是从C代码库自动转换得到的,而不是完全重写的。

如前文所述,代码生成是Go
1.7另一个主要关注的领域。新的后端改成了使用静态单一分配形式(static single
assignment,SSA),这与LLVM和其他编译器相同,这样能够对生成的代码启用多项优化。其中包含无用代码消除(dead
code elimination)、寄存器分配(register allocation)、栈帧分配(stack
frame allocation)等。如Cheney所述,在当前的初步开发版本中,Go
1.7新的SSA后端所产生的代码在速度上能够最高提升20%。另外,相对于Go
1.6,它所产生的二进制会更小,在很多方面,这个版本能够与Go
1.4版本相媲美。

原文:Go 1.7 to Improve Compilation Speed and Generate Faster
Code

出处:InfoQ 译者:张卫滨

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图