Go 博客
GCC 4.7.1 中的 Gccgo
Go 语言的定义始终是基于规范,而不是实现。Go 团队编写了两种不同的编译器来实现此规范:gc 和 gccgo。拥有两种不同的实现有助于确保规范的完整性和正确性:当编译器出现分歧时,我们会修复规范,并相应地修改一个或两个编译器。gc 是原始编译器,go 工具默认使用它。gccgo 是一个具有不同焦点的不同实现,在本文中我们将对其进行更深入的探讨。
Gccgo 作为 GCC(GNU Compiler Collection,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 包含 gccgo,支持 Go 1。如果您需要为 CPU 密集型 Go 程序获得更好的性能,或者需要支持 gc 编译器不支持的处理器或操作系统,gccgo 可能是您的答案。
下一篇文章:组织 Go 代码
上一篇文章:2012 年 Google I/O Go 视频
博客索引