[インデックス 160] ファイルの概要
このコミットは、Go言語のコンパイラの一部である src/cmd/gc/Makefile ファイルに対する変更です。Makefile は、ソフトウェアのビルドプロセスを自動化するためのスクリプトであり、このファイルはGoコンパイラ (gc) のビルド方法を定義しています。具体的には、オブジェクトファイルをアーカイブ (.a ファイル) にまとめるコマンドが変更されています。
コミット
commit e2e6b7e4cc52055ab3461285dac731f9075b6b85
Author: Rob Pike <r@golang.org>
Date: Thu Jun 12 13:38:54 2008 -0700
remove reference to 9ar
SVN=122487
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/e2e6b7e4cc52055ab3461285dac731f9075b6b85
元コミット内容
このコミットの目的は、「9arへの参照を削除する」ことです。これは、Goコンパイラのビルドプロセスにおいて、9ar というツールを使用していた箇所を別のツールに置き換えることを意味します。コミットメッセージには SVN=122487 という記述があり、これはGoプロジェクトが初期にSubversion (SVN) をバージョン管理システムとして使用していた名残を示しています。
変更の背景
Go言語は、GoogleでRob Pike、Ken Thompson、Robert Griesemerによって設計されました。これらの設計者の多くは、ベル研究所でPlan 9 from Bell Labsというオペレーティングシステムに深く関わっていました。Plan 9は、Unixの設計思想をさらに推し進めた分散システムであり、独自のツールセットと命名規則を持っていました。
9ar は、Plan 9のツールチェインに含まれるアーカイブユーティリティです。これはUnix系のシステムで一般的に使用される ar コマンドに似ていますが、Plan 9の慣習に従って名前に 9 が付いています。Go言語の初期開発段階では、Plan 9のツールや概念が多用されていました。しかし、Goがより広く採用されるためには、Plan 9に特化したツールへの依存を減らし、より標準的なUnix/Linux環境で利用可能なツールに移行する必要がありました。
このコミットは、GoコンパイラのビルドプロセスからPlan 9固有の 9ar ツールへの依存を取り除き、より一般的な ar ツールを使用するように変更することで、Goのビルド環境のポータビリティとアクセシビリティを向上させることを目的としています。これは、Goが特定のOSやツールチェインに縛られず、幅広い環境で開発・利用されるための重要なステップでした。
前提知識の解説
ar コマンド
ar (archiver) は、Unix系システムで広く使われているユーティリティで、複数のファイルを1つのアーカイブファイル(通常は .a 拡張子を持つ)にまとめるために使用されます。このアーカイブファイルは、主に静的ライブラリ(リンカがプログラムに組み込むことができるオブジェクトファイルの集合)を作成する際に利用されます。
ar コマンドの一般的な書式は ar [オプション] [アーカイブファイル名] [ファイル...] です。
r: アーカイブにファイルを挿入または置換します。s: アーカイブのシンボルテーブルを更新します。これは、リンカがアーカイブ内のオブジェクトファイルからシンボル(関数や変数など)を効率的に見つけられるようにするために重要です。c: 新しいアーカイブを作成する際に警告メッセージを表示しません。
9ar コマンド
9ar は、Plan 9 from Bell Labsオペレーティングシステムにおける ar コマンドに相当するアーカイブユーティリティです。Plan 9のツールチェインでは、多くのコマンドに 9 というプレフィックスが付いており、これはPlan 9の環境で動作するツールであることを示しています。機能的には標準的な ar と類似していますが、Plan 9の設計思想や内部実装に沿ったものとなっています。
Makefile
Makefile は、make ユーティリティがプロジェクトのビルドプロセスを自動化するために使用するファイルです。依存関係と、それらを解決するためのコマンドを定義します。例えば、「この実行可能ファイルを作成するには、これらのオブジェクトファイルが必要で、それらのオブジェクトファイルを作成するには、これらのソースファイルが必要だ」といったルールを記述します。
Go言語の初期開発とPlan 9
Go言語の設計者たちは、Plan 9の開発に深く関わっていました。そのため、Go言語の初期の設計や実装には、Plan 9の思想やツールチェインの影響が色濃く見られます。例えば、Goの初期のコンパイラやリンカは、Plan 9のツールチェインの構造を模倣していました。しかし、Goがより主流のプログラミング言語となるにつれて、Plan 9固有の依存関係を減らし、より標準的なUnix/Linux環境との互換性を高める必要が生じました。このコミットはそのような移行の一環です。
技術的詳細
このコミットは、src/cmd/gc/Makefile 内のGoコンパイラ (gc) のビルド手順を変更しています。具体的には、オブジェクトファイル (.o 拡張子を持つファイル) を静的ライブラリ (.a 拡張子を持つファイル) にまとめる際に使用するコマンドが変更されました。
変更前:
$(LIB): $(OFILES)
9ar rsc $(LIB) $(OFILES)
変更後:
$(LIB): $(OFILES)
ar rsc $(LIB) $(OFILES)
ここで、
$(LIB): ビルドされるライブラリファイルの名前(例:libgc.aなど)。$(OFILES): ライブラリに含めるオブジェクトファイルのリスト。9ar rsc $(LIB) $(OFILES):9arコマンドを使用して、$(OFILES)を$(LIB)というアーカイブファイルにrscオプションで追加する。ar rsc $(LIB) $(OFILES):arコマンドを使用して、$(OFILES)を$(LIB)というアーカイブファイルにrscオプションで追加する。
この変更は、Goコンパイラのビルドシステムが、Plan 9固有の 9ar ツールではなく、より標準的なUnix系システムで利用可能な ar ツールを使用するように切り替わったことを意味します。これにより、Goのビルドプロセスは、Plan 9のツールチェインがインストールされていない環境でも、標準的な開発ツールが揃っていれば実行可能になります。これは、Go言語のクロスプラットフォーム対応と普及において重要な一歩でした。
コアとなるコードの変更箇所
--- a/src/cmd/gc/Makefile
+++ b/src/cmd/gc/Makefile
@@ -29,7 +29,7 @@ OFILES=\
sysimport.$O\
$(LIB): $(OFILES)
- 9ar rsc $(LIB) $(OFILES)
+ ar rsc $(LIB) $(OFILES)
$(OFILES): $(HFILES)
コアとなるコードの解説
変更された行は Makefile の一部であり、Goコンパイラ (gc) のライブラリ ($(LIB)) をビルドするためのルールを定義しています。
-
$(LIB): $(OFILES): これはmakeの依存関係のルールです。$(LIB)(ターゲット、例:libgc.a) を作成するためには、$(OFILES)(依存ファイル、例:file1.o file2.o ...) が必要であることを示しています。もし$(OFILES)のいずれかが変更された場合、または$(LIB)が存在しない場合、その下のコマンドが実行されます。 -
- 9ar rsc $(LIB) $(OFILES): 変更前の行です。9arコマンドが使用されています。rscオプションは、r(replace/insert: アーカイブにファイルを挿入または置換) とs(symbol table: シンボルテーブルを更新) とc(create: 新しいアーカイブを作成する際に警告を表示しない) の組み合わせです。このコマンドは、$(OFILES)にリストされたオブジェクトファイルを$(LIB)というアーカイブファイルにまとめ、リンカが利用できるようにシンボルテーブルを更新していました。 -
+ ar rsc $(LIB) $(OFILES): 変更後の行です。9arがarに置き換えられています。機能的には同じアーカイブ操作を行いますが、使用するツールがPlan 9固有のものから、より一般的なUnix系システムで標準的に利用されるarコマンドに変更されました。これにより、Goのビルドシステムは、Plan 9のツールチェインに依存することなく、標準的なUnix/Linux環境で動作するようになりました。
この変更は、Go言語が特定のニッチな環境(Plan 9)から脱却し、より広範な開発者コミュニティに受け入れられるための、インフラレベルでの重要な調整を示しています。
関連リンク
参考にした情報源リンク
- Go言語の公式ドキュメント
- Wikipedia: ar (Unix)
- Plan 9 from Bell Labsの公式ウェブサイト
- Gitコミット履歴 (GitHub)
- 一般的なUnix/Linuxの
makeおよびarコマンドに関する知識 - Go言語の初期の歴史に関するブログ記事やカンファレンス発表 (例: Rob PikeのGoに関する講演など)