Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 18953] ファイルの概要

このコミットは、Go 1.3 リリースノートの骨子となる doc/go1.3.html ファイルを新規作成し、既存のテキストベースのリリースノート doc/go1.3.txt を削除するものです。新しいHTMLファイルは、Go 1.3で導入される主要な変更点や新機能について、詳細な説明が記述される予定のセクションを定義しています。多くのセクションはまだ「TODO」としてマークされていますが、リリースノートの全体的な構造と、Go 1.3のハイライトとなる機能のリストが示されています。

コミット

commit 09e1da3c2ce366eb52e3c038b4f5a8686e0011b6
Author: Rob Pike <r@golang.org>
Date:   Wed Mar 26 13:56:16 2014 +1100

    doc/go1.3.html: new release document outline
    Almost all TODOS, but the structure is there and it has the details
    from go1.3.txt, which is hereby deleted.
    
    LGTM=dominik.honnef, adg
    R=golang-codereviews, dominik.honnef, adg
    CC=golang-codereviews
    https://golang.org/cl/80240044

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/09e1da3c2ce366eb52e3c038b4f5a8686e0011b6

元コミット内容

--- a/doc/go1.3.html
+++ b/doc/go1.3.html
@@ -0,0 +1,183 @@
+<!--{
+	"Title": "Go 1.3 Release Notes",
+	"Path":  "/doc/go1.3",
+	"Template": true
+}-->
+
+<h2 id="introduction">Introduction to Go 1.3</h2>
+
+<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,
+precise garbage collection,
+significant performance improvements,
+including TODO,
+and support for Google's Native Client architecture (NaCl).
+As always, Go 1.3 keeps the <a href="/doc/go1compat.html">promise
+of compatibility</a>,
+and almost everything 
+will continue to compile and run without change when moved to 1.3.
+</p>
+
+<h2 id="os">Changes to the supported operating systems and architectures</h2>
+
+<h3 id="nacl">Support for Native Client</h3>
+<p>
+TODO
+</p>
+
+<h3 id="solaris">Support for Solaris</h3>
+
+<p>
+TODO
+</p>
+
+
+<h3 id="windows2000">Removal of support for Windows 2000</h3>
+
+<p>
+TODO
+windows 2000 removed (CL 74790043)
+</p>
+
+
+<h2 id="memory">Changes to the memory model</h2>
+
+<p>
+TODO:
+early go documentation suggested using a channel as a semaphore like this: (previous example).
+the go memory model has been updated to make explicit that this idiom is allowed.  (new example).
+the previous example is also correct, just requiring needless func init work.
+(CL 75130045)
+</p>
+
+<h2 id="impl">Changes to the implementations and tools</h2>
+
+<h3 id="stacks">Stack</h3>
+
+<p>
+TODO stack copying, no longer segmented
+</p>
+
+<h3 id="stack_size">Stack size</h3>
+
+<p>
+Go 1.2 increased the minimum stack size to 8 kilobytes; with the new stack model, it has been
+put back to 4 kilobytes.
+</p>
+
+<p>
+<em>Updating</em>: TODO
+</p>
+
+<h3 id="garbage_collector">Changes to the garbage collector</h3>
+
+<p>
+precision (TODO what to say)
+liveness (TODO what to say)
+</p>
+
+<h3 id="liblink">The linker</h3>
+
+<p>
+TODO compiler/linker boundary moved
+</p>
+
+<p>
+<em>Updating</em>: TODO
+</p>
+
+<h3 id="gccgo">Status of gccgo</h3>
+
+<p>
+TODO
+</p>
+
+<h3 id="gocmd">Changes to the go command</h3>
+
+<p>
+TODO
+cmd/go, go/build: support .m files (CL 60590044)
+cmd/go: add -exec to 'go run' and 'go test' (CL 68580043)
+cmd/go: cover -atomic for -race (CL 76370043)
+</p>
+
+<h3 id="misc">Miscellany</h3>
+
+<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>
+</ul>
+
+
+<h2 id="performance">Performance</h2>
+
+<p>
+TODO
+</p>
+
+<ul> 
+
+<li>
+TODO
+</li>
+
+</ul>
+
+<h2 id="library">Changes to the standard library</h2>
+
+<p>
+TODO: Which should be called out?
+</p>
+
+
+
+<h3 id="new_packages">New packages</h3>
+
+<p>
+There is one new package added to the standard library: <a href="/pkg/sync/pool/"><code>sync/pool</code></a>.
+TODO: sync: add Pool (CL 41860043, 46010043)
+</p>
+
+<h3 id="minor_library_changes">Minor changes to the library</h3>
+
+<p>
+The following list summarizes a number of minor changes to the library, mostly additions.
+See the relevant package documentation for more information about each change.
+</p>
+
+<ul>
+
+<li> TODO: cmplx.Pow(0, x): https://codereview.appspot.com/76940044</li>
+<li> TODO: crypto/tls: ServerName or InsecureSkipVerify (CL 67010043)</li>
+<li> TODO: crypto/tls: add DialWithDialer (CL 68920045)</li>
+<li> TODO: crypto/tls: report TLS version in ConnectionState (CL 68250043)</li>
+<li> TODO: crypto/x509: support CSRs (CL 49830048)</li>
+<li> TODO: fmt %F: 77580044</li>
+<li> TODO: liblink: pull linker i/o into separate liblink C library (CL 35790044)</li>
+<li> TODO: net/http: add Request.TLS (CL 52660047)</li>
+<li> TODO: net/http: add Server.ErrorLog; log and test TLS handshake errors (CL 70250044)</li>
+<li> TODO: net/http: add Server.SetKeepAlivesEnabled (CL 69670043)</li>
+<li> TODO: net/http: add Transport.TLSHandshakeTimeout; set it by default (CL 68150045)</li>
+<li> TODO: net/http: add optional Server.ConnState callback (CL 69260044)</li>
+<li> TODO: net/http: use TCP Keep-Alives on DefaultTransport's connections (CL 68330046)</li>
+<li> TODO: net/http: use TCP keep-alives for ListenAndServe and ListenAndServeTLS (CL 48300043)</li>
+<li> TODO: net: add Dialer.KeepAlive option (CL 68380043)</li>
+<li> TODO: net: enable fast socket creation using SOCK_CLOEXEC and Accept4 on FreeBSD 10 (69100043)</li>
+<li> TODO: os/exec: fix Command with relative paths (CL 59580044)</li>
+<li> TODO: regexp: add one-pass optimization from RE2 (CL 13345046)</li>
+<li> TODO: runtime/debug: add SetPanicOnFault (CL 66590044)</li>
+<li> TODO: runtime: output how long goroutines are blocked (CL 50420043)</li>
+<li> TODO: runtime: better handling of defers, reduces goroutine memory footprint by 2K (CL 42750044)</li>
+<li> TODO: runtime: faster GC: concurrent sweep, better parallelization, 8K pages (up to 50-70% pause reduction) (CL 46430043, 46860043, 58230043)</li>
+<li> TODO: runtime/race: faster by ~40% (CL 55100044)</li>
+<li> TODO: strconv.CanBackquote rejects U+007F CL 77300043</li>
+<li> TODO: syscall: add Accept4 for freebsd (CL 68880043)</li>
+<li> TODO: syscall: add NewCallbackCDecl to use for windows callbacks (CL 36180044)</li>
+<li> TODO: syscall: add support for FreeBSD 10 (CL 56770044, 56980043)</li>
+<li> TODO: testing: add b.RunParallel function (CL 57270043)</li>
+<li> TODO: testing: diagnose buggy tests that panic(nil) (CL 55780043)</li>
+<li> TODO: unicode: upgrade from Unicode 6.2.0 to 6.3.0 (CL 65400044)</li>
+</ul>
--- a/doc/go1.3.txt
+++ /dev/null
@@ -1,38 +0,0 @@
-cmd/go, go/build: support .m files (CL 60590044)
-cmd/go: add -exec to 'go run' and 'go test' (CL 68580043)
-cmd/gofmt: remove -tabwidth and -tabs flags (CL 52170043)
-crypto/tls: ServerName or InsecureSkipVerify (CL 67010043)
-crypto/tls: add DialWithDialer (CL 68920045)
-crypto/tls: report TLS version in ConnectionState (CL 68250043)
-crypto/x509: support CSRs (CL 49830048)
-liblink: pull linker i/o into separate liblink C library (CL 35790044)
-misc/benchcmp: removed and replaced by go.tools/cmd/benchcmp (CL 47980043)
-misc/dist: renamed misc/makerelease (CL 39920043)
-net/http: add Request.TLS (CL 52660047)
-net/http: add Server.ErrorLog; log and test TLS handshake errors (CL 70250044)
-net/http: add Server.SetKeepAlivesEnabled (CL 69670043)
-net/http: add Transport.TLSHandshakeTimeout; set it by default (CL 68150045)
-net/http: add optional Server.ConnState callback (CL 69260044)
-net/http: use TCP Keep-Alives on DefaultTransport's connections (CL 68330046)
-net/http: use TCP keep-alives for ListenAndServe and ListenAndServeTLS (CL 48300043)
-net: add Dialer.KeepAlive option (CL 68380043)
-net: enable fast socket creation using SOCK_CLOEXEC and Accept4 on FreeBSD 10 (69100043)
-os/exec: fix Command with relative paths (CL 59580044)
-regexp: add one-pass optimization from RE2 (CL 13345046)
-runtime/debug: add SetPanicOnFault (CL 66590044)
-runtime: output how long goroutines are blocked (CL 50420043)
-runtime: better handling of defers, reduces goroutine memory footprint by 2K (CL 42750044)
-runtime: faster GC: concurrent sweep, better parallelization, 8K pages (up to 50-70% pause reduction) (CL 46430043, 46860043, 58230043)
-runtime/race: faster by ~40% (CL 55100044)
-sync: add Pool (CL 41860043, 46010043)
-syscall: add Accept4 for freebsd (CL 68880043)
-syscall: add NewCallbackCDecl to use for windows callbacks (CL 36180044)
-syscall: add support for FreeBSD 10 (CL 56770044, 56980043)
-testing: add b.RunParallel function (CL 57270043)
-testing: diagnose buggy tests that panic(nil) (CL 55780043)
-unicode: upgrade from Unicode 6.2.0 to 6.3.0 (CL 65400044)
-
-Additional notes:
-- support for Windows 2000 removed (CL 74790043)
-- copying stack support; initial stack size 4kB again.
-- liveness analysis in garbage collector

変更の背景

このコミットは、Go 1.3の正式リリースに向けた準備の一環として行われました。Goプロジェクトでは、各メジャーリリースにおいて、そのバージョンで導入された新機能、改善点、非互換性などをまとめたリリースノートを公開しています。以前はテキストファイル (doc/go1.3.txt) で管理されていましたが、よりリッチな表現と構造化された情報提供のためにHTML形式 (doc/go1.3.html) への移行が決定されました。このコミットは、そのHTML形式のリリースノートの初期骨子を作成し、今後の詳細な内容記述のための基盤を構築することを目的としています。

前提知識の解説

Go 1.3の変更点を理解するためには、以下の概念を把握しておくことが重要です。

  • Goのリリースサイクルと互換性保証 (Go 1 Compatibility Promise): Go言語は、Go 1以降、既存のGoプログラムが新しいバージョンでも動作し続けるという強力な互換性保証を掲げています。これは、言語仕様、標準ライブラリ、ツールチェインの安定性を意味し、開発者が安心してGoのバージョンアップを行えるようにするための重要な原則です。Go 1.3もこの原則に則っており、言語仕様の変更は含まれていません。
  • ガベージコレクション (Garbage Collection, GC): Goランタイムの重要なコンポーネントの一つで、不要になったメモリを自動的に解放する仕組みです。GoのGCは、プログラムの実行を一時停止させる「ポーズ時間」を最小限に抑えることに重点を置いています。
    • Precise GC (正確なGC): GCがメモリ上の値がポインタであるか否かを正確に識別できることを指します。これにより、ポインタではない値を誤ってポインタと解釈してしまい、本来解放されるべきメモリが解放されない(メモリリーク)といった問題を回避できます。Go 1.1でヒープ上の値に対して正確なGCが導入され、Go 1.3ではスタック上の値にも拡張されました。
  • メモリモデル (Memory Model): 並行プログラムにおけるメモリ操作の順序付けと可視性を定義するものです。Goのメモリモデルは、sync パッケージのプリミティブ(ミューテックス、チャネルなど)がどのようにメモリの同期を保証するかを規定しています。これにより、複数のゴルーチンが共有メモリにアクセスする際の競合状態を防ぎ、予測可能な動作を保証します。
  • Native Client (NaCl): Googleが開発したオープンソース技術で、ウェブブラウザ内でC/C++コードを安全かつ高性能に実行するためのサンドボックス環境を提供します。Go 1.3では、GoプログラムをNaCl環境で実行するためのサポートが再導入されました。これは、Go Playgroundのようなウェブベースの実行環境でGoコードを安全に実行する際に特に有用です。
  • コンパイラツールチェイン: Goのソースコードをコンパイルし、実行可能なバイナリを生成するための一連のツール群(コンパイラ、アセンブラ、リンカなど)を指します。これらのツールの効率性は、ビルド時間や生成されるバイナリの性能に直接影響します。

技術的詳細

Go 1.3は、言語仕様の変更は含まれていないものの、ランタイム、ツールチェイン、標準ライブラリにおいて多くの重要な改善が施されました。このコミットで作成されたリリースノートの骨子に沿って、主要な技術的詳細を以下に解説します。

メモリモデルの改善

Go 1.3では、Goのメモリモデルに同期に関する重要な改良が加えられました。特に、チャネルをセマフォとして使用するイディオムが明示的に許可されるようになりました。これにより、以前のGoのドキュメントで示唆されていたチャネルを使ったセマフォのパターンが、メモリモデルの観点からも正式に保証され、より安全かつ意図通りに動作することが明確になりました。

実装とツールの変更

  • スタック管理の進化:
    • スタックコピーの廃止と非セグメント化スタック: Go 1.3の最も重要な変更点の一つは、スタック管理モデルの根本的な見直しです。以前のGoバージョンでは、ゴルーチンのスタックは必要に応じて拡張されるセグメント化スタックを採用しており、スタックの拡張時には新しい、より大きなセグメントに内容をコピーする必要がありました。Go 1.3では、このスタックコピーのメカニズムが廃止され、より効率的な非セグメント化スタックモデルが導入されました。これにより、スタックの拡張に伴うオーバーヘッドが削減され、特にスタックを頻繁に拡張するようなワークロードでのパフォーマンスが向上しました。
    • 最小スタックサイズの変更: Go 1.2で8KBに増加された最小スタックサイズは、新しいスタックモデルの導入に伴い、Go 1.3で再び4KBに戻されました。これは、スタック管理の効率化により、より小さな初期スタックサイズでも十分な性能を確保できるようになったためです。
  • ガベージコレクタ (GC) の改善:
    • 正確なGCの拡張: Go 1.3では、Go 1.1で導入されたヒープ上の値に対する正確なGCが、スタック上の値にも拡張されました。これにより、GCがスタック上の値をスキャンする際に、ポインタではない値を誤ってポインタと解釈することがなくなり、メモリリークのリスクがさらに低減されました。
    • ライブネス解析: GCの精度と効率を向上させるためのライブネス解析が強化されました。これにより、GCは実際に使用されている(ライブな)オブジェクトをより正確に識別し、不要なオブジェクトの解放を促進します。
    • パフォーマンス向上: GCのポーズ時間削減に向けた取り組みが継続され、並行スイープアルゴリズムの導入、並列化の改善、より大きなページサイズの利用などにより、GCのポーズ時間が最大で50-70%削減されました。
  • リンカの変更: コンパイラとリンカの境界が移動され、命令選択フェーズがリンカからコンパイラに移されました。これにより、特に大規模なプロジェクトにおいてビルド時間が短縮されるなど、ビルドプロセスの効率が向上しました。
  • go コマンドの機能強化:
    • .m ファイルのサポート: cmd/go および go/build.m ファイル(Objective-Cソースファイル)をサポートするようになりました。
    • go run および go test への -exec オプションの追加: 外部コマンドを使用してビルドされたバイナリを実行できるようになりました。
    • go cover-atomic オプション: 競合検出 (-race) と組み合わせた際のコードカバレッジ計測のサポートが改善されました。
  • その他のツール変更:
    • misc/benchcmp の削除: go.tools/cmd/benchcmp に置き換えられました。
    • misc/dist の名称変更: misc/makerelease に変更されました。

パフォーマンスの向上

Go 1.3では、ランタイムとツールチェインの様々な最適化により、全体的なパフォーマンスが向上しました。

  • defer 呼び出しの効率化: defer ステートメントの処理がより効率的になり、メモリフットプリントが削減されました。
  • GCの高速化: 前述のGCの改善により、アプリケーションの実行におけるGCポーズ時間が大幅に短縮され、全体的なスループットが向上しました。
  • レース検出器の高速化: runtime/race パッケージのパフォーマンスが約40%向上し、競合状態の検出がより迅速に行えるようになりました。

標準ライブラリの変更

  • sync/pool パッケージの追加:
    • sync.Pool は、一時的に使用されるオブジェクトの再利用を可能にする新しいパッケージです。これにより、頻繁に生成・破棄されるオブジェクトのGC負荷を軽減し、アプリケーションのパフォーマンスを向上させることができます。例えば、ネットワーク接続やバッファなど、コストの高いオブジェクトをプールして再利用するシナリオで非常に有効です。
  • その他のマイナーな変更:
    • net/http パッケージの機能強化: Request.TLS フィールドの追加、Server.ErrorLog の追加、Server.SetKeepAlivesEnabled の追加、Transport.TLSHandshakeTimeout の追加、Server.ConnState コールバックの追加、TCP Keep-Aliveの利用など、HTTPサーバーとクライアントの機能と堅牢性が向上しました。
    • crypto/tls および crypto/x509 の改善: TLS接続のオプション拡張やCSR (Certificate Signing Request) のサポートなど、暗号化関連の機能が強化されました。
    • os/exec: 相対パスを持つコマンドの修正。
    • regexp: RE2からのワンパス最適化の追加。
    • runtime/debug: SetPanicOnFault の追加。
    • runtime: ゴルーチンがブロックされている時間の出力、defer のより良いハンドリングによるゴルーチンメモリフットプリントの削減。
    • testing: b.RunParallel 関数の追加により、並列テストのサポートが強化されました。
    • unicode: Unicode 6.2.0から6.3.0へのアップグレード。

サポートされるOSとアーキテクチャの変更

  • Native Client (NaCl) のサポート: GoogleのNative Clientアーキテクチャに対するサポートが再導入されました。
  • Solaris のサポート: Solarisオペレーティングシステムへのサポートが追加されました。
  • Windows 2000 のサポート終了: Windows 2000に対するサポートが終了しました。
  • DragonFly BSD および Plan 9 の実験的サポート: DragonFly BSD (amd64および386アーキテクチャ) と Plan 9 に対する実験的なサポートが導入されました。

コアとなるコードの変更箇所

このコミットのコアとなる変更は、以下の2つのファイルの追加と削除です。

  • doc/go1.3.html の新規追加
  • doc/go1.3.txt の削除

doc/go1.3.html ファイルは、Go 1.3リリースノートのHTML構造を定義しており、以下のような主要なセクション見出しと、それぞれのセクションで説明されるべき内容を示す「TODO」コメントが含まれています。

<!--{
	"Title": "Go 1.3 Release Notes",
	"Path":  "/doc/go1.3",
	"Template": true
}-->

<h2 id="introduction">Introduction to Go 1.3</h2>
...
<h2 id="os">Changes to the supported operating systems and architectures</h2>
...
<h3 id="nacl">Support for Native Client</h3>
<p>
TODO
</p>
...
<h2 id="memory">Changes to the memory model</h2>
...
<h2 id="impl">Changes to the implementations and tools</h2>
...
<h3 id="stacks">Stack</h3>
<p>
TODO stack copying, no longer segmented
</p>
...
<h3 id="garbage_collector">Changes to the garbage collector</h3>
<p>
precision (TODO what to say)
liveness (TODO what to say)
</p>
...
<h2 id="performance">Performance</h2>
<p>
TODO
</p>
...
<h2 id="library">Changes to the standard library</h2>
...
<h3 id="new_packages">New packages</h3>
<p>
There is one new package added to the standard library: <a href="/pkg/sync/pool/"><code>sync/pool</code></a>.
TODO: sync: add Pool (CL 41860043, 46010043)
</p>
...

コアとなるコードの解説

このコミットにおけるコアとなるコードの変更は、Go 1.3のリリースノートをHTML形式で提供するための基盤を構築することにあります。doc/go1.3.html は、単なるプレースホルダーではなく、Go 1.3で導入される主要な機能カテゴリ(例: オペレーティングシステムとアーキテクチャの変更、メモリモデルの変更、実装とツールの変更、パフォーマンス、標準ライブラリの変更など)を明確に定義しています。

各セクションには、そのカテゴリで期待される変更点や新機能の概要が簡潔に記述されており、多くは「TODO」として、後で詳細な説明が追加されることを示しています。特に、sync/pool パッケージの追加のように、具体的な新機能が既に明記されている箇所もあります。

このHTMLファイルは、Goのドキュメント生成システムによって処理され、最終的なGo 1.3リリースノートのウェブページとして公開されることを意図しています。これにより、ユーザーはより整理され、読みやすい形式でGo 1.3の変更点を把握できるようになります。

関連リンク

参考にした情報源リンク