這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
歡迎訪問 iCompiler - 多核軟體開發網。
Google發布go程式設計語言,目前為實驗版本。快速編譯,類型和訪存安全,並發,快樂編碼,開源。
// a simple Helloworld program: hello.go
package main
import "fmt"
func main()
{
fmt.Printf("Hello, iCompiler/n")
}
Go於2007年9月開始設計,主要設計者為Robert Griesemer,Rob Pike和Ken Thompson。後來Ian Lance Taylor實現了基於GCC的go編譯器gccgo。Russ Rox的加入推動了語言和庫的實際可用性。設計團隊相當豪華。
Robert Griesemer參與設計Chrome瀏覽器中的Javascript執行引擎V8,V8採用即時編譯技術和分代(generational)的stop-the-world垃圾收集機制。Rob Pike乃大名鼎鼎的人物,曾在貝爾實驗室工作,是Unix作業系統、Plan9作業系統、Limbo程式設計語言和UTF-8編碼的主要設計者,寫過憤青式的文章Systems Software Research is Irrelevant,還有兩本書The Unix Programming Environment和The Practice of Programming。Ken Thompson是圖靈獎獲得者,是Unix作業系統、Plan9作業系統、UTF-8編碼和B程式設計語言(C的前身)的創立者之一。在google,Ken和Robert還設計過過用於大規模資料分析的Sawzall語言。Ian Lance Taylor是GCC社區的超級活躍人物,是gold連接器和GCC過程間最佳化LTO的主要設計者之一,是Zembu公司的創始人之一。Russ Rox在MIT的博士論文是關於Xoc編譯器的設計。
高效編譯,高效執行和簡單編碼是開發人員的期待。Go是面向系統編程的語言,其設計動機基於以下情景。C語言的標頭檔引起的依賴管理無法進行快速編譯,C++和Java中麻煩的類型系統使得人們更傾向於python和javascript中的動態類型,垃圾收集和並行等基本概念沒有在目前的系統程式設計語言中得到很好的支援。因此go的設計簡化標頭檔的依賴管理,使用輕量級的類型系統,類型沒有繼承,支援垃圾收集和並發,從而提供在多核系統上設計系統軟體的方案。在並發支援方面,go提供了儲存模型文檔描述原子性,使用sync包支援互斥,基於通訊(而不是共用記憶體)來共用儲存。
為何不通過庫擴充已有的語言(比如C和C++)?他們認為C和C++的設計存在太多問題,比如缺乏垃圾收集,標頭檔嵌套和依賴鏈太長,缺乏並發支援等。目前Intel設計的面向資料並行的Ct編程系統是通過擴充C++來實現,Cilk++是通過擴充c/c++實現。歡迎感興趣的讀者探討!目前Go只是實驗版本,仍有一些開放性的問題,比如是否支援例外和範型。Go Language Design FAQ中有很多關於語言設計權衡的解釋。
對於一個程式設計語言,開發人員重點要關注編譯器(compiler)和運行時(runtime)。Go編譯器支援Linux和Mac OS X兩種作業系統,以及x86-64、x86和ARM三種體繫結構。google現在的很多設計都支援ARM,這是因為Android系統的一個重要後端就是ARM。Go編譯器有兩套實現,一個為gc,另一個為使用GCC後端的gccgo。由於go的一些設計者來自Plan9團隊,編譯器的命名也使用了Plan9中的編譯器命名傳統,比如6g是x86-64上的編譯器,8g是386上的編譯器,5g是ARM上的編譯器。他們曾經考慮使用LLVM編譯器來實現go,由於大且慢,無法滿足效能目標而放棄。他們特彆強調go是一個實現編譯器的好語言!Go運行時包括mark-and-sweep記憶體回收行程,數組和字串分區支援,段式棧支援,和go函數庫實現。目前gccgo所帶的運行時基於glibc實現,不支援段式棧管理和記憶體回收,由於棧大小固定,因此一次能建立的go函數數量受限。gc的編譯速度比gccgo快,運行時系統更健壯,但是產生代碼品質稍微遜色。目前推薦開發人員使用gc來玩go。
Let’s go!http://golang.org
6g hello.go 6l hello.6 ./6.out