這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
talks.golang.org 前幾天放出了 PPT《Go in Go》和 《The State of Go》講解最近 Go 的開發動態和成果:
隨著 Go 1.5 版本的開發,現在整個系統都是使用 Go 編寫的(有一小部分彙編)
C 已經成為過去時了。
Go 1.5 計劃在 8 月份發布,將會嘗試支援 iOS。(Go 1.4 已經正式支援 Android)
4月份進行的 NYJavaSIG 聚會上 Go 團隊的技術主管經理分享了《Go for Java Programmers》,為 Java 程式員提供的 Go 入門指南,正式向 Java 領域進軍了嗎?
OSC 上兩年前就有 Go 要涉獵 Java 領域的文章和討論了:
不知道現在大家的看法是否有些改變。
《Go in Go》
隨著 Go 1.5 版本的開發,現在整個系統都是使用 Go 編寫的(有一小部分彙編)
C 已經成為過去時了。
註: gccgo 仍然很強大
這篇文章主要探討原始編譯器 gcc
為什麼之前用 C 編寫?
啟動
(而且 Go 的主要目的不是作為一個編譯器實現語言)
為什麼編譯器使用 Go 重寫?
不單單是驗證,我們還有更多實際的原因:
雖然看起來很多優勢,但是還是誇的太早了:)
設計文檔: golang.org/s/go13compiler
為什麼運行時也是用 Go 重寫?
我們有自己的 C 編譯器來編譯運行時,我們需要一個帶有跟 Go ABI 一樣編譯器,比如 segmented stacks。
使用 Go 編寫可以擺脫 C 編譯器的劣勢,這是比使用 Go 重寫編譯器還重要。
(所有使用 Go 重寫編譯器的理由都可以作為使用 Go 重寫運行時的理由)
限制運行時只用一種語言編寫,更容易進行整合,管理 stack 等等操作。
跟往常一樣,簡化是首要的考慮因素。
曆史
為什麼我們要有完全屬於自己的工具鏈?
Go 的大規模重大改進要比 GCC 或者 LLVM 要更困難。
news.ycombinator.com/item?id=8817990
重大改進
由於使用自身工具簡化的功能和使用 Go 重寫後的一些改進:
linker 重構
新垃圾收集器
堆疊圖
連續棧
寫屏障
最後三個都不可能用 C 實現:
(Gccgo 很快會有 segmented stacks 和 imprecise (stack) collection )
更多技術細節改進請看 PPT 原文。
啟動
不需要 C 編譯器,只需要一個 Go 編譯器
因此需要從 1.5 的原始碼去下載安裝構建 Go
我們使用 Go 1.4+ 作為基礎庫來構建 1.5+ 的工具鏈
詳情: golang.org/s/go15bootstrap
未來
未來仍然有很多任務要完成,但是 1.5 已經完成的差不多了。
未來的計劃:
更多最佳化:
總結
擺脫 C 是 Go 項目的一個巨大改進,代碼更整潔,提升可測試性,可部署性,也更容易運行。
新的統一工具鏈減少了代碼數量,提升可維護性。
靈活的工具鏈對可移植性也很重要。
《The State of Go》
這篇 PPT 主要講解了 Go 1.5 的開發成果,用資料說話,各種圖表顯示 Go 1.5 跟 Go 1.4 簡直不是一個層級的,大量的最佳化和極高的效能提升。
Go 1.5 主要特性:
1. 並發垃圾收集機制,目標是:GC 延遲小於 10 毫秒。
新的垃圾收集機制是花費一些記憶體和 CPU 時間來換取更低的延遲時間:
2. 更高的並發效能,設定 GOMAXPROCS=N (where N is your number of CPUs):
更好的 goroutines 執行效能:
更好的 goroutines 轉換效能:
3. 整體效能
《Go for Java programmers》
這是 Google 的 Go 團隊技術主管經理 Sameer Ajmani 分享的 PPT,為 Java 程式員快速入門 Go 而準備的。
Go 和 Java 有很多共同之處
C 系列 (強型別,括弧)
靜態類型
垃圾收集
記憶體安全 (nil 引用,運行時邊界檢查)
變數總是初始化 (zero/nil/false)
方法
介面
類型斷言 (執行個體)
反射
Go 與 Java 的不同之處
代碼程式直接編譯成機器碼,沒有 VM
靜態連結二進位
記憶體布局控制
函數值和詞法閉包
內建字串 (UTF-8)
內建泛型映射和數組/片段
內建並發
Go 特意去掉了大量的特性
沒有類
沒有構造器
沒有繼承
沒有 final
沒有異常
沒有註解
沒有自訂泛型
為什麼 Go 要省去那些特性?
代碼清晰明了是首要的
當查看代碼時,可以很清晰的知道程式將會做什麼
當編寫代碼的時候,也可以很清晰的讓程式做你想做的
有時候這意味著編寫出一個迴圈而不是調用一個模糊的函數。
(不要變的太枯燥)
詳細的設計背景請看:
Less is exponentially more (Pike, 2012)
Go at Google: Language Design in the Service of Software Engineering (Pike, 2012)
更多詳細內容和程式碼範例請看 OSC 翻譯頻道:http://www.oschina.net/translate/go-for-java-programmers-ppt。
原文和所有圖片都來自 talks.golang.org。