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

[インデックス 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の設計思想をさらに推し進め、シンプルさとモジュール性を追求したシステムであり、そのツールチェインも独自に設計されていました。9arar と同様にファイルをアーカイブする目的で使用されますが、その内部実装やオプション、ファイルフォーマットなどに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 コマンドを使用していることを示しています。rsc9ar に渡されるオプションで、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): 変更後の行。9arar に置き換えることで、標準的なUnixのアーカイブツールを使用するように変更されています。

この一文字の変更は、Go言語のビルドプロセスが特定のオペレーティングシステム(Plan 9)のツールチェインから、より汎用的なUnix系システムのツールチェインへと移行したことを示しています。これにより、Go言語のコンパイラや関連ツールのビルドが、Plan 9以外の環境でも標準的なツールセットを用いて行えるようになり、Go言語のクロスプラットフォーム対応と普及に貢献しました。

関連リンク

参考にした情報源リンク