[インデックス 1239] ファイルの概要
このコミットは、Go言語の初期開発段階におけるビルドシステムと標準ライブラリの進化を示しています。具体的には、新しいhash
パッケージをビルドプロセスに統合し、クリーンアップスクリプトがコンパイル済みパッケージファイルを適切に削除するように更新しています。
コミット
commit bbe9bb65c72b4ccfe07fb696472d9e441a2b2bcc
Author: Russ Cox <rsc@golang.org>
Date: Mon Nov 24 15:18:29 2008 -0800
add hash to build; rm pkg/* in clean.bash
R=r
DELTA=3 (3 added, 0 deleted, 0 changed)
OCL=19935
CL=19937
---
src/clean.bash | 1 +
src/lib/Makefile | 2 ++
2 files changed, 3 insertions(+)
diff --git a/src/clean.bash b/src/clean.bash
index 143eb0b7a6..1beb6a5133 100755
--- a/src/clean.bash
+++ b/src/clean.bash
@@ -3,6 +3,7 @@
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.
+rm -f $GOROOT/pkg/*.[6a]
for i in lib9 libbio libmach_amd64 libregexp cmd runtime lib
do
cd $i
diff --git a/src/lib/Makefile b/src/lib/Makefile
index 1fea380681..bd65bf0db2 100644
--- a/src/lib/Makefile
+++ b/src/lib/Makefile
@@ -9,6 +9,7 @@ GC=6g
DIRS=\\
container/array\\
fmt\\
+\thash\\
http\\
math\\
net\\
@@ -86,6 +87,7 @@ io.6: os.dirinstall syscall.dirinstall
testing.6: flag.install fmt.dirinstall
fmt.dirinstall: io.install reflect.dirinstall strconv.dirinstall
+hash.dirinstall: os.dirinstall
http.dirinstall: bufio.install io.install net.dirinstall os.dirinstall strings.install
net.dirinstall: once.install os.dirinstall strconv.dirinstall
os.dirinstall: syscall.dirinstall
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/bbe9bb65c72b4ccfe07fb696472d9e441a2b2bcc
元コミット内容
このコミットの元の内容は、Go言語のビルドにhash
パッケージを追加し、clean.bash
スクリプトでpkg/*
を削除することです。
変更の背景
Go言語は、その設計段階から標準ライブラリの充実を重視していました。ハッシュ関数は、データ構造、セキュリティ、ネットワーク通信など、多くのコンピューティングタスクにおいて基本的な要素です。このコミットは、Goの標準ライブラリにハッシュ機能(おそらくは暗号学的ハッシュ関数やチェックサム関数など)を導入する初期段階の一部として行われました。
また、開発プロセスにおいて、ビルド成果物をクリーンアップする機能は非常に重要です。clean.bash
スクリプトは、以前のビルドによって生成された一時ファイルやコンパイル済みファイルを削除し、クリーンな状態から再ビルドできるようにするために使用されます。新しいパッケージが追加されるたびに、そのパッケージのビルド成果物もクリーンアップの対象に含める必要があります。このコミットは、hash
パッケージの導入に伴い、ビルドクリーンアッププロセスを更新するものです。
前提知識の解説
Go言語の初期ビルドシステム
Go言語の初期(2008年頃)は、現在のGo Modulesのような洗練されたビルドシステムは存在せず、主にMakefile
とシェルスクリプト(.bash
ファイル)を使用してソースコードのコンパイルとパッケージの管理を行っていました。
Makefile
:make
コマンドによって実行されるビルド指示を記述するファイルです。依存関係を定義し、ソースファイルをコンパイルして実行可能ファイルやライブラリを生成する手順を自動化します。clean.bash
: ビルドによって生成された中間ファイルや最終成果物を削除するためのシェルスクリプトです。これにより、開発者はクリーンな状態からビルドをやり直すことができます。$GOROOT
: Goのインストールディレクトリのルートを示す環境変数です。Goのソースコード、コンパイル済みパッケージ、ツールなどがこのディレクトリ構造内に配置されます。pkg
ディレクトリ: コンパイルされたGoパッケージのアーカイブファイル(.a
)やオブジェクトファイル(.6
など、コンパイラによって異なる)が保存される場所です。.6
ファイル: Goの初期のコンパイラ(例:6g
for AMD64,8g
for ARM,5g
for x86)によって生成されるオブジェクトファイルです。これらはアセンブリコードにコンパイルされたGoのソースコードのバイナリ表現を含みます。.a
ファイル: アーカイブファイル(ライブラリファイル)です。複数のオブジェクトファイル(.6
ファイルなど)を一つにまとめたもので、他のプログラムからリンクして使用されます。
ハッシュ関数
ハッシュ関数は、任意の長さの入力データを受け取り、固定長の出力(ハッシュ値、ハッシュコード、ダイジェストなどと呼ばれる)を生成するアルゴリズムです。主な特性として以下が挙げられます。
- 一方向性: ハッシュ値から元の入力データを復元することは非常に困難です。
- 衝突耐性: 異なる入力データから同じハッシュ値が生成されること(衝突)は非常に稀であるべきです。
- 決定性: 同じ入力に対しては常に同じハッシュ値が生成されます。
ハッシュ関数は、データの整合性チェック(ファイルが改ざんされていないか)、パスワードの保存、データ構造(ハッシュテーブル)、デジタル署名など、幅広い用途で利用されます。Goの標準ライブラリのhash
パッケージは、これらの基本的なハッシュアルゴリズムを提供することを目的としています。
技術的詳細
このコミットは、Go言語のビルドシステムにおける2つの重要な側面を更新しています。
-
src/clean.bash
の更新:rm -f $GOROOT/pkg/*.[6a]
という行が追加されました。- これは、
$GOROOT/pkg
ディレクトリ内のすべての.6
ファイル(コンパイル済みオブジェクトファイル)と.a
ファイル(コンパイル済みパッケージアーカイブ)を強制的に削除するコマンドです。 -f
オプションは、存在しないファイルを無視し、確認プロンプトを表示せずに削除を実行します。- この変更により、
clean.bash
スクリプトが実行された際に、新しく追加されたhash
パッケージを含むすべてのコンパイル済みGoパッケージが確実に削除されるようになります。これにより、ビルド環境の整合性が保たれ、古いビルド成果物による問題が防止されます。
-
src/lib/Makefile
の更新:DIRS
変数にhash
が追加されました。DIRS
変数は、Goの標準ライブラリに含まれるサブディレクトリ(パッケージ)のリストを定義しています。このリストにhash
を追加することで、ビルドシステムはsrc/lib/hash
ディレクトリ(またはそれに相当する場所)にあるソースコードをGoの標準ライブラリの一部として認識し、コンパイル対象に含めるようになります。hash.dirinstall: os.dirinstall
という新しい依存関係ルールが追加されました。- これは、
hash
パッケージをインストール(ビルド)する前に、os
パッケージがインストールされている必要があることを示しています。 - この依存関係は、
hash
パッケージがos
パッケージの機能(例えば、ファイルシステムへのアクセスや環境変数の読み取りなど)を利用している可能性が高いことを示唆しています。Goの標準ライブラリでは、os
パッケージは基本的なシステムインタラクションを提供するため、多くの他のパッケージがこれに依存するのは一般的なパターンです。
- これは、
これらの変更は、Goの標準ライブラリに新しい機能(ハッシュ)を導入する際の典型的な手順を示しており、ビルドシステムが新しいコンポーネントを認識し、その依存関係を適切に処理し、クリーンアッププロセスに含めるように調整されることを意味します。
コアとなるコードの変更箇所
src/clean.bash
--- a/src/clean.bash
+++ b/src/clean.bash
@@ -3,6 +3,7 @@
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.
+rm -f $GOROOT/pkg/*.[6a]
for i in lib9 libbio libmach_amd64 libregexp cmd runtime lib
do
cd $i
src/lib/Makefile
--- a/src/lib/Makefile
+++ b/src/lib/Makefile
@@ -9,6 +9,7 @@ GC=6g
DIRS=\\
container/array\\
fmt\\
+\thash\\
http\\
math\\
net\\
@@ -86,6 +87,7 @@ io.6: os.dirinstall syscall.dirinstall
testing.6: flag.install fmt.dirinstall
fmt.dirinstall: io.install reflect.dirinstall strconv.dirinstall
+hash.dirinstall: os.dirinstall
http.dirinstall: bufio.install io.install net.dirinstall os.dirinstall strings.install
net.dirinstall: once.install os.dirinstall strconv.dirinstall
os.dirinstall: syscall.dirinstall
コアとなるコードの解説
src/clean.bash
の変更
追加された行 rm -f $GOROOT/pkg/*.[6a]
は、Goのビルド成果物であるコンパイル済みパッケージファイルを削除するためのものです。
rm
: ファイルを削除するコマンド。-f
: 強制的に削除を実行し、存在しないファイルがあってもエラーを出さず、確認プロンプトも表示しないオプション。$GOROOT/pkg/
: Goのコンパイル済みパッケージが格納されるディレクトリのパス。$GOROOT
はGoのインストールルートディレクトリを指す環境変数です。*.[6a]
: ワイルドカードパターンで、.6
または.a
の拡張子を持つすべてのファイルを指定します。.6
: Goの初期のコンパイラ(例:6g
)によって生成されるオブジェクトファイル。.a
: Goのパッケージアーカイブファイル。
この変更により、clean.bash
が実行されるたびに、以前にビルドされたすべてのGoパッケージ(新しいhash
パッケージを含む)が確実に削除され、クリーンなビルド環境が保証されます。
src/lib/Makefile
の変更
-
DIRS
変数へのhash
の追加:DIRS
変数は、Goの標準ライブラリとしてビルドされるべきサブディレクトリ(パッケージ)のリストを定義しています。このリストにhash
を追加することで、make
コマンドが実行された際に、src/lib/hash
ディレクトリ内のGoソースコードがコンパイルされ、Goの標準ライブラリの一部としてインストールされるようになります。これは、新しいパッケージをGoのビルドシステムに統合するための基本的なステップです。 -
hash.dirinstall: os.dirinstall
依存関係の追加: これはMakefileの依存関係ルールです。hash.dirinstall
:hash
パッケージのインストール(ビルド)ターゲット。os.dirinstall
:os
パッケージのインストール(ビルド)ターゲット。 このルールは、「hash
パッケージをインストールする前に、os
パッケージがインストールされている必要がある」ことを意味します。これは、hash
パッケージがその機能を実現するためにos
パッケージの関数や定数に依存していることを示唆しています。例えば、ハッシュ関数がファイルからデータを読み込む必要がある場合、os
パッケージのファイルI/O機能を利用する可能性があります。このような依存関係を明示することで、ビルドの順序が正しく保証され、必要なコンポーネントがすべて利用可能になってからhash
パッケージがビルドされるようになります。
これらの変更は、Goの標準ライブラリに新しい機能を追加し、そのビルドとクリーンアップのプロセスを適切に管理するための、初期開発段階における重要なステップを示しています。
関連リンク
- Go言語の公式ドキュメント (現在の
hash
パッケージ): https://pkg.go.dev/hash - Go言語の初期の歴史に関する情報 (Goのブログなど): https://go.dev/blog/
参考にした情報源リンク
- Go言語のソースコードリポジトリ: https://github.com/golang/go
- Makefileの基本に関するドキュメント (一般的な情報): https://www.gnu.org/software/make/manual/make.html
- シェルスクリプトの
rm
コマンドに関するドキュメント (一般的な情報): https://man7.org/linux/man-pages/man1/rm.1.html - Go言語の初期のビルドプロセスに関する議論やドキュメント (当時の情報): (特定のURLは特定できませんが、Goのメーリングリストアーカイブや初期の設計ドキュメントに情報がある可能性があります。)