[インデックス 15555] ファイルの概要
このコミットは、Go言語の標準ライブラリ内の実験的なパッケージ (src/pkg/exp
) の大部分を削除し、それらを code.google.com/p/go.exp
という別のリポジトリへ移動させるものです。これにより、Goのコアリポジトリの安定性を保ちつつ、実験的な開発を継続できるような構造変更が行われました。
コミット
- コミットハッシュ:
831db8d9881041dba8e0046495edb99212b2caeb
- Author: Rob Pike r@golang.org
- Date: Sat Mar 2 11:13:24 2013 -0800
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/831db8d9881041dba8e0046495edb99212b2caeb
元コミット内容
exp: delete all packages except norm
They are moving to code.google.com/p/go.exp.
See also https://golang.org/cl/7463043
R=golang-dev, minux.ma
CC=golang-dev
https://golang.org/cl/7456047
変更の背景
このコミットの主な背景は、Go言語の標準ライブラリの安定性と保守性の向上にあります。src/pkg/exp
ディレクトリは、Goの初期段階から実験的なパッケージや未完成のコードを格納するために使用されていました。これらのパッケージはAPIの変更や削除の可能性があり、安定したリリースには含まれないことが明記されていました。
しかし、Go言語が成熟し、より多くのユーザーが利用するようになるにつれて、標準ライブラリの安定性が非常に重要になりました。実験的なコードがメインのリポジトリに存在し続けることは、以下のような問題を引き起こす可能性がありました。
- APIの不安定性:
exp
ディレクトリ内のパッケージは、将来的にAPIが変更されたり、完全に削除されたりする可能性がありました。これは、これらのパッケージに依存する外部プロジェクトにとって大きなリスクとなります。 - 保守の複雑さ: 実験的なコードがメインのコードベースに混在していると、コードレビューやテスト、リリースプロセスの複雑さが増します。
- ユーザーの混乱: どのパッケージが安定しており、どのパッケージが実験的であるかについて、ユーザーが混乱する可能性がありました。
これらの問題を解決するため、Goチームは実験的なパッケージをメインのGoリポジトリから分離し、code.google.com/p/go.exp
という独立したリポジトリに移動することを決定しました。これにより、Goのコアライブラリはより安定し、実験的な開発は独立した場所で自由に行えるようになりました。コミットメッセージにある https://golang.org/cl/7463043
と https://golang.org/cl/7456047
は、この変更に関連するGoのコードレビューシステム(Gerrit)上の変更リストを示しています。
前提知識の解説
Go言語のパッケージ管理と標準ライブラリ
Go言語は、モジュールとパッケージという概念を用いてコードを整理します。標準ライブラリはGoのインストールに含まれる一連のパッケージであり、Goプログラムの基本的な機能を提供します。
src/pkg/exp
ディレクトリ
Goの初期のバージョンでは、標準ライブラリのソースコードは src/pkg
ディレクトリ以下に配置されていました。その中でも src/pkg/exp
は "experimental" の略で、文字通り実験的なパッケージや、まだ安定版として提供するには時期尚早な機能が置かれていました。これらのパッケージは、将来的に標準ライブラリに昇格する可能性もあれば、開発が中止されたり、完全に削除されたりする可能性もありました。
code.google.com/p/go.exp
code.google.com/p/go.exp
は、Google Code上でホストされていたGo言語の実験的なプロジェクトのためのリポジトリです。このリポジトリは、Goの標準ライブラリから分離された実験的なパッケージを管理するために使用されました。これにより、Goのコア開発チームは、メインのGoリポジトリの安定性を損なうことなく、新しいアイデアや機能を試すことができました。Google Codeのサービス終了に伴い、これらのプロジェクトは後にGitHubなどの他のプラットフォームに移行しました。
コラボレーションとコードレビュー (Gerrit/golang.org/cl)
Goプロジェクトは、Gerritというコードレビューシステムを使用して開発が行われています。golang.org/cl/XXXXXXX
の形式のリンクは、Gerrit上の特定の変更リスト(Change List)を指します。開発者は変更を提案する際に変更リストを作成し、他の開発者からのレビューを受けてからメインのコードベースにマージします。このコミットメッセージに含まれる CL
リンクは、この変更がどのように議論され、承認されたかを示す証拠となります。
技術的詳細
このコミットは、Goのソースツリーから多数のディレクトリとファイルを削除するという、非常に直接的な変更です。技術的な観点からは、以下の点が重要です。
- ファイルシステムの変更:
src/pkg/exp
以下の多くのサブディレクトリとファイルが削除されています。これは、Goのビルドシステムやツールチェーンがこれらのパスを探索しなくなることを意味します。 - パッケージの分離: 削除されたパッケージは、Goのメインリポジトリから論理的にも物理的にも分離されました。これにより、Goのコア開発者は、これらの実験的なパッケージのライフサイクル(開発、バグ修正、API変更など)を、メインのGoリリースサイクルとは独立して管理できるようになりました。
- 依存関係のクリーンアップ: これらのパッケージに依存していた可能性のある内部コードは、この変更に合わせて更新されたか、あるいは元々依存関係がなかったかのいずれかです。これにより、Goのコアライブラリの依存関係グラフが簡素化され、より明確になります。
norm
パッケージの残留: コミットメッセージに「delete all packages except norm」とあるように、src/pkg/exp/norm
パッケージは削除されずに残されました。これは、norm
パッケージがGoの標準ライブラリの他の部分で必要とされていたか、あるいはその機能が十分に安定しており、実験的な段階を脱したと判断されたためと考えられます。norm
パッケージはUnicodeの正規化フォーム(NFC, NFDなど)を扱うものであり、テキスト処理において基本的な機能であるため、標準ライブラリに残すことが適切と判断されたのでしょう。
削除された主なパッケージとその機能は以下の通りです。
exp/ebnf
: EBNF (Extended Backus-Naur Form) 文法を解析するためのライブラリ。Go言語の文法定義などに使われる可能性がありました。exp/ebnflint
: EBNF 文法のリンター(構文チェックツール)。exp/gotype
: Goのソースファイルの構文解析と意味解析を行うツール。Goコンパイラのフロントエンドに似た機能を提供していました。exp/inotify
: LinuxのinotifyシステムコールをGoから利用するためのラッパー。ファイルシステムイベントの監視に使用されます。exp/locale/collate
: Unicode Collation Algorithm (UCA) に基づく文字列の照合(ソート順序)を扱うパッケージ。国際化対応の一部です。exp/ssa
: 静的単一代入形式 (Static Single Assignment form) を扱うパッケージ。コンパイラの最適化段階で利用される中間表現です。exp/utf8string
: UTF-8文字列を効率的に扱うための実験的なパッケージ。exp/winfsnotify
: Windowsのファイルシステム通知をGoから利用するためのパッケージ。
これらのパッケージは、Go言語のコンパイラ、ツール、国際化、システムプログラミングなど、多岐にわたる分野の実験的な機能を含んでいました。
コアとなるコードの変更箇所
このコミットは、主にファイルの削除で構成されています。src/pkg/exp/
ディレクトリ以下の多くのファイルが削除されました。
具体的には、以下のディレクトリとそれに含まれるすべてのファイルが削除されています(norm
ディレクトリを除く)。
src/pkg/exp/ebnf/
src/pkg/exp/ebnflint/
src/pkg/exp/gotype/
src/pkg/exp/inotify/
src/pkg/exp/locale/collate/
src/pkg/exp/ssa/
src/pkg/exp/ssa/interp/
src/pkg/exp/utf8string/
src/pkg/exp/winfsnotify/
コミットログには、82 files changed, 76060 deletions(-)
と記載されており、膨大な量のコードが削除されたことがわかります。これは、これらの実験的なパッケージがGoのメインリポジトリから完全に切り離されたことを明確に示しています。
コアとなるコードの解説
このコミットにおける「コアとなるコードの変更」は、実質的に「コードの削除」です。既存のコードが修正されたり、新しいコードが追加されたりするのではなく、特定のディレクトリとそれに含まれるファイルがGoのメインリポジトリから物理的に削除されました。
この削除は、前述の通り、Goの標準ライブラリの安定性を高め、実験的な開発を独立した場所で行うための戦略的な決定に基づいています。削除されたコード自体は、code.google.com/p/go.exp
リポジトリに移動されたため、完全に失われたわけではありません。
したがって、このコミットの解説は、削除されたコードの内容そのものよりも、なぜそのコードが削除されたのか、そしてそれがGoプロジェクト全体の構造と開発プロセスにどのような影響を与えたのかに焦点を当てるべきです。
関連リンク
- GitHub上のコミットページ: https://github.com/golang/go/commit/831db8d9881041dba8e0046495edb99212b2caeb
- 関連するGoの変更リスト (Gerrit):
参考にした情報源リンク
- Go言語の公式ドキュメント (Goのパッケージ管理、標準ライブラリの構造に関する一般的な情報)
- Google Codeのアーカイブ情報 (code.google.com/p/go.exp の歴史的背景)
- GoプロジェクトのGerritコードレビューシステム (golang.org/cl の役割)
- 各パッケージの機能に関する一般的なプログラミング知識 (EBNF, inotify, SSAなど)
- Unicode Collation Algorithm (UCA) に関する情報 (locale/collate パッケージの背景)