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 排程器、通道、記憶體配置器和垃圾回收程式。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 可能就是答案。
下一篇:組織 Go 程式碼
前一篇:Google I/O 2012 的 Go 影片
網誌索引