Go 编译器:GCC 4.7.1 中的 Gccgo
伊恩・兰斯・泰勒
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 可能是答案。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
推荐文章: