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

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

このコミットは、Go言語の週次スナップショット weekly.2012-03-04 を記録したものです。主な変更点として、go/build パッケージの大規模な再設計が含まれており、既存のAPIが新しいインターフェースに置き換えられています。これに伴い、gofix ツールによる自動変換は提供されず、手動でのコード更新が必要となることが明記されています。その他、様々なパッケージやツールにおけるバグ修正、機能改善、ドキュメントの更新などが含まれています。

コミット

commit 56208edb8dfc297efde71f18730dfb09b3dcb928
Author: Andrew Gerrand <adg@golang.org>
Date:   Mon Mar 5 15:45:50 2012 +1100

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

https://github.com/golang/go/commit/56208edb8dfc297efde71f18730dfb09b3dcb928

元コミット内容

    weekly.2012-03-04
    
    R=golang-dev, dsymonds, bradfitz, minux.ma
    CC=golang-dev
    https://golang.org/cl/5732058

変更の背景

このコミットは、Go言語の開発プロセスにおける定期的な「週次スナップショット」の一環として行われました。週次スナップショットは、特定の時点での開発ブランチの状態をタグ付けし、その時点での変更内容をまとめたものです。これにより、開発者は特定の安定したバージョンを参照したり、過去の変更履歴を追跡したりすることが容易になります。

特にこのスナップショットでは、go/build パッケージの主要な再設計が実施されました。これは、Go言語のビルドシステムとのプログラム的なインタラクションをより効率的かつ堅牢にするための基盤的な変更であり、Go 1のリリースに向けた重要なステップの一つと考えられます。既存のAPIが大幅に変更されたため、この変更を適用するユーザーは手動でコードを更新する必要がありました。これは、Go言語がまだ活発に開発されており、APIの安定性がGo 1のリリース後に確立される前の段階であったことを示しています。

前提知識の解説

  • Go言語の週次スナップショット: Go言語の初期開発段階では、安定版リリースとは別に、開発ブランチの特定の時点を「週次スナップショット」として公開していました。これは、最新の開発状況をユーザーに提供し、フィードバックを収集するためのメカニズムでした。各スナップショットには日付が付けられ、特定のタグ(例: weekly.2012-03-04)で識別されました。
  • go/build パッケージ: go/build パッケージは、Go言語のソースコードを解析し、パッケージの依存関係を解決し、ビルドプロセスに関する情報を提供する標準ライブラリです。Goのツールチェイン(go build, go install など)が内部的に利用する機能を提供し、Goのソースコードをプログラム的に扱うための基盤となります。例えば、特定のディレクトリにあるGoパッケージを特定したり、そのパッケージのインポートパスやソースファイルの一覧を取得したりする際に使用されます。
  • gofix ツール: gofix は、Go言語のAPI変更に伴うコードの自動変換を支援するために提供されていたツールです。Go言語の進化に伴い、APIの変更が発生した場合に、開発者が手動でコードを修正する手間を省くことを目的としていました。しかし、このコミットで言及されているように、go/build パッケージの変更は gofix の対象外であり、手動での対応が必要でした。これは、変更の規模が大きく、自動変換が困難であったか、あるいは gofix の機能がまだそのレベルの複雑な変換に対応していなかったことを示唆しています。
  • Mercurial (.hgtags): Go言語の初期開発では、バージョン管理システムとしてMercurialが使用されていました。.hgtags ファイルはMercurialのリポジトリでタグ情報を管理するために使用されるファイルです。このファイルには、コミットハッシュとそれに対応するタグ名が記述されます。

技術的詳細

このコミットの最も重要な技術的変更は、go/build パッケージの再設計です。

  1. go/build パッケージのAPI変更:

    • 既存の FindTree, ScanDir, Tree, DirInfo といった型が廃止されました。
    • これらは Import および Package 型に置き換えられました。
    • この変更は、Goのビルドシステムがパッケージ情報をどのように表現し、アクセスするかという根本的なモデルの変更を意味します。新しい Import および Package 型は、より柔軟で、Goのパッケージ構造をより正確に表現できるように設計されたと考えられます。
    • gofix ツールによる自動変換が提供されないため、go/build パッケージを使用している既存のコードは、新しいAPIに合わせて手動で更新する必要がありました。これは、この変更が単なる名前の変更ではなく、セマンティクスやデータ構造の変更を伴う、より深いレベルの再設計であったことを示唆しています。
  2. その他の主要な変更点:

    • コンパイラ/リンカ (6a/6l, gc, ld): IMUL3QSHLDL 命令の追加、絶対インポートパスの禁止、インポートパスにおける特殊文字の拒否、エスケープ解析とインライン化、クロージャのバグ修正、新しいboolルールに対する文字列比較の修正、rodata セクションのアライメント修正など、コンパイラとリンカの堅牢性と機能性が向上しています。
    • ビルドツール (cmd/go, cmd/dist, build): go/build パッケージの変更に加えて、go コマンドの -I フラグの修正、verbose表示の改善、gccgo 関連の修正、dist ツールの改善(CC="ccache clang" の認識など)、LDFLAGSGCFLAGS への GO_ プレフィックス追加など、ビルドプロセスの安定性と使いやすさが向上しています。
    • 静的解析ツール (cmd/vet): Printf フォーマット文字列に関する誤ったエラー報告の修正など、静的解析の精度が向上しています。
    • 標準ライブラリ:
      • crypto/tls, crypto/x509: OS XのAPI互換性のためのターゲットバージョン強制、ドキュメントのtypo修正。
      • encoding/gob, encoding/json, encoding/xml: 入力文字列の長さに対する堅牢性の向上、MarshalForHTML の削除と Marshal への統合、XMLのアンマーシャル例の修正など、エンコーディング関連の改善。
      • html/template: ドキュメントの修正、メソッドシグネチャの例の修正。
      • io: I/Oの並行アクセス安全性に関するドキュメントの追加。
      • net/http, net/http/cgi, net/http/httptest, net/http/httputil, net/rpc, net: HTTPステータスコード418の追加、プロキシ関連のバグ修正、テストの堅牢性向上、CGIとHTTPテストの改善、NetBSDのスタブ追加、テストファイルの再編成など、ネットワーク関連の機能強化とバグ修正。
      • os: Windowsにおけるプロセス管理の改善(UserTime/SystemTimesameFile の実装、プロセスハンドルの解放、終了後のスリープ)、StartProcess 中の chdir エラー診断。
      • path/filepath: SplitListstrings.Split の違いに関する注意書き、HasPrefix の使用を避ける推奨。
      • reflect: DeepEqual での関数比較時のパニック回避、Value.Interface が不変データを返すように変更。
      • runtime/pprof: OS X CPUプロファイリングのサポート。
      • runtime: runtime-gdb.py のprettyprintersへの健全性チェック追加、ARM syscall失敗のチェック、Darwin/Linuxのシグナルマスキング、init のメインスレッド実行、仮想アドレス空間制限に合わせたアリーナサイズ調整。
      • sync: Once の例の追加、古い WaitGroup の例の削除。
      • testing: -test.example フラグの追加。
      • text/template: カスタム関数の使用例、複数テンプレートの使用例の追加、再定義バグの修正。
      • time: Duration 定数の使用方法に関するコメント追加。
    • ドキュメント (doc): go/build API変更の説明、cmd/vet のチェック項目に関する詳細、code.htmlgo ツールに関する詳細化、FreeBSD/Linuxユーザーへの古いバージョンの削除指示、Go for C++ Programmers、ロードマップ、チュートリアルドキュメントの削除、codelab/wiki のGo 1への更新など、ドキュメントの整理と更新が広範に行われています。これはGo 1リリースに向けたドキュメントの整備の一環と考えられます。
    • その他 (misc): go ツールの zsh および bash 補完の追加、ダッシュボードのUIバグ修正と外部パッケージのインストール数記録、バイナリ配布スクリプトのGoでの実装、gobuilder のコミット時間フォーマット変更、Xcode3関連ファイルの移動など、開発環境とインフラストラクチャの改善も含まれています。
  3. Go言語仕様 (spec) の更新:

    • インポートパスにおける \uFFFD の許可/不許可に関する記述。
    • メソッドセットと埋め込みが、名前付き型だけでなくすべての型に適用されることの明確化。
    • エクスポートと識別子のユニーク性に関する明確化。
    • インポートパスの実装制限。
    • 関数内の変数は評価される必要があること。
    • 「lexical token」という用語の使用(「lexical symbol」の代わりに)。 これらの変更は、Go言語のセマンティクスと仕様の厳密性を高めるためのものです。

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

このコミットでは、主に以下の2つのファイルが変更されています。

  1. .hgtags:

    --- a/.hgtags
    +++ b/.hgtags
    @@ -106,4 +106,3 @@ b4a91b6933748db1a7150c06a1b55ad506e52906 weekly.2011-11-18
     52ba9506bd993663a0a033c2bd68699e25d061ab weekly.2012-02-07
     43cf9b39b6477d3144b0353ee91096e55db6107f weekly.2012-02-14
     96bd78e7d35e892113bdfa1bdc392d3a5f2e644b weekly.2012-02-22
    -96bd78e7d35e892113bdfa1bdc392d3a5f2e644b weekly
    

    この変更は、weekly というタグが指していた古いコミットハッシュ 96bd78e7d35e892113bdfa1bdc392d3a5f2e644b の行を削除しています。これは、新しい週次スナップショットが作成される際に、古い weekly タグのエントリを整理するためと考えられます。

  2. doc/devel/weekly.html:

    --- a/doc/devel/weekly.html
    +++ b/doc/devel/weekly.html
    @@ -14,6 +14,124 @@ hg pull
     hg update weekly.<i>YYYY-MM-DD</i>
     </pre>
     
    +<h2 id=\"2012-03-04\">2012-03-04</h2>
    +
    +<pre>
    +This snapshot includes a major re-design of the go/build package.
    +Its FindTree, ScanDir, Tree, and DirInfo types have been replaced with the
    +Import and Package types. There is no gofix. Code that uses go/build will need
    +to be updated manually to use the package\'s new interface.
    +
    +Other changes:
    +* 6a/6l: add IMUL3Q and SHLDL.
    +* all: remove unused unexported functions and constants (thanks Rémy Oudompheng).
    +* build: add GO_ prefix to LDFLAGS and GCFLAGS (thanks Gustavo Niemeyer).
    * ... (以下、上記「技術的詳細」で述べた変更点の詳細リストが続く) ...
    +* time: add a comment about how to use the Duration constants.
    +</pre>
    +\n <h2 id=\"2012-02-22\">2012-02-22</h2>
    

    この変更は、doc/devel/weekly.html ファイルに 2012-03-04 の週次スナップショットに関する新しいセクションを追加しています。このセクションには、go/build パッケージの再設計に関する重要なアナウンスと、その他の多数の変更点(バグ修正、機能追加、ドキュメント更新など)の簡潔なリストが含まれています。これは、Go言語の週次リリースノートとして機能するドキュメントです。

コアとなるコードの解説

  • .hgtags: このファイルはMercurialのタグを管理するためのもので、Go言語のバージョン管理の歴史を反映しています。このコミットでは、新しい週次スナップショットが作成された際に、古い weekly タグのエントリを削除することで、タグの整合性を保っています。これは、Go言語がMercurialからGitに移行する前の時代の名残でもあります。
  • doc/devel/weekly.html: このHTMLファイルは、Go言語の週次開発スナップショットのリリースノートとして機能します。開発者はこのページを参照することで、最新の開発ブランチに含まれる変更点や、特に注意すべきAPIの変更などを把握することができました。このコミットでは、go/build パッケージの重要な変更を含む、多数の更新がこのドキュメントに追加され、開発者への情報提供が行われています。

これらの変更は、Go言語の継続的な開発と、Go 1の安定版リリースに向けた準備の過程を示しています。特に、go/build パッケージの再設計は、Goのビルドシステムの中核に影響を与えるものであり、その後のGoエコシステムの発展に大きな影響を与えました。

関連リンク

参考にした情報源リンク