Go 编译器:GCC 4.7.1 中的 Gccgo

未匹配的标注

本文为官方 Go Blog 的中文翻译,详见 翻译说明

伊恩·兰斯·泰勒
2012年7月11日

Go语言始终由spec说明书而不是实现定义。 Go团队编写了两种实现该规范的不同编译器:gc和gccgo。具有两种不同的实现方式有助于确保规范的完整性和正确性:当编译器不同意时,我们会修复规范,并相应地更改一个或两个编译器。 Gc是原始编译器,默认情况下go工具使用它。 Gccgo是一种不同的实现方式,具有不同的侧重点,在这篇文章中,我们将对其进行更深入的研究。

Gccgo作为GCC(GNU编译器集合)的一部分进行分发。 GCC支持不同语言的几种前端。 gccgo是连接到GCC后端的Go前端。 Go前端与GCC项目是分开的,旨在能够连接到其他编译器后端,但目前仅支持GCC。

与gc相比,gccgo编译代码的速度较慢,但​​支持更强大的优化,因此gccgo构建的受CPU约束的程序通常运行速度更快。多年来,在GCC中实现的所有优化都是可用的,包括内联,循环优化,向量化,指令调度等。尽管它并不总是能产生更好的代码,但在某些情况下,使用gccgo编译的程序可以运行30%更快。

gc编译器仅支持最受欢迎的处理器:x86(32位和64位)和ARM。但是,Gccgo支持GCC支持的所有处理器。并非所有这些处理器都经过了gccgo的全面测试,但是许多处理器都进行了测试,包括x86(32位和64位),SPARC,MIPS,PowerPC甚至Alpha。 Gccgo还已经在gc编译器不支持的操作系统(尤其是Solaris)上进行了测试。

Gccgo提供了标准的,完整的Go库。 Go运行时的许多核心功能在gccgo和gc中都相同,包括goroutine调度程序,通道,内存分配器和垃圾收集器。 Gccgo和gc编译器一样,支持拆分goroutine堆栈,但目前仅在x86(32位或64位)上,并且仅在使用gold链接器时(在其他处理器上,每个goroutine将具有较大的堆栈,以及一系列深层次的函数调用可能会运行到堆栈末尾并使程序崩溃)。

Gccgo发行版尚未包含go命令的版本。但是,如果您从标准Go发行版安装go命令,则该命令已经通过-compiler选项支持gccgo:go build--compiler gccgo myprog。 Go和C / C ++,cgo和SWIG之间进行调用的工具也支持gccgo。

我们已将Go前端与其余Go工具置于相同的BSD许可下。您可以在gofrontend项目下载前端的源代码。请注意,当Go前端与GCC后端链接以制作gccgo时,GCC的GPL许可证优先。

GCC的最新版本4.7.1包含支持Go 1的gccgo。如果需要更好的CPU绑定Go程序性能,或者需要支持gc编译器不支持的处理器或操作系统,则gccgo可能是答案。

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/go-blog/gccgo-i...

译文地址:https://learnku.com/docs/go-blog/gccgo-i...

上一篇 下一篇
Summer
贡献者:1
讨论数量: 0
发起讨论 只看当前版本


暂无话题~