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

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

このコミットは、Go言語のビルドシステムである cmd/dist から encoding/gob パッケージへの依存関係を削除するものです。これにより、cmd/go コマンドのビルドにおいて encoding/gob が不要になりました。

コミット

commit aa87d78cf6f73906f1b59ae8b639838f2989035b
Author: Russ Cox <rsc@golang.org>
Date:   Sun Feb 12 23:15:07 2012 -0500

    cmd/dist: encoding/gob is no longer required for cmd/go
    
    R=golang-dev, dsymonds
    CC=golang-dev
    https://golang.org/cl/5650068

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

https://github.com/golang/go/commit/aa87d78cf6f73906f1b59ae8b639838f2989035b

元コミット内容

cmd/dist: encoding/gob is no longer required for cmd/go

このコミットは、cmd/distcmd/go のビルドにおいて encoding/gob パッケージを必要としなくなったことを示しています。

変更の背景

Go言語の初期のバージョンでは、cmd/go ツール(Goコマンドラインツール)の内部処理や、Goツールチェインのビルドプロセスにおいて、encoding/gob パッケージが何らかの形で利用されていた可能性があります。cmd/dist はGoのソースコードからGoツールチェイン全体をビルドするためのプログラムであり、その build.c ファイルは、ビルドされるパッケージの順序や依存関係を定義しています。

このコミットが行われた2012年2月時点では、Go言語はまだ活発に開発されており、多くの内部的なリファクタリングや最適化が行われていました。encoding/gob はGo固有のバイナリシリアライゼーション形式であり、Goプログラム間で構造化されたデータを効率的にやり取りするために設計されています。

この変更の背景には、cmd/go または cmd/dist の内部アーキテクチャの変更があったと考えられます。具体的には、encoding/gob が提供していた機能が、より軽量な代替手段(例えば、シンプルなテキスト形式、または別のGoの標準パッケージ)に置き換えられたか、あるいはその機能自体が cmd/go のコア機能から分離された可能性があります。これにより、cmd/go のビルド時に encoding/gob パッケージをコンパイル・リンクする必要がなくなり、ビルドプロセスの簡素化や、潜在的なビルド時間の短縮、あるいは依存関係の削減に貢献したと考えられます。

前提知識の解説

cmd/dist

cmd/dist は、Go言語のソースコードからGoツールチェイン全体(go コマンド、標準ライブラリ、コンパイラ、リンカなど)をビルドするために使用される、Goプロジェクト自身のビルドシステムです。これはGo言語で書かれたプログラムではなく、C言語で書かれています。Goのソースコードをダウンロードして all.bash (Unix系) や all.bat (Windows) を実行すると、この cmd/dist が起動され、Goのビルドプロセス全体を管理します。src/cmd/dist/build.c ファイルは、Goの標準パッケージのビルド順序や、Goツールチェインを構成する各コンポーネントの依存関係を定義する中心的な役割を担っています。

encoding/gob パッケージ

encoding/gob はGo言語の標準ライブラリに含まれるパッケージで、Goのデータ構造をバイナリ形式にエンコード(シリアライズ)およびデコード(デシリアライズ)するための機能を提供します。gob 形式はGo言語に特化しており、Goの型システムと密接に連携するように設計されています。異なるGoプログラム間でのデータ転送や、永続化(ファイルへの保存など)に利用されます。gob は自己記述的であり、エンコードされたデータにはそのデータの型情報も含まれるため、デコード側は事前に型を知らなくてもデータを正しく解釈できます。

cmd/go

cmd/go は、Go言語の主要なコマンドラインツールであり、Go開発者が日常的に使用するものです。ソースコードのコンパイル、パッケージの管理(ダウンロード、インストール)、テストの実行、ドキュメントの生成など、Go開発のワークフローにおける中心的な役割を担っています。

技術的詳細

このコミットは、src/cmd/dist/build.c ファイルから pkg/encoding/gob の参照を削除しています。build.c 内の buildorder 配列は、Goの標準ライブラリパッケージがビルドされる順序を定義しています。また、cleantab 配列は、ビルドプロセス中にクリーンアップされる可能性のあるパッケージをリストアップしていると考えられます。

encoding/gob がこれらのリストから削除されたということは、以下のいずれかの状況が発生したことを意味します。

  1. 依存関係の解消: cmd/go またはそのビルドプロセスにおいて、encoding/gob が直接的または間接的に必要とされなくなった。これは、gob が提供していた機能が、他のより適切なメカニズムに置き換えられたか、あるいはその機能自体が cmd/go のコアロジックから切り離されたことを示唆します。
  2. ビルドプロセスの最適化: encoding/gobcmd/go のビルドパスから除外されることで、ビルドの依存関係グラフが簡素化され、全体のビルド時間が短縮される可能性があります。特に、gob パッケージが持つ依存関係(もしあれば)も同時に解消されるため、ビルドのフットプリントが小さくなります。
  3. Goツールチェインの自己ホスト化の進展: Go言語は、そのツールチェイン(コンパイラ、リンカなど)自体がGo言語で書かれる「自己ホスト化」を目指していました。このコミットは、Goツールチェインの内部構造が成熟し、特定の初期ブートストラップやビルドフェーズでのみ必要だった依存関係が解消された、という文脈の一部である可能性もあります。

この変更は、Goツールチェインの内部的なクリーンアップと効率化の一環であり、開発者が go buildgo install を実行する際の外部的な動作には直接的な影響を与えませんが、Goのビルドシステムの進化を示す重要なステップです。

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

変更は src/cmd/dist/build.c ファイルの2箇所で行われています。

--- a/src/cmd/dist/build.c
+++ b/src/cmd/dist/build.c
@@ -1028,7 +1028,6 @@ static char *buildorder[] = {
 	"pkg/reflect",
 	"pkg/fmt",
 	"pkg/encoding/json",
-	"pkg/encoding/gob",
 	"pkg/flag",
 	"pkg/path/filepath",
 	"pkg/path",
@@ -1079,7 +1078,6 @@ static char *cleantab[] = {
 	"pkg/bytes",
 	"pkg/container/heap",
 	"pkg/encoding/base64",
-	"pkg/encoding/gob",
 	"pkg/encoding/json",
 	"pkg/errors",
 	"pkg/flag",

具体的には、以下の2行が削除されています。

  1. static char *buildorder[] 配列から "\t\"pkg/encoding/gob\",\n"
  2. static char *cleantab[] 配列から "\t\"pkg/encoding/gob\",\n"

コアとなるコードの解説

buildorder 配列からの削除

buildorder 配列は、Goの標準ライブラリパッケージがビルドされる順序を定義しています。この配列から pkg/encoding/gob が削除されたということは、cmd/dist がGoツールチェインをビルドする際に、encoding/gob パッケージを特定の順序でビルドする必要がなくなったことを意味します。これは、cmd/go やその他のGoツールチェインのコンポーネントが encoding/gob に依存しなくなったため、そのビルドが必須ではなくなったことを示しています。

cleantab 配列からの削除

cleantab 配列は、ビルドプロセス中にクリーンアップされる可能性のあるパッケージやファイルをリストアップしていると考えられます。この配列から pkg/encoding/gob が削除されたことは、encoding/gob がビルドプロセスの一部として生成される中間ファイルや成果物がなくなり、クリーンアップの対象から外れたことを示唆します。これは buildorder からの削除と一貫しており、encoding/gob がGoツールチェインのビルドプロセスから完全に切り離されたことを裏付けています。

これらの変更は、Goツールチェインのビルドシステムが、encoding/gob パッケージへの依存を完全に解消したことを明確に示しています。

関連リンク

参考にした情報源リンク

  • Go言語のソースコードリポジトリ: https://github.com/golang/go
  • Goのコードレビューシステム (Gerrit): https://go-review.googlesource.com/ (コミットメッセージに記載されている https://golang.org/cl/5650068 は、このGerritインスタンスへのリンクです。)
  • Goのビルドシステムに関する一般的な情報 (Goのドキュメントやブログ記事など)