這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
英文原文: http://blog.golang.org/2012/07/gccgo-in-gcc-471.html
Go語言開始就由一個語言規範定義,並不是倚賴某個具體實現。Go開發小組針對語言規範,實現了兩個不同版本的編譯器:gc和gccgo。 有兩個不同的實現有助於保持語言規範的完整和完整:當兩個實現相互衝突時,我們修改語言規範,或者是修改實現以保持和規範一致。 Gc是預設的編譯器,專門針對go編寫。Gccgo是另一個不同實現(有不同的側重目標),下面我們將詳細介紹。
Gccgo是作為gcc的一個部分發布,屬於gcc編譯器集合。GCC前端可以支援多種不同的程式設計語言:gccgo是針對go語言的前端實現。Go前端同時保持和GCC相對獨立,它的設計目標之一是可以串連的到不同的編譯器後端,當然目前只支援GCC。
gccgo的編譯速度比gc較慢一點,但是可以產生更優的代碼,因此程式執行速度會更快。GCC的最佳化技術經過多年完善,涵蓋 迴圈最佳化、指令等各個方面。雖然gccgo不一定總是產生最好的代碼,但是在某些情況下它編譯的程式運行效率可以提高達30%。
GC編譯器只支援主流的處理器: X86(32/64位)和ARM。Gccgo可以支援GCC所支援的絕大部分類型處理器。目前gccgo已經測試的處理器類型包括:X86(32/64)、SPARC、MIPS、PowerPC和Alpha等。 Gccgo也測試了GC編譯器所不支援的作業系統,特別是Solaris系統。
Gccgo同時提供了標準且完備的go語言標準庫。gccgo和gc的關於Go運行時的一些特性也盡量保持一致,比如:goroutine的調度、channels、記憶體配置和記憶體回收等。Gccgo在X86已經支援goroutine的動態堆棧,需要使用gold連接器(在其他處理器,每個goroutine還是會分配一個大的棧,如果出現深度的函數嵌套調用會導致堆疊溢位)。
目前發布的Gccgo還不包含go命令。 但是通過Go正式版本安裝的go命令已經可以支援gccgo,需要使用 -compiler選項:go build -compiler gccgo myprog
。用於串連Go和C/C++的cgo和SWIG工具同樣支援gccgo。
我們已經將針對GCC的Go前端採用和Go相同的BSD許可證發布。可以從 gofrontend Google Code project 下載代碼。需要注意的是Go前端和GCC後端串連時,採用GPL許可證(譯註: 應該是BSD被GPL傳染的原因)。
最新的GCC 4.7.1,包含的gccgo完美支援Go1。對於使用者,如果需要更好編譯最佳化,或者是使用GC所不支援的處理器或作業系統,gccgo可能是一個更好的選擇。
by Ian Lance Taylor