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

2021-01-09 開源中國

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 重寫後的一些改進:

最後三個都不可能用 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 要省去那些特性?

代碼清晰明了是首要的

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

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

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

(不要變的太枯燥)

詳細的設計背景請看:

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

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

相關焦點

  • Go語言為什麼這麼火?Go+Iris vs Java+SpringBoot 為您揭曉答案
    現在市面上的大廠:華為、阿里巴巴、騰訊、百度、拼多多、京東、字節跳動、小米、美團、360……已經沒有不用go語言的了……而且,不僅如此很多公司在重構自己之前的系統時,都不約而同地選擇了go語言作為主要技術棧,而沒有用在國內更成熟的java,比如B站、知乎、羅輯思維……這難免讓人困惑從生態上來講,java在國內的生態建設應該略勝go
  • Go+iris吊打Java+SpringBoot,是Java老了嗎?且慢,Vert.x有話說
    Go+Iris vs Java+SpringBoot 為您揭曉答案那個結果很容易給人一個錯覺:是java老了嗎?當然不是!Java界的性能擔當根本就不是Spring,只是因為國內用java的web框架主要是Spring,我們才拿它來測……本次我們就請出java界的性能擔當——Vert.x,跟Iris再比一次這次的結果會比較有說服力因為iris在官網自稱自己是 the fastest web framework,請注意:它並沒有加任何修飾詞,比如go語言中最快的,而是直說是最快的
  • Go語言和Java、Python等其他語言的對比分析
    這是因為Go提供了軟體生命周期(開發、測試、部署、維護等等)的各個環節的工具,如go tool、gofmt、go test。三、對比其他語言Go的很多語言特性借鑑與它的三個祖先:C,Pascal和CSP。
  • 問號臉為什麼 Java 中1000==1000 為 false而 100==100 為 true
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫為什麼 Java 中「1000==1000」為false,而」100==100「為true?這是一個挺有意思的討論話題。
  • Java enum的用法詳解
    ); // 成員變量 private String name; private int index; // 構造方法 private Color(String name, int index) { this.name = name; this.index = index; } // 普通方法 public static String getName(int index) { for (Color c
  • 跟我學java編程—Java條件運算符
    在D盤Java目錄下,新建「TaxSample.java」文件。用記事本打開「TaxSample.java」文件,輸入以下代碼:代碼結構分析程序功能主要是演示條件運算符的使用。編譯「TaxSample.java」文件,在命令行窗口輸入「javac TaxSample.java」並執行命令,編譯通過後,在命令行窗口輸入「java TaxSample」運行Java程序,命令行窗口顯示如下信息:
  • 萬字概覽 Java 虛擬機
    JVM 本質上是作業系統上的一個進程,它的運行需要內存空間,而 JVM 運行時內存模型描述的就是 JVM 怎麼劃分和管理這些內存。Stack 為什麼是線程私有的,這涉及到「棧上分配」和「TLAB」兩個概念。棧上分配所謂棧上分配就是允許將對象直接分配在棧上,而不用分配到 Heap 中。這樣對象會隨著棧幀的出棧自動銷毀,不用等待 GC 進行回收,從而提高性能。但是要實現棧上分配是非常複雜的,涉及到「逃逸分析」和「標量替換」兩項技術。
  • 什麼,JAVA的泛型是偽泛型
    通過現代idea自動編譯功能,由此可以大大提高我們的編程效率但是有關java的泛型有一些值得思考的問題:方法重載代碼示範字節碼片段然後用jd-gui工具反編譯回java反編譯的代碼跟我們之前寫的代碼不一致了,代碼風格也用回1.5之前的強制類型轉換了,即高版本支持某些語法糖的編程風格編譯之後轉化為低版本代碼風格了(解語法糖)現在我們可以知道為什麼用兩個不同List類型參數重載getName方法會編譯報錯了:兩個不同List類型參數,在編譯的時候都轉為List<Object>了,然後就不符合重載的定義了所以有個哲學上的問題
  • Java 查找替換Excel數據
    使用工具工具:Free Spire.XLS for Java (免費版)註:可通過e-iceblue中文官網在Java產品板塊下載包,並解壓將lib文件夾下的jar文件導入java程序;或者通過maven倉庫下載導入。Jar導入效果:
  • JAVA專業術語面試100問
    前言:面試技巧另外開篇再說,先上面試乾貨吧。Redis、消息隊列、SQL不要走開,關注後更精彩!1、面向對象的特點有哪些?4、java有哪些基本數據類型?5、數組有沒有length()方法?String有沒有length()方法?數組沒有length()方法,它有length屬性。String有length()方法。
  • Java泛型了解麼?什麼是類型擦除?介紹一下常用的通配符?
    表示不確定的 java 類型T (type) 表示具體的一個java類型K V (key value) 分別代表java鍵值中的Key ValueE (element) 代表Element
  • 如何使用動詞GO-How to Use the Verb GO: Go To, Go For, Go On
    The following lists help you remember when to use go, go to, go to the, go to a, go forand go on.下面的列表幫助你記住什麼時候使用go, go to, go to, go to a, go for and go on。
  • Java必懂線程,這些你都知道麼?
    CompareAndSwapInt這個方法 發現它是 cas操作再往下看是 native c語言實現的。跟蹤 c源碼 可以看到automic_linux_x86.inline.hpp有一個_asm_volatile 彙編硬體語言來實現的。裡面是Cmpxchg 一個cpu。 多個cpu 前面還會加lock指令。
  • Java 14發布了,不使用"class"也能定義類了?還順手要幹掉Lombok!
    這些定義,儘管在語義上有所不同,但是它們的共同點是類的部分或全部狀態可以直接在類頭中描述,並且這個類中只包含了純數據而已。於是,他提出Java中是不是也可以通過如下方式定義一個純數據載體呢?javac --enable-preview --release 14 Person.java  Note: Person.java uses preview language features.
  • 盤點:非智能java通用版軟體下載TOP5
    下面是國產手機下載排行榜排名前五的手機軟體,都是支持java的通用版軟體綠色無毒,歡迎下載。下面是國產手機下載排行榜排名前五的手機軟體,都是支持java的通用版軟體綠色無毒,歡迎下載。下面是國產手機下載排行榜排名前五的手機軟體,都是支持java的通用版軟體綠色無毒,歡迎下載。
  • Afterglow第6張單曲「Easy come,Easy go!」今天發售!
    Afterglow第6張單曲「Easy come,Easy go!」今天發售!中的王道系女子搖滾樂隊Afterglow第6張單曲「Easy come,Easy go!」今天開始發售。
  • Java之throw關鍵字的簡單介紹
    告知方法調用者「傳遞的數組值是null」*/if(arr==null){throw new NullPointerException("傳遞的數組值是null");}String ele=arr[index];return ele;}}運行結果:Exception in thread "main" java.lang.NullPointerException
  • 貼吧為什麼滑稽表情無法顯示 滑稽表情顯示滑稽go die是什麼意思
    滑稽表情顯示滑稽go die是什麼意思?許多小夥伴在貼吧裡發滑稽表情卻無法顯示,這是什麼情況呢,想要知道具體的情況的小夥伴,請趕快來看看吧!小編為大家一一解答! ... 貼吧為什麼滑稽表情無法顯示?滑稽表情顯示滑稽go die是什麼意思?