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 影片
部落格索引