Go 博客
GCC 4.7.1 中的 Gccgo
Go 语言一直是由 规范 定义的,而不是由某个实现定义。Go 团队编写了两个实现该规范的编译器:gc 和 gccgo。拥有两个不同的实现有助于确保规范的完整性和正确性:当编译器之间存在分歧时,我们会修复规范,并相应地修改一个或两个编译器。Gc 是最初的编译器,go 工具默认使用它。Gccgo 是一个不同的实现,重点不同,在这篇文章中我们将仔细看看它。
Gccgo 作为 GNU 编译器套件 (GCC) 的一部分发布。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 调度器、通道、内存分配器和垃圾收集器。与 gc 编译器一样,gccgo 支持分割 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 代码
上一篇文章:来自 Google I/O 2012 的 Go 视频
博客索引