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

[インデックス 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のような形式でタグ付けされていました。
  • GOROOTGOBIN:
    • 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へのリンクを示しています。

技術的詳細

このコミットでドキュメント化されている主要な技術的変更点は以下の通りです。

  1. 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環境変数がシンプルに保たれ、ツールの管理が容易になりました。
  2. ツールの名称変更:
    • 再編成に伴い、一部のツールはより簡潔な名前に変更されました。例えば、6covcovに、gofixfixに、govetvetに、goyaccyaccに変更されました。これは、go toolの後に続くコマンド名を短くし、入力の手間を省くための変更です。
  3. os/signalパッケージの移動:
    • os/signalパッケージがexp/signalに移動されました。exp(experimental)パッケージは、まだ安定していない、あるいは将来的に変更される可能性のある実験的なAPIを含むパッケージを置く場所です。これは、シグナルハンドリングAPIがまだ開発段階であり、将来の変更に備えるための措置と考えられます。
  4. 新しいビルドツールdistの導入:
    • Goのコンパイラツールチェーン(gc)のビルドと、goツールのブートストラップ(自己コンパイル)を処理するための新しいツールdistが導入されました。
    • これにより、従来のビルドスクリプトやMakefileが削除され、Go自身のビルドプロセスがよりGoらしい、統合された方法で管理されるようになりました。distツールは、GoのソースコードからGoのツールチェーン全体を構築するための中心的な役割を担います。
  5. その他の多数の変更:
    • コンパイラ/リンカ (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_CFLAGScgoへのパス、インポート失敗時のエラー報告の改善など、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.handlesyscall.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つのファイルが変更されています。

  1. .hgtags
    • 1107a7d3cb075836387adfab5ce56d1b3e56637d weeklyという行が削除されています。これは、Mercurialリポジトリのタグ情報ファイルから、以前の週次スナップショットのタグが削除されたことを示唆しています。おそらく、新しい週次スナップショットのタグが追加されるか、タグ付けのプロセスが変更されたためと考えられます。
  2. 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パッケージの移動といった互換性の変更について知ることができました。

関連リンク

参考にした情報源リンク

  • 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"