1. 程式人生 > >50 【Go版本變化】

50 【Go版本變化】

Go的版本介紹:https://golang.org/project/

 

https://golang.org/doc/go1.4

#Go1.4#

語言層面變化較少,但是編譯器而言是有巨大的突破的,體現在指標間的轉換。

這個release核心聚焦在實現工作上,重點是garbage collector(垃圾回收)和並行處理的垃圾回收器,這些改動也會在之後的幾個版本中不斷優化。
並且,棧區是連續的,需要記憶體時能真實分配地址,而不是通過link方式連結到其它區。這個版本也減輕了“hot stack split”的問題。

Go1.4也保證了相容性,絕大部分程式碼可以直接執行在上面,而不需要改動。

===改變:range===
for i, v := range x {
...
}
for i := range x {
...
}
Go1.3支援以上兩種range格式
Go1.4增加了一種range遍歷:
for range x {
...
}

===改變: Methods calls on **T===
type T int
func (T) M() {}
var x **T

both gc and gccgo accepted the method call
x.M()

這裡x是二維指標,需要兩次解引用。這種呼叫方式在Go1.4不再被允許

===change: 支援的平臺===
Android, NaCi on ARM, Plan9 on AMD64

===change: 相容性指導===
unsafe的型別轉換不保證相容性

===change: runtime的改進===
在Go1.4之前的版本,runtime(garbage collector, concurrency support, interface management, maps, slices, strings, ..)大部分是用c語言完成的,和少量的彙編語句。
Go1.4做出了改變,runtime已經完全換成Go語言了。這意味著Go能很精確的知道分配的空間和變數。

...

===Assembly===
===gccgo===
==改變: internal packages===


可能有些包僅放在包內,而不希望被外部所訪問。之前的Go是不支援的,Go1.4為了讓這種需求變得可能,定義了internal packages機制。
/a/b/c/internal/d/e/f,這裡的internal包僅允許/a/b/c所訪問,而不能被/a/b/g所呼叫。


===source layout調整===
去除了src/pkg這一層,從src/pkg/fmt調整為src/fmt

===SWIG===
Go1.4需要SWIG3.0.3版本

===效能===
大部分程式,1.4和1.3的效能相差相近,甚至有時候Go1.4會更慢。
GC肯定是更快了


=====標準庫=====
A,沒有新的packages
B,Major packages
. bufio.Scanner
. syscall
C. Minor packages
不再一一列出,參考:https://golang.org/doc/go1.4

==========Go1.5=========

 

Big:
. complier全部用C重寫,C編譯器不再需要了
. GC垃圾回收器現在是並行處理的(concurrent)
. 預設狀態,GOMAXPROCS變數和可用core數一致,之前的版本預設是1;
. internal packages機制全部支援,不是僅限於core package
. go提供了實驗性質的支援,對於vendor目錄
. go tool trace命令可一直追蹤除錯
. go doc可以custom,之前僅支援預設格式,不可修改

===Language change===
m := map[Point]string{
Point{29.935523, 52.891566}: "Persepolis",
Point{-25.352594, 131.034361}: "Uluru",
Point{37.422455, -122.084306}: "Googleplex",
}
m := map[Point]string{
{29.935523, 52.891566}: "Persepolis",
{-25.352594, 131.034361}: "Uluru",
{37.422455, -122.084306}: "Googleplex",
}
Go1.5可以支援Point不再顯式寫出來

===Implement===
==No more C==
編譯器和彙編器不再依賴C,是全部用Go重寫了。
僅僅C source是由cgo來處理的。這裡在Go1.4是由c編譯器處理的。Go1.5版本,即使C source tree,編譯的時候用的也是Go編寫的編譯器。

==編譯器和tools==
編譯器重寫後,編譯時會生成一些中間obj,之前的版本這些obj的字尾是.8g, .6g。Go1.5開始,這些object的字尾全部修改成.o

==GC垃圾回收器==
Go1.5 重新設計了GC的部分。GC的排程更優,期待GC延遲比之前要更好.

==Runtime & Build & Ports==


===Tools===
==Translating==
==Renaming==
==Moving==
==Compiler==
==Assembler==
==Linker==
==Go commands==
==Go vet command==
==Trace command==
==Go doc==
==Cgo==

===效能===
沒辦法準確地衡量,有的會更快,有的會更慢。很多剩餘工作需要完成,這些會放在Go1.6之後的版本完成。

===Core library===
. Flag
. Floats in math/big
. Go types
. Net
. Reflect
. Hardening

===Minor changes===
不再一一列出,參考:https://golang.org/doc/go1.5

 

=====Go1.6====


===語言變化===
沒有
===Ports===
===Tools===
==Cgo==
Cgo編譯器之前用go重寫了,這次又再次進行了優化。
主要變化:go和c可以共享Go分配的記憶體了

==Compiler工具鏈==
==Gccgo===
==Go command==
Go1.5開始對vendor進行實驗性的支援,Go1.6不再只是實驗性質,而是預設支援了。
==Go doc==
==Go vet==

===效能===
相比較Go1.5,有的更快,有的更慢了

===Core lib===
==Http2==
支援了Http2協議,client和server在使用HTTPS時能恰當地處理HTTP2請求

==Runtime==
runtime提供了maps輕量級的衝突檢測機制。
程式結束時的panic,tuntime預設列印當前running的goroutine棧資訊。而不是所有的goroutines,能顯著地快速定位到問題原因。

==Reflect==
==Sorting==
排序減少了10%的calls
==Templates==
{{block}}可以支援明明的子模板,能增加複用性
==Minor changes==
不再一一列出,參考:https://golang.org/doc/go1.6

 

===============Go1.7=====================


Go1.7增加了一些平臺的支援。更新了X86-64編譯器的後端模組。
也包含了以下包的修改:context包,x/net。testing包提供了對層次結構的testing的支援,以及benchmark的支援。
該版本徹底完成了對vendor的支援

====Language change====
==Ports==

====Tools====
==Assembler,Compiler Toolchain==
==Cgo==
Cgo的包現在可能可以支援Fortran原始碼(包括C,c++, Objective-C, SWIG),儘管Go繫結必須使用C語言API
Go綁定當前可能可以使用新的helper函式(C.CBytes)。
C.CString能把GO的string轉換成*C.byte(C語言的char*)
C.CBytes能把GO的[]byte轉換成unsafe.Pointer(C語言的void*)

==Gccgo==
==Go command==
==Go doc==
==Go vet==
==Go tool dist==
go tool dist list能將GO目前支援的所有的OS和平臺都列出來

==Go tool trace==
go tool trace已經在之前的版本中支援
1 收集traces資訊比之前的版本都更有效。收集trace的消耗時間是25%,之前的版本是400%。
2 trace file支援file和line number.
3 trace工具會break up大的trace以避免感染到正在請求的使用者

==效能==
當前版本,在我們的基礎效能測試中,code generation changes alone typically reduce program CPU time by 5-35%
感覺不是二進位制執行時間有調整,是程式碼編譯時間有降低

很多包有做優化,包括crypto/sha1, crypto/sha256等包

垃圾回收的pause也比Go1.6更短

==Core library==
=Context=
Go1.7把golang.org/x/net/context移動到標準庫context包。這就允許取消context,context超時,傳遞request-scoped資料,包括net包,net/http,os/exec等包
更多資訊參考release note
==http tracing==
go1.7引入了net/http/httptrace,這個包提供了對HTTP request的tracing event的支援

==Testing==
testing支援了subtest和subbenchmark的支援,使得層次化testing更方便

==Runtime==
runtime有多處改變,詳情請看release note,不再一一列出

==Minor change==
bufio...,不再一一列出,詳情請看release note
net/http中有較多修改

 


=====GO1.8=====


更新了compiler後端(生成更有效的程式碼)
減少了gc的pause時間(消除了stop-the-world的rescan)
增加了HTTP/2 push支援
增加了http的gracefull shutdown
增加了更多的context支援
啟用了profiling mutexes
簡化了sort slice

==語言變化==
func example() {
type T1 struct {
X int `json:"foo"`
}
type T2 struct {
X int `json:"bar"`
}
var v1 T1
var v2 T2
v1 = T1(v2) // now legal
}
之前的轉換忽略了tag資訊,現在加上了tag的轉換

====ports====
增加了更多的平臺的移植

====Tools====
==Assembler==
==Yacc==
yacc工具被移除。Go1.7中,yacc工具不再被go編譯器使用。它被放在golang.org/x/tools/cms/goyacc工具包中

==Fix==
==Pprof==
pprof工具可以檢測TLS server並且可以忽略證書驗證,使用https+insecure模式

==Trace==
trace工具支援了--pprof選項

==Vet==
==compiler toolchain==
==Cgo, Gccgo, Default GOPATH, Go get, Go doc, Plugins==


====Runtime====
Argument liveness:引數的存活時間,Go1.7支援一個變數長時間存活
Concurrent maps:併發情況下的maps下的亂用,增加了race detector,競爭檢測
Memstats:增加了執行時的記憶體監控,runtime.Memstats

====效能====
對效能影響比較難以估量,有一點點優化,包括bytes, crypto/aes等package

==GC==
gc的pause時間要比go1.7更少,通常是100毫秒,而且大部分是在10毫秒以內。有篇文章專門描述了此次優化 https://github.com/golang/proposal/blob/master/design/17503-eliminate-rescan.md

==Defer==
defer的開銷降低一半

==cgo==
go轉c的開銷降低一半

====標準庫====
==Sort==
sort包支援了less函式,意味著它更加通用,不用再重複編寫sort相關的程式碼

==Http2/push==
net/http包支援了傳送HTTP/2的server push
類似於Flusher/hijacker介面,http2的ResponseWriter實現了新的Pusher介面

==Http server graceful shutdown==
http伺服器能支援graceful shudown,使用Server.shutdown方法

==More context support==

==Mutex contention profiling==
支援對包含內容的mutext進行profile

=====Minor changes===
細小改變很多,不再一一列出,詳情請看release note
其中改動較多的有net/http, net/url, os, time等包

 


======GO1.9=====

 

====語言上的變動====
1,支援型別重新命名: type T1 = T2
2,x*y + z,float64(x*y)+z這兩種形式不同,具體為啥不同,沒看懂

===Ports移植平臺====
====Tools====
並行編譯
vendor: 用./...不再匹配vendor的包,新的格式: ./vendor/...
GOROOT
Compiler toolchain
Aessmbler
Doc
Env
Test
Pprof
Vet

====runtime===
支援列印棧內幀
runtime.CallersFrames在Go1.7就支援了

====效能====
大部分程式會更快那麼一點點,原因是GC的加速,better generated code,核心庫的優化


====Core library====
Transparent Monotonic Time support:看不懂
New bit manipulation package:數學的bits運算,看不懂
Test helper func:(*T).Helper (*B).Helper
Concurrent maps:併發的maps操作是支援的,這個包在package sync中,map type。在多個goroutine的增刪改是安全的
Profiler labels:runtime/pprof包現在支援對pprof加標籤

====Minor changes====
不再一一列出,詳情請看release notes
比較多的修改點有:database/sql, net/http, time