[インデックス 159] ファイルの概要
このコミットは、Go言語の初期開発段階において、ビルドシステム内で使用されていたアーカイブツールへの参照を 9ar
から標準的な ar
へと変更したものです。具体的には、src/cmd/cc/Makefile
内のコンパイラビルドプロセスにおいて、ライブラリのアーカイブに使用するコマンドを修正しています。
コミット
commit 24dbd2413b8f0c7dd9d366dd5d06bd09ecac0c80
Author: Rob Pike <r@golang.org>
Date: Thu Jun 12 13:37:54 2008 -0700
remove reference to 9ar
SVN=122486
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/24dbd2413b8f0c7dd9d366dd5d06bd09ecac0c80
元コミット内容
remove reference to 9ar
SVN=122486
変更の背景
このコミットは、Go言語がまだGoogle社内で開発されていた非常に初期の段階(2008年6月)に行われたものです。Go言語の設計者であるRob Pike、Ken Thompson、Robert Griesemerは、いずれもBell LabsのPlan 9オペレーティングシステムの開発に深く関わっていました。Plan 9は、その設計思想やツールチェインがGo言語に多大な影響を与えています。
初期のGo言語のビルドシステムやツールは、Plan 9の環境で使われていた慣習やツールを色濃く反映していました。9ar
は、Plan 9環境で使われていたアーカイブツールであり、Unix系の標準的な ar
コマンドとは異なる実装を持っていました。
この変更の背景には、Go言語がより広範なUnix系システムで利用されることを視野に入れ、Plan 9固有のツールへの依存を減らし、より標準的で一般的なツール (ar
) へと移行する意図があったと考えられます。これにより、Go言語のビルドプロセスが、Plan 9以外の環境(Linux, macOSなど)でもより容易に、かつ互換性を持って動作するようになる基盤が作られました。
前提知識の解説
ar
コマンド
ar
(archiver) は、Unix系オペレーティングシステムで広く使われているユーティリティで、複数のファイルを1つのアーカイブファイル(ライブラリファイルやオブジェクトファイルの集合体)にまとめるために使用されます。主に静的ライブラリ(.a
ファイル)を作成する際に利用されます。例えば、C言語やC++のコンパイルにおいて、複数のオブジェクトファイル(.o
ファイル)をまとめて1つのライブラリとしてリンク可能にするために使われます。
9ar
コマンド
9ar
は、Bell Labsで開発されたオペレーティングシステム「Plan 9 from Bell Labs」で使われていたアーカイブツールです。Plan 9は、Unixの設計思想をさらに推し進め、シンプルさとモジュール性を追求したシステムであり、そのツールチェインも独自に設計されていました。9ar
は ar
と同様にファイルをアーカイブする目的で使用されますが、その内部実装やオプション、ファイルフォーマットなどにPlan 9固有の設計が反映されています。
Go言語とPlan 9の関連性
Go言語の主要な設計者であるRob PikeとKen Thompsonは、Unixの共同開発者であり、その後Bell LabsでPlan 9の開発にも携わりました。このため、Go言語の設計には、Plan 9の思想(例えば、シンプルさ、並行処理モデル、UTF-8のネイティブサポートなど)が色濃く反映されています。初期のGo言語のツールチェインやビルドシステムがPlan 9のツールに依存していたのは、この歴史的背景によるものです。しかし、Go言語が独立した汎用プログラミング言語として普及するにつれて、Plan 9固有の依存関係は徐々に解消されていきました。
技術的詳細
このコミットは、Go言語のコンパイラ(cc
はCコンパイラを指すことが多いが、Goの初期段階ではGoコンパイラの一部または関連ツールを指していた可能性が高い)のビルドプロセスを定義する Makefile
の変更です。
Makefile
は、ソフトウェアのビルドを自動化するためのツールである make
が使用する設定ファイルです。このファイルには、ソースコードから実行可能ファイルやライブラリを生成するためのルールが記述されています。
変更された行は、$(LIB)
というターゲット(おそらくコンパイラが生成するライブラリファイル)を作成するルールの一部です。
$(LIB): $(OFILES)
9ar rsc $(LIB) $(OFILES)
この行は、$(OFILES)
(オブジェクトファイル群)から $(LIB)
(ライブラリファイル)を作成するために 9ar
コマンドを使用していることを示しています。rsc
は 9ar
に渡されるオプションで、r
はアーカイブにメンバーを挿入または置換すること、s
はアーカイブのシンボルテーブルを更新すること、c
はアーカイブを作成すること(存在しない場合)を意味します。
このコミットでは、この 9ar
の呼び出しを標準的な ar
コマンドに置き換えています。
$(LIB): $(OFILES)
ar rsc $(LIB) $(OFILES)
ar
コマンドも同様に rsc
オプションをサポートしており、同じ目的(オブジェクトファイルからライブラリを作成する)を達成できます。この変更により、Go言語のビルドシステムは、Plan 9環境に特化した 9ar
ツールへの依存を解消し、より一般的なUnix系システムで利用可能な ar
ツールを使用するようになりました。これは、Go言語がよりポータブルで、多様な開発環境でビルド可能になるための重要な一歩でした。
コアとなるコードの変更箇所
--- a/src/cmd/cc/Makefile
+++ b/src/cmd/cc/Makefile
@@ -37,7 +37,7 @@ OFILES=\
compat.$O\
$(LIB): $(OFILES)
- 9ar rsc $(LIB) $(OFILES)
+ ar rsc $(LIB) $(OFILES)
$(OFILES): $(HFILES)
コアとなるコードの解説
変更は src/cmd/cc/Makefile
ファイルの38行目から39行目にかけて行われています。
- 9ar rsc $(LIB) $(OFILES)
: 変更前の行。9ar
というコマンドを使用して、$(OFILES)
で指定されたオブジェクトファイル群から$(LIB)
で指定されたライブラリファイルを生成していました。+ ar rsc $(LIB) $(OFILES)
: 変更後の行。9ar
をar
に置き換えることで、標準的なUnixのアーカイブツールを使用するように変更されています。
この一文字の変更は、Go言語のビルドプロセスが特定のオペレーティングシステム(Plan 9)のツールチェインから、より汎用的なUnix系システムのツールチェインへと移行したことを示しています。これにより、Go言語のコンパイラや関連ツールのビルドが、Plan 9以外の環境でも標準的なツールセットを用いて行えるようになり、Go言語のクロスプラットフォーム対応と普及に貢献しました。
関連リンク
- Go言語の歴史: https://go.dev/doc/history
- Plan 9 from Bell Labs: https://plan9.bell-labs.com/plan9/
ar
(Unix): https://man7.org/linux/man-pages/man1/ar.1.html (一般的なmanページへのリンク)
参考にした情報源リンク
commit_data/159.txt
の内容- Google検索: "9ar go language history"