golang1.5について
go/doc/go1.5.htmlとThe State of Goの内容をベースにgo1.5の変更点をまとめた。 調査が足らない項目(Execution Tracing)は後日調査しよう。
大きな変更点
- No more C
- 並列実行GC
- GOMAXPROCSのデフォルト値変更
- internal packagesサポート
- "vendoring" external dependenciesサポート(experimental)
- fine-grained tracing of program execution
- go doc command-line use
言語仕様変更
Map literalsで要素の型記述が不要になった(型推論)。
変更前
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", }
No more C
コンパイラと実行環境は、GoとアセンブラのみでCソースは含まれていない。唯一のCコードはテストとcgo関連のみ。
同一言語でコンパイラを実装することを「ブートストラップ」というがGoがCを捨てたのは違う理由らしい。
- GoはCより正しく書くのが簡単
- GoはCよりデバッグが簡単(デバッガがなくても)
- Goはあなたが知る必要のある唯一の言語
- GoはCよりモジュール化、ツール、テスト、プロパイリングが良い環境
- GoはCより並列実行のCPUコストが低い
ブートストラップとは,“コンパイルの対象とするプログラミング言語そのものでコンパイラ(またはアセンブラ)を開発するプロセス”のことだ。一般的にブートストラップには,次のようなメリットがあると言われている。
関連情報
- From C to Go - The State of Go
- Go 1.3+ Compiler Overhaul
- Go in Go
- Go 1.5のブートストラップ化を目指すGoogle
- ブートストラップ問題 - Wikipedia
並列実行GC
ゴール
- 10秒以下のレイテンシ
- Goアプリを少なくても40〜50msec実行
処理速度性能
- メモリ使用量・CPU時間を増やしてGCによるポーズ時間を短くする。
- 並列処理向上(GOMAXPROCS=CPUコア数)
ことによって、Go 1.5は1.4に比べて向上した。
関連資料
- Concurrent Garbage Collector - The state of Go
- Mostly-Concurrent Mark & Sweep GC のアルゴリズム
- Go 1.4+ Garbage Collection (GC) Plan and Roadmap
- Go GC: Latency Problem Solved
GOMAXPROCSのデフォルト値変更
1からコア数に変更になった。
internal packageサポート
パッケージimportの規約。パッケージのパスにinternalが付いている場合、internalの親パス以外のからはアクセス出来ない。
/a/b/c/internal/d/e/fというパッケージのコードは、ルートディレクトリ(/a/b/c)でしかimportできない。/a/b/gのコードからはimportできない。
原文
For example:
- Code in /a/b/c/internal/d/e/f can be imported only by code in the directory tree rooted at /a/b/c. It cannot be imported by code in /a/b/g.
- $GOROOT/src/pkg/internal/xxx can be imported only by other code in the standard library ($GOROOT/src/).
- $GOROOT/src/pkg/net/http/internal can be imported only by the standard net/http and net/http/* packages.
- $GOPATH/src/mypkg/internal/foo can be imported only by code in $GOPATH/src/mypkg.
関連資料
- Go 1.4 “Internal” Packages
- golang - go1.4で追加されたinternal packageについて - Qiita
- Go 1.4 "Internal" Packages - Google ドキュメント
Vendoring external package()experimental
importするコード(ライブラリ)が依存するパッケージの取り込み方。ライブラリのVersioningと同じくある程度以上の製品を開発する場合に問題になる。
関連資料
Execution Tracing
新しい実行トレーサは実行時データを収集し、ダイアグラムを作成することができる。フロントエンドは、Android/Chrome trace-viewer。
関連資料
Analysis and Refactoring Tools
解析ツール
- oracle: a tool for answering questions about Go source code (w/ plugins for Sublime Text and Emacs).
- callgraph: display the call graph of a Go program.
- godoc -analysis=pointer: see pointer analysis details in godoc.
リファクタリング・ツール
- eg: a template-based refactoring tool
- gorename: type-safe renaming of identifiers in Go source code.
shared library
ビルドモードに、c-sharedとc-archiveが追加された。
go1.5のshared library機能を使ってみた - unokun’s blog参照。