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

[インデックス 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つの重要な側面を更新しています。

  1. src/clean.bashの更新:

    • rm -f $GOROOT/pkg/*.[6a]という行が追加されました。
    • これは、$GOROOT/pkgディレクトリ内のすべての.6ファイル(コンパイル済みオブジェクトファイル)と.aファイル(コンパイル済みパッケージアーカイブ)を強制的に削除するコマンドです。
    • -fオプションは、存在しないファイルを無視し、確認プロンプトを表示せずに削除を実行します。
    • この変更により、clean.bashスクリプトが実行された際に、新しく追加されたhashパッケージを含むすべてのコンパイル済みGoパッケージが確実に削除されるようになります。これにより、ビルド環境の整合性が保たれ、古いビルド成果物による問題が防止されます。
  2. 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の変更

  1. DIRS変数へのhashの追加: DIRS変数は、Goの標準ライブラリとしてビルドされるべきサブディレクトリ(パッケージ)のリストを定義しています。このリストにhashを追加することで、makeコマンドが実行された際に、src/lib/hashディレクトリ内のGoソースコードがコンパイルされ、Goの標準ライブラリの一部としてインストールされるようになります。これは、新しいパッケージをGoのビルドシステムに統合するための基本的なステップです。

  2. hash.dirinstall: os.dirinstall依存関係の追加: これはMakefileの依存関係ルールです。

    • hash.dirinstall: hashパッケージのインストール(ビルド)ターゲット。
    • os.dirinstall: osパッケージのインストール(ビルド)ターゲット。 このルールは、「hashパッケージをインストールする前に、osパッケージがインストールされている必要がある」ことを意味します。これは、hashパッケージがその機能を実現するためにosパッケージの関数や定数に依存していることを示唆しています。例えば、ハッシュ関数がファイルからデータを読み込む必要がある場合、osパッケージのファイルI/O機能を利用する可能性があります。このような依存関係を明示することで、ビルドの順序が正しく保証され、必要なコンポーネントがすべて利用可能になってからhashパッケージがビルドされるようになります。

これらの変更は、Goの標準ライブラリに新しい機能を追加し、そのビルドとクリーンアップのプロセスを適切に管理するための、初期開発段階における重要なステップを示しています。

関連リンク

参考にした情報源リンク