Go 擺脫了 C,又惹上了 Java?

jopen 9年前發布 | 22K 次閱讀 Go語言

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 擺脫了 C,又惹上了 Java?

《Go in Go》

隨著 Go 1.5 版本的開發,現在整個系統都是使用 Go 編寫的(有一小部分匯編)

C 已經成為過去時了。

注: gccgo 仍然很強大
這篇文章主要探討原始編譯器 gcc

為什么之前用 C 編寫?

啟動

(而且 Go 的主要目的不是作為一個編譯器實現語言)

為什么編譯器使用 Go 重寫?

不單單是驗證,我們還有更多實際的原因:

  • Go 比 C 容易編寫(實際上)

  • Go 比 C 容易調試(即使沒有調試器的情況下)

  • Go 將成為你唯一需要會的語言,鼓勵貢獻

  • Go 有更好的模塊化,工具鏈,測試工具,配置工具等等

  • Go 很簡單就能進行并行操作

雖然看起來很多優勢,但是還是夸的太早了:)

設計文檔: golang.org/s/go13compiler  

為什么運行時也是用 Go 重寫?

我們有自己的 C 編譯器來編譯運行時,我們需要一個帶有跟 Go ABI 一樣編譯器,比如 segmented stacks。

使用 Go 編寫可以擺脫 C 編譯器的劣勢,這是比使用 Go 重寫編譯器還重要。

(所有使用 Go 重寫編譯器的理由都可以作為使用 Go 重寫運行時的理由)

限制運行時只用一種語言編寫,更容易進行集成,管理 stack 等等操作。

跟往常一樣,簡化是首要的考慮因素。

歷史

為什么我們要有完全屬于自己的工具鏈?

  • 我們的 ABI?

  • 我們自身的文件格式?

Go 的大規模重大改進要比 GCC 或者 LLVM 要更困難。

news.ycombinator.com/item?id=8817990

重大改進

由于使用自身工具簡化的功能和使用 Go 重寫后的一些改進:

  • linker 重構

  • 新垃圾收集器

  • 堆疊圖

  • 連續棧

  • 寫屏障

最后三個都不可能用 C 實現:

  • C 是非類型安全的

  • 因為最佳化而造成堆棧槽混淆

(Gccgo 很快會有 segmented stacks 和 imprecise (stack) collection )

更多技術細節改進請看 PPT 原文。

啟動

不需要 C 編譯器,只需要一個 Go 編譯器

因此需要從 1.5 的源代碼去下載安裝構建 Go

我們使用 Go 1.4+ 作為基礎庫來構建 1.5+ 的工具鏈

詳情: golang.org/s/go15bootstrap  

未來

未來仍然有很多任務要完成,但是 1.5 已經完成的差不多了。

未來的計劃:

  • 更好的轉義分析

  • 新編譯器后端使用 SSA(使用 Go 會比 C 簡單很多)

更多優化:

  • 從 PDFs (或者是 XML)生成機器描述,將會有一個純機器生成指令定義,“從 PDF 讀入,寫出一個匯編配置”;

  • 已經部署反匯編程序

總結

擺脫 C 是 Go 項目的一個巨大改進,代碼更整潔,提升可測試性,可部署性,也更容易運行。

新的統一工具鏈減少了代碼數量,提升可維護性。

靈活的工具鏈對可移植性也很重要。

《The State of Go》

這篇 PPT 主要講解了 Go 1.5 的開發成果,用數據說話,各種圖表顯示 Go 1.5 跟 Go 1.4 簡直不是一個級別的,大量的優化和極高的性能提升。

Go 1.5 主要特性:

1. 并發垃圾收集機制,目標是:GC 延遲小于 10 毫秒。

Go 擺脫了 C,又惹上了 Java?

新的垃圾收集機制是花費一些內存和 CPU 時間來換取更低的延遲時間:

Go 擺脫了 C,又惹上了 Java?

2. 更高的并發性能,設置 GOMAXPROCS=N (where N is your number of CPUs):

更好的 goroutines 執行性能:

Go 擺脫了 C,又惹上了 Java?

更好的 goroutines 轉換性能:

Go 擺脫了 C,又惹上了 Java?

3. 整體性能

Go 擺脫了 C,又惹上了 Java?

Go 擺脫了 C,又惹上了 Java?

《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 要省去那些特性?

代碼清晰明了是首要的

當查看代碼時,可以很清晰的知道程序將會做什么

當編寫代碼的時候,也可以很清晰的讓程序做你想做的

有時候這意味著編寫出一個循環而不是調用一個模糊的函數。

(不要變的太枯燥)

詳細的設計背景請看:

更多詳細內容和代碼示例請看 OSC 翻譯頻道:http://www.oschina.net/translate/go-for-java-programmers-ppt

原文和所有圖片都來自 talks.golang.org。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!