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