[インデックス 19065] ファイルの概要
このコミットは、Go 1.3 リリースノートのドキュメントファイル doc/go1.3.html
の更新に関するものです。Go 1.3 の主要な変更点、特にリンカの改良、go
コマンドの関連変更、およびその他の雑多な更新について記述が追加・修正されています。このドキュメントは、Go 1.3 の新機能や改善点をユーザーに伝えるための公式な情報源となります。
コミット
commit c5f14c55c19d872921b476187f153a7361a80fa7
Author: Rob Pike <r@golang.org>
Date: Wed Apr 9 08:19:35 2014 +1000
doc/go1.3.html: linker, go command, miscellany
LGTM=bradfitz
R=golang-codereviews, bradfitz
CC=golang-codereviews
https://golang.org/cl/85660043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/c5f14c55c19d872921b476187f153a7361a80fa7
元コミット内容
doc/go1.3.html: linker, go command, miscellany
LGTM=bradfitz
R=golang-codereviews, bradfitz
CC=golang-codereviews
https://golang.org/cl/85660043
変更の背景
Go 1.3 は、Go 言語の重要なリリースの一つであり、言語仕様の変更は含まれていませんが、内部実装に大きな改良が加えられました。このコミットは、そのGo 1.3のリリースノートであるdoc/go1.3.html
を更新し、ユーザーに対してこれらの重要な変更点を正確に伝えることを目的としています。特に、コンパイラとリンカのアーキテクチャ変更、ガベージコレクションの進化、および開発ツールの改善は、Goのパフォーマンスと開発体験に大きな影響を与えるため、その詳細を明確に記述する必要がありました。
前提知識の解説
このコミットの変更内容を理解するためには、以下の概念について基本的な知識があると役立ちます。
- Go言語のリリースサイクル: Go言語は通常、6ヶ月ごとにメジャーリリースを行います。各リリースでは、言語仕様の変更は最小限に抑えられ、主にパフォーマンスの向上、ツールの改善、新しいプラットフォームのサポートに焦点が当てられます。
- コンパイラとリンカ:
- コンパイラ: ソースコード(Go言語)を機械が理解できるオブジェクトコードに変換するプログラムです。
- リンカ: コンパイラによって生成された複数のオブジェクトファイルやライブラリを結合し、実行可能なプログラムを生成するプログラムです。
- 命令選択 (Instruction Selection): コンパイラのバックエンドの一部であり、中間表現(IR)の操作をターゲットプロセッサの具体的な機械語命令にマッピングするプロセスです。効率的なコード生成において重要なステップです。
- ガベージコレクション (Garbage Collection, GC): プログラムが動的に確保したメモリ領域のうち、もはや使用されなくなったものを自動的に解放する仕組みです。GoのGCは、並行性(concurrent)と精度(precise)を重視しています。
- Goのメモリモデル: Goプログラムにおけるメモリ操作の順序付けと可視性に関するルールを定義したものです。並行プログラミングにおいて、データ競合を避け、予測可能な動作を保証するために重要です。
go.tools
リポジトリ: Goプロジェクトの一部として、Go言語の開発を支援する様々なツールが格納されているリポジトリです。go
コマンド自体とは別に管理されることが多いです。panic(nil)
: Go言語におけるパニック(実行時エラー)の一種で、nil
値を引数としてpanic
関数を呼び出すことです。これは通常、プログラマの意図しないエラーであり、テストコードで発生した場合に診断されるべき挙動です。
技術的詳細
このコミットで更新されたGo 1.3のリリースノートには、以下の重要な技術的変更が記述されています。
-
リンカの抜本的な見直しとコンパイラツールチェーンの再構築:
- Go 1.3では、リンカのアーキテクチャが大幅に見直されました。これまではリンカの一部であった「命令選択」フェーズが、
liblink
という新しいライブラリを通じてコンパイラ側に移動されました。 - この変更により、パッケージが最初にコンパイルされる際に命令選択が一度だけ行われるようになり、特に大規模なプロジェクトのコンパイル速度が大幅に向上しました。これは、ビルドプロセスのボトルネックを解消し、開発者の生産性を高めるための重要な最適化です。
- リンカ自体は依然としてC言語で書かれていますが、この役割分担の変更により、コンパイラとリンカ間の連携がより効率的になりました。
- この内部的な大きな変更にもかかわらず、既存のGoプログラムへの影響はないとされています。
- Go 1.3では、リンカのアーキテクチャが大幅に見直されました。これまではリンカの一部であった「命令選択」フェーズが、
-
正確なガベージコレクション (Precise Garbage Collection):
- Go 1.3では、ガベージコレクタが「正確な(precise)」GCをサポートするようになりました。これは、GCがメモリ内のポインタと非ポインタデータを正確に区別できることを意味します。
- 正確なGCは、誤って非ポインタデータをポインタとして解釈してしまい、本来解放されるべきメモリが解放されない(メモリリーク)といった問題を回避し、GCの効率性と信頼性を向上させます。これにより、メモリ使用量の削減やGCの一時停止時間の短縮に寄与します。
-
スタックサイズの変更:
- Go 1.2で8キロバイトに増加された最小スタックサイズが、Go 1.3では新しいスタックモデルの導入により4キロバイトに戻されました。
- これは、Goのゴルーチン(軽量スレッド)がより少ないメモリで起動できるようになり、多数のゴルーチンを生成するアプリケーションのメモリフットプリントを削減する効果があります。
-
misc/benchcmp
ツールの変更:- ベンチマーク結果を比較するためのツールである
misc/benchcmp
が、メインリポジトリ内のシェルスクリプトおよびawkスクリプトから、go.tools
リポジトリ内のGoプログラムとして完全に書き直されました。 - これにより、ツールの保守性、移植性、および機能拡張性が向上しました。
- ベンチマーク結果を比較するためのツールである
-
misc/dist
ツールの名称変更と移動:- Goディストリビューションをビルドするためのツールである
misc/dist
が、misc/makerelease
に名称変更され、引き続きメインリポジトリ内に配置されました。これは、ツールの目的をより明確にするための変更です。
- Goディストリビューションをビルドするためのツールである
-
testing
パッケージの改善:testing
パッケージが、panic(nil)
を呼び出すテストを診断するようになりました。panic(nil)
はほとんどの場合、プログラマの意図しないエラーであるため、この診断機能はテストの品質と信頼性を向上させます。
-
Windows 2000のサポート終了:
- Microsoftが2010年にWindows 2000のサポートを終了したことに伴い、Go 1.3でもWindows 2000のサポートが正式に終了しました。
-
SolarisおよびGoogle Native Client (NaCl) のサポート:
- Go 1.3では、SolarisオペレーティングシステムとGoogleのNative Client (NaCl) アーキテクチャのサポートが追加されました。これにより、Goアプリケーションの実行環境の選択肢が広がりました。
コアとなるコードの変更箇所
このコミットは、Go 1.3のリリースノートであるdoc/go1.3.html
ファイルに対する変更です。具体的なコードの変更は、HTMLドキュメント内のテキストの追加、削除、修正が中心となります。
--- a/doc/go1.3.html
+++ b/doc/go1.3.html
@@ -9,11 +9,13 @@
<p>
The latest Go release, version 1.3, arrives six months after 1.2,
and contains no language changes.
-It does have some important developments, though,
-including a refinement to the memory model regarding synchronization,
+It focuses primarily on implementation work, providing
precise garbage collection,
+a major refactoring of the compiler tool chain that results in
+faster builds, especially for large projects,
significant performance improvements across the board,
-and support for Google's Native Client architecture (NaCl).
+and support for Solaris and Google's Native Client architecture (NaCl).
+It also has an important refinement to the memory model regarding synchronization.
As always, Go 1.3 keeps the <a href="/doc/go1compat.html">promise
of compatibility</a>,
and almost everything
@@ -34,7 +36,7 @@ TODO
</p>
-<h3 id="windows2000">Removal of support for Windows 2000</h3>
+<h3 id="win2000">Removal of support for Windows 2000</h3>
<p>
Microsoft stopped supporting Windows 2000 in 2010.
@@ -77,10 +79,6 @@ Go 1.2 increased the minimum stack size to 8 kilobytes; with the new stack model
put back to 4 kilobytes.
</p>
-<p>
-<em>Updating</em>: TODO
-</p>
-
<h3 id="garbage_collector">Changes to the garbage collector</h3>
<p>
@@ -91,13 +89,18 @@ liveness (TODO what to say)\n <h3 id="liblink">The linker</h3>
<p>
-TODO compiler/linker boundary moved
-
-TODO: liblink: pull linker i/o into separate liblink C library (CL 35790044)
+As part of the general <a href="http://golang.org/s/go13linker">overhaul</a> to
+the Go linker, the compilers and linkers have been refactored.\n+The linker is still a C program, but now the instruction selection phase that\n+was part of the linker has been moved to the compiler through the creation of a new\n+library called <code>liblink</code>.\n+By doing instruction selection only once, when the package is first compiled,\n+this can speed up compilation of large projects significantly.\n </p>
<p>
-<em>Updating</em>: TODO
+<em>Updating</em>: Although this is a major internal change, it should have no\n+effect on programs.\n </p>
<h3 id="gccgo">Status of gccgo</h3>
@@ -117,9 +120,16 @@ cmd/go: cover -atomic for -race (CL 76370043)\n
<h3 id="misc">Miscellany</h3>
+<p>\n+The program <code>misc/benchcmp</code> that compares\n+performance across benchmarking runs has been rewritten.\n+Once a shell and awk script in the main repository, it is now a Go program in the <code>go.tools</code> repo.\n+Documentation is <a href="http://godoc.org/code.google.com/p/go.tools/cmd/benchcmp">here</a>.\n+</p>\n+\n <ul>
+-<li> TODO: misc/benchcmp: removed and replaced by go.tools/cmd/benchcmp (CL 47980043)</li>
+-<li> TODO: misc/dist: renamed misc/makerelease (CL 39920043)</li>
+For the few of us that build Go distributions, the tool <code>misc/dist</code> has been\n+moved and renamed; it now lives in <code>misc/makerelease</code>, still in the main repository.\n </ul>
@@ -256,7 +266,7 @@ non-printing.\n
<li>
The <a href="/pkg/testing/"><code>testing</code></a> package now
-diagnoses tests that call <code>panic(nil)</code>, which is almost always erroneous.\n+diagnoses tests that call <code>panic(nil)</code>, which are almost always erroneous.\n </li>
<li>
コアとなるコードの解説
このコミットの主要な変更は、Go 1.3のリリースノートであるdoc/go1.3.html
の内容を更新し、Go 1.3で導入された重要な変更点を正確に反映させることです。
-
Go 1.3の概要の更新: リリースノートの冒頭部分が修正され、Go 1.3が言語変更を含まないこと、そして主に実装作業に焦点を当てていることが強調されています。具体的には、「正確なガベージコレクション」、「コンパイラツールチェーンの大規模な再構築によるビルドの高速化(特に大規模プロジェクト向け)」、「全体的なパフォーマンスの大幅な向上」、「SolarisおよびGoogle Native Client (NaCl) のサポート」、そして「メモリモデルの同期に関する重要な改良」が挙げられています。これにより、Go 1.3の主要な特徴が明確に示されています。
-
Windows 2000サポート終了の見出しIDの修正: 技術的な内容の変更ではありませんが、見出しのIDが
windows2000
からwin2000
に修正されています。これはドキュメント内部の整合性やリンクの正確性を保つための微調整です。 -
リンカに関する詳細な記述の追加:
- 以前は「TODO compiler/linker boundary moved」や「TODO: liblink: pull linker i/o into separate liblink C library (CL 35790044)」といったプレースホルダーがあった箇所に、リンカの抜本的な見直しに関する具体的な説明が追加されました。
- リンカのオーバーホールの一環として、コンパイラとリンカがリファクタリングされたこと、リンカの一部であった命令選択フェーズが
liblink
という新しいライブラリを通じてコンパイラに移動されたことが明記されています。 - この変更により、パッケージが最初にコンパイルされる際に命令選択が一度だけ行われるため、大規模プロジェクトのコンパイルが大幅に高速化されるというメリットが強調されています。
- また、この変更は内部的なものであり、プログラムには影響がないことも追記されています。
-
misc/benchcmp
とmisc/dist
に関する記述の更新:misc/benchcmp
がシェル/awkスクリプトからGoプログラムに書き直され、go.tools
リポジトリに移動したことが明確に記述されました。これに伴い、古いTODOコメントが削除されています。misc/dist
がmisc/makerelease
に名称変更され、メインリポジトリ内に引き続き存在することが記述されました。これも古いTODOコメントの置き換えです。
-
testing
パッケージの改善に関する記述の修正:testing
パッケージがpanic(nil)
を呼び出すテストを診断するようになったことについて、文法的な修正(which is almost always erroneous
からwhich are almost always erroneous
へ)が行われています。
これらの変更は、Go 1.3のリリースノートをより正確で、詳細かつ包括的なものにするための重要な更新です。
関連リンク
- Go 1.3 Release Notes (公式ドキュメント): https://golang.org/doc/go1.3 (このコミットが更新しているドキュメントの最終版)
- Go 1.3 Linker Overhaul Design Document: http://golang.org/s/go13linker (リンカの変更に関する詳細な設計ドキュメント)
go.tools/cmd/benchcmp
Godoc: http://godoc.org/code.google.com/p/go.tools/cmd/benchcmp (benchcmp
ツールのドキュメント)
参考にした情報源リンク
- Go 1.3 Release Notes (公式ドキュメント): https://golang.org/doc/go1.3
- Go 1.3 Linker Overhaul Design Document: http://golang.org/s/go13linker
- Go Memory Model: https://golang.org/ref/mem
- Go Garbage Collection: https://golang.org/doc/gc-guide
- Go
testing
package: https://golang.org/pkg/testing/ - Go
go.tools
repository: https://go.googlesource.com/tools - Wikipedia - Compiler: https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9
- Wikipedia - Linker: https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%B3%E3%82%AB
- Wikipedia - Instruction selection: https://en.wikipedia.org/wiki/Instruction_selection