Google釋出go程式語言

icompiler發表於2009-11-12

歡迎訪問 iCompiler - 多核軟體開發網。

 

 

Google釋出go程式語言,目前為實驗版本。快速編譯,型別和訪存安全,併發,快樂編碼,開源。

// a simple Helloworld program: hello.go
package main
import "fmt"
func main()
{
fmt.Printf("Hello, iCompiler/n")
}


Go於2007年9月開始設計,主要設計者為Robert GriesemerRob PikeKen 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 EnvironmentThe 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

 

相關文章