[インデックス 11689] ファイルの概要
このコミットは、Go言語の2012年2月7日付けの週次スナップショット(weekly.2012-02-07
)に関する変更を記録したものです。主な内容は、Goツールの再編成、一部ツールの名称変更、os/signal
パッケージの移動、新しいビルドツールdist
の導入、およびその他多数のパッケージやツールの改善・修正に関するドキュメントの更新です。
コミット
commit d3f8f0c258be17e742abb59da26025a6b5656c7b
Author: Andrew Gerrand <adg@golang.org>
Date: Wed Feb 8 14:37:47 2012 +1100
weekly.2012-02-07
R=golang-dev, dsymonds, r
CC=golang-dev
https://golang.org/cl/5615056
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/d3f8f0c258be17e742abb59da26025a6b5656c7b
元コミット内容
weekly.2012-02-07
R=golang-dev, dsymonds, r
CC=golang-dev
https://golang.org/cl/5615056
変更の背景
このコミットは、Go言語の週次開発スナップショットの一環として行われました。当時のGoプロジェクトでは、開発の進捗を定期的にユーザーに提供するため、週次スナップショットが公開されていました。このスナップショットには、過去1週間の間にGoリポジトリに加えられた主要な変更点や新機能、バグ修正などがまとめられています。
特にこの週(2012年2月7日)のスナップショットでは、Goツールの管理方法とビルドシステムに大きな変更が加えられました。これは、Go開発環境の使いやすさと効率性を向上させるための重要なステップでした。具体的には、利用頻度の高いツールとそうでないツールを区別し、後者をgo tool
コマンドの下に統合することで、ユーザーのPATH
環境変数をシンプルに保ちつつ、必要なツールへのアクセスを提供することを目的としています。また、ビルドプロセスの刷新も行われ、より堅牢で管理しやすいシステムへの移行が進められました。
前提知識の解説
- Go言語の週次スナップショット (Weekly Snapshots): 2012年頃のGo言語開発では、安定版リリースとは別に、開発ブランチの最新状態を反映した「週次スナップショット」が定期的に公開されていました。これは、ユーザーが最新の機能や修正を早期に試せるようにするための仕組みでした。これらのスナップショットは、通常、
weekly.YYYY-MM-DD
のような形式でタグ付けされていました。 GOROOT
とGOBIN
:GOROOT
: Goのインストールディレクトリのルートパスを示す環境変数です。Goの標準ライブラリやツールチェーンがここに配置されます。GOBIN
: Goの実行可能バイナリがインストールされるディレクトリを示す環境変数です。通常、$GOROOT/bin
またはユーザーが設定した任意のパスになります。このディレクトリがPATH
環境変数に含まれていると、Goのコマンドをどこからでも実行できるようになります。
go tool
コマンド: Go 1のリリースに向けて導入された、Goのサブコマンド形式のツール実行メカニズムです。以前は個別の実行ファイルとして提供されていた多くのGo関連ツール(例:6g
,gofix
,govet
など)が、go tool <command>
という形式で実行されるようになりました。これにより、ユーザーのPATH
を汚染することなく、多数のツールを効率的に管理できるようになりました。gccgo
: Go言語のフロントエンドを持つGCCコンパイラです。Goの公式コンパイラ(gc
、現在はgo
コマンドに統合)とは異なる実装であり、C/C++のコードとの連携や、特定のプラットフォームでの利用に適していました。- Mercurial (
hg
): 当時、Go言語の公式リポジトリはGitではなくMercurial(hg
)で管理されていました。.hgtags
ファイルはMercurialリポジトリにおけるタグ情報を記録するためのファイルです。このコミットがGitHubにミラーリングされているのは、Goプロジェクトが後にGitに移行したためです。 CL
(Change List): Goプロジェクトでは、コードレビューシステムとしてGerritを使用しており、各変更は「Change List (CL)」として管理されます。コミットメッセージ内のhttps://golang.org/cl/56155056
は、この変更に対応するGerritのCLへのリンクを示しています。
技術的詳細
このコミットでドキュメント化されている主要な技術的変更点は以下の通りです。
- Goツールの再編成:
go
,godoc
,gofmt
の3つの主要ツールのみが$GOROOT/bin
(または$GOBIN
)に直接インストールされるようになりました。これらはGo開発において最も頻繁に使用されるツールです。- その他の利用頻度の低いツール(例:
6g
,cgo
,govet
など)は、$GOROOT/bin/tool
ディレクトリに移動されました。 - これらのツールは、
go tool <command>
という形式で呼び出されるようになりました。例えば、govet hello.go
ではなく、go tool vet hello.go
と入力する必要があります。これにより、ユーザーのPATH
環境変数がシンプルに保たれ、ツールの管理が容易になりました。
- ツールの名称変更:
- 再編成に伴い、一部のツールはより簡潔な名前に変更されました。例えば、
6cov
はcov
に、gofix
はfix
に、govet
はvet
に、goyacc
はyacc
に変更されました。これは、go tool
の後に続くコマンド名を短くし、入力の手間を省くための変更です。
- 再編成に伴い、一部のツールはより簡潔な名前に変更されました。例えば、
os/signal
パッケージの移動:os/signal
パッケージがexp/signal
に移動されました。exp
(experimental)パッケージは、まだ安定していない、あるいは将来的に変更される可能性のある実験的なAPIを含むパッケージを置く場所です。これは、シグナルハンドリングAPIがまだ開発段階であり、将来の変更に備えるための措置と考えられます。
- 新しいビルドツール
dist
の導入:- Goのコンパイラツールチェーン(
gc
)のビルドと、go
ツールのブートストラップ(自己コンパイル)を処理するための新しいツールdist
が導入されました。 - これにより、従来のビルドスクリプトやMakefileが削除され、Go自身のビルドプロセスがよりGoらしい、統合された方法で管理されるようになりました。
dist
ツールは、GoのソースコードからGoのツールチェーン全体を構築するための中心的な役割を担います。
- Goのコンパイラツールチェーン(
- その他の多数の変更:
- コンパイラ/リンカ (
5a
,6a
,8a
,5l
,6l
,8l
,8g
,cmd/gc
,cmd/ld
):y.tab.[ch]
のチェックイン、メモリリークの修正、-X
フラグの実装、RDTSC命令のサポート、デバッグフラグの記述、インポートパス内の\
の診断、switch _ := v.(type)
の禁止、エラーメッセージの改善など、コンパイラとリンカの安定性、機能、診断能力に関する多数の改善が行われました。 cmd/go
:git branches
を介したリリースtags
のサポート、gccgo
標準ライブラリのハンドリング修正、go build
でのgccgo
サポート導入、CGO_CFLAGS
のcgo
へのパス、インポート失敗時のエラー報告の改善など、go
コマンド自体の機能強化とgccgo
との連携改善が進められました。cmd/goinstall
の削除:go get
コマンドが機能するようになったため、goinstall
コマンドが削除されました。これは、Goのパッケージ管理と取得のメカニズムがgo get
に一本化されたことを意味します。- 標準ライブラリの更新:
archive/zip
:FileMode
フラグのフルレンジをサポート。bufio
: 特殊なエラータイプを削除。bytes
: APIの微調整。encoding/base32
,encoding/base64
: デコード時に改行文字を無視するよう変更。encoding/json
: アドレス可能なT
値に対して(*T).MarshalJSON
を呼び出すよう修正。net/http
,net/rpc
,net
:net/http
でのContent-Type
ヘッダ設定のデフォルト変更、nil
ポインタデリファレンスの修正、クライアントfd
の早期クローズ、net/rpc
でのデータ競合修正、マルチキャストヘルパーの追加、Windowsビルドの修正など、ネットワーク関連の安定性と機能が向上しました。os/exec
,os/user
,os
: ファイルディスクリプタのリークテスト、Windowsでのos/user
実装、Process.handle
のsyscall.Handle
使用など、OSインタラクション関連の改善。runtime
:runtime.cputicks()
の追加、UpdateMemStats
の削除とReadMemStats
への置き換え、float64
ハッシュの修正、GOTRACEBACK
によるランタイムフレーム表示の制御、マップごとのハッシュシードの使用など、ランタイムのパフォーマンスとデバッグ機能の強化。syscall
:Timeval.Nano
,Timespec.Nano
の追加、Plan 9での環境変数キャッシュ、ビルドディレクティブの修正など、システムコール関連の改善。
- テスト (
test
,testing
):NaN
マップキーのテスト、gccgo
コンパイラをクラッシュさせたテストケースの追加、パニックのキャプチャとテスト失敗のマーク付けなど、テストカバレッジと堅牢性の向上。 vet
ツール: タグ付けされていない構造体リテラルのチェックが追加され、コード品質の自動チェックが強化されました。
- コンパイラ/リンカ (
これらの変更は、Go 1のリリースに向けて、言語、ツールチェーン、標準ライブラリの全体的な成熟度と安定性を高めるための広範な取り組みの一環でした。特にツールの再編成とビルドシステムの刷新は、Go開発者のワークフローに大きな影響を与えるものでした。
コアとなるコードの変更箇所
このコミットでは、以下の2つのファイルが変更されています。
.hgtags
1107a7d3cb075836387adfab5ce56d1b3e56637d weekly
という行が削除されています。これは、Mercurialリポジトリのタグ情報ファイルから、以前の週次スナップショットのタグが削除されたことを示唆しています。おそらく、新しい週次スナップショットのタグが追加されるか、タグ付けのプロセスが変更されたためと考えられます。
doc/devel/weekly.html
- このファイルは、Goの週次開発スナップショットの変更履歴をまとめたHTMLドキュメントです。
190
行が追加され、1
行が削除されています。- 具体的には、
<h2 id="2012-02-07">2012-02-07</h2>
という新しいセクションが追加され、その下にこの週のスナップショットに含まれるすべての主要な変更点(ツールの再編成、名称変更、パッケージの移動、dist
ツールの導入、その他多数のパッケージやツールの改善・修正)が詳細に記述されています。
コアとなるコードの解説
このコミットの「コアとなるコードの変更」は、Goプロジェクトのドキュメント、特に開発の進捗を記録するdoc/devel/weekly.html
の更新にあります。
.hgtags
の変更は、Mercurialリポジトリのタグ管理の一部であり、このコミットが特定の週次スナップショットに対応するものであることを示しています。古いタグの削除は、新しいタグの追加やタグ付け戦略の変更と関連している可能性があります。doc/devel/weekly.html
への変更がこのコミットの主要な内容です。このHTMLファイルは、Go開発者が最新の変更点を把握するための公式な情報源でした。このコミットによって追加された内容は、Goツールチェーンの根本的な変更(ツールのパス、呼び出し方法、名称)、ビルドシステムの刷新、そして多数の標準ライブラリやツールの改善・バグ修正を詳細に記述しています。これは、Go 1のリリースを控えた時期における、プロジェクト全体の急速な進化と成熟を示す重要なドキュメント更新と言えます。このドキュメントを通じて、開発者は新しいgo tool
コマンドの使い方や、os/signal
パッケージの移動といった互換性の変更について知ることができました。
関連リンク
- GitHub上のコミットページ: https://github.com/golang/go/commit/d3f8f0c258be17e742abb59da26025a6b5656c7b
- Gerrit Change List: https://golang.org/cl/5615056 (現在はリダイレクトされる可能性があります)
参考にした情報源リンク
- Go言語の公式ドキュメント (当時のバージョン):
go tool
コマンドの導入やGOROOT
/GOBIN
に関する説明。 - Go言語のリリースノートや開発ブログ (2012年頃): 週次スナップショットの概念や、Go 1リリースに向けた開発の背景。
- Mercurialのドキュメント:
.hgtags
ファイルの役割について。 - Google検索クエリ:
- "golang weekly snapshots 2012"
- "go tool command introduction"
- "golang os/signal exp/signal move"
- "golang dist tool"
- "golang build system changes 2012"
- "golang mercurial hgtags"
- "golang goinstall go get"
- "golang gccgo"
- "golang Gerrit CL"
- "golang 5a 6a 8a compiler"
- "golang runtime cputicks"
- "golang vet untagged struct literals"