[インデックス 1785] ファイルの概要
このコミットは、Go言語の初期開発段階における重要なディレクトリ構造の変更を記録しています。具体的には、src/lib/lang
ディレクトリが src/lib/go
にリネームされたことを示しています。これは、Go言語のコアライブラリのパッケージ名が、より直感的で言語自体を指し示すものへと変更されたことを意味します。
コミット
commit dc5ddd7d84f46e898246e54ab417de90f33be41b
Author: Robert Griesemer <gri@golang.org>
Date: Mon Mar 9 12:41:53 2009 -0700
- directory rename lang -> go
R=rsc
DELTA=2070 (1035 added, 1035 deleted, 0 changed)
OCL=25939
CL=25939
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/dc5ddd7d84f46e898246e54ab417de90f33be41b
元コミット内容
--- a/src/lib/Makefile
+++ b/src/lib/Makefile
@@ -9,11 +9,11 @@ GC=6g
DIRS=\
container\
fmt\
+\tgo\
hash\
http\
io\
json\
-\tlang\
math\
net\
os\
@@ -99,12 +99,12 @@ strings.6: utf8.install
testing.6: flag.install fmt.dirinstall
fmt.dirinstall: io.dirinstall reflect.dirinstall strconv.dirinstall
+go.dirinstall: strconv.dirinstall utf8.install unicode.dirinstall
hash.dirinstall: os.dirinstall
http.dirinstall: bufio.install io.dirinstall net.dirinstall os.dirinstall strings.install log.install
io.dirinstall: os.dirinstall sync.dirinstall
json.dirinstall: container.dirinstall fmt.dirinstall io.dirinstall math.dirinstall \
strconv.dirinstall strings.install utf8.install
-lang.dirinstall: strconv.dirinstall utf8.install unicode.dirinstall
# TODO(rsc): net is not supposed to depend on fmt or strings or strconv
net.dirinstall: fmt.dirinstall once.install os.dirinstall strconv.dirinstall strings.install
os.dirinstall: syscall.dirinstall once.install
diff --git a/src/lib/lang/Makefile b/src/lib/go/Makefile
similarity index 100%
rename from src/lib/lang/Makefile
rename to src/lib/go/Makefile
diff --git a/src/lib/lang/scanner.go b/src/lib/go/scanner.go
similarity index 100%
rename from src/lib/lang/scanner.go
rename to src/lib/go/scanner.go
diff --git a/src/lib/lang/scanner_test.go b/src/lib/go/scanner_test.go
similarity index 100%
rename from src/lib/lang/scanner_test.go
rename to src/lib/go/scanner_test.go
diff --git a/src/lib/lang/token.go b/src/lib/go/token.go
similarity index 100%
rename from src/lib/lang/token.go
rename to src/lib/go/token.go
diff --git a/src/run.bash b/src/run.bash
index a2fffebf60..73b2ef83c1 100755
--- a/src/run.bash
+++ b/src/run.bash
@@ -25,10 +25,10 @@ maketest() {
maketest \
lib/fmt\
+\tlib/go\
lib/hash\
lib/io\
lib/json\
-\tlib/lang\
lib/math\
lib/net\
lib/os\
変更の背景
このコミットは、Go言語の非常に初期の段階、具体的には2009年3月に行われたものです。当時のGo言語はまだ一般に公開されておらず、Google社内で開発が進められていました。この時期は、言語の設計、標準ライブラリの構造、ビルドシステムなどが活発に議論され、変更されていた過渡期にあたります。
src/lib/lang
というディレクトリ名は、おそらく「言語関連のユーティリティ」や「言語のコア機能」といった漠然とした意味合いを持っていたと考えられます。しかし、Go言語が独自のアイデンティティを確立し、そのエコシステムが形成され始めるにつれて、より明確で簡潔な命名規則が求められるようになりました。
lang
から go
へのリネームは、以下の意図があったと推測されます。
- 明確性の向上:
go
という名前は、そのディレクトリがGo言語のコアパッケージや、Go言語自体に関連する機能を含むことを直接的に示します。これは、他の言語(例えばJavaのjava.lang
パッケージ)との混同を避ける上でも有効です。 - 簡潔性:
go
はlang
よりも短く、タイプしやすいです。これは、開発者が頻繁に参照するであろうコアパッケージにとって重要な要素です。 - ブランド統一: 言語名そのものをパッケージ名に採用することで、Go言語のブランドとしての統一感を高める効果があります。
この変更は、Go言語がその後の成長と普及に向けて、内部構造を整理し、より洗練された形へと進化していく過程の一部と見なすことができます。
前提知識の解説
このコミットを理解するためには、以下の前提知識が役立ちます。
1. Go言語の初期開発とディレクトリ構造
Go言語は、2007年にGoogleで設計が始まり、2009年11月にオープンソースとして公開されました。このコミットが行われた2009年3月は、まさに公開前の活発な開発期間にあたります。
Goのソースコードリポジトリは、伝統的に以下のようなトップレベルのディレクトリ構造を持っています。
src
: Go言語のソースコード、標準ライブラリ、ツールなどが含まれます。src/cmd
: コンパイラ、リンカ、その他のコマンドラインツール。src/pkg
: 標準ライブラリのパッケージ。src/runtime
: Goランタイムのコード。
doc
: ドキュメント。test
: テストスイート。
このコミットで変更されている src/lib
は、当時のGoの標準ライブラリの一部を構成していたと考えられます。現在のGoのソースコードでは、標準ライブラリは主に src/pkg
以下に配置されていますが、初期には src/lib
のような構造も存在していました。
2. Makefile
の役割
Makefile
は、Unix系のシステムでソフトウェアのビルドプロセスを自動化するために使用されるファイルです。make
コマンドによって解釈され、ソースコードのコンパイル、リンク、テストの実行など、一連のタスクを定義します。
このコミットでは、src/lib/Makefile
と src/lib/lang/Makefile
(リネーム後は src/lib/go/Makefile
) が変更されています。これらの Makefile
は、それぞれのディレクトリ内のGoパッケージのビルド方法や依存関係を定義していました。
DIRS
変数: ビルド対象となるサブディレクトリ(パッケージ)のリストを定義します。*.dirinstall
ターゲット: 特定のパッケージをインストールするためのルールを定義します。これには、そのパッケージが依存する他のパッケージのインストールも含まれます。
3. scanner.go
, token.go
の役割
コミットでリネームされているファイルには scanner.go
と token.go
が含まれています。これらは、Go言語のコンパイラやツールチェーンにおいて、非常に基本的な役割を果たすファイルです。
token.go
: 字句解析(lexical analysis)の過程で使用されるトークン(予約語、識別子、演算子など)の定義が含まれます。例えば、IDENT
(識別子)、INT
(整数リテラル)、ADD
(加算演算子+
) などが定義されます。scanner.go
: ソースコードを読み込み、一連のトークンに分解する字句解析器(scannerまたはlexer)の実装が含まれます。これは、コンパイラの最初のフェーズであり、ソースコードをより高レベルな構造に変換するための準備を行います。
これらのファイルが lang
ディレクトリに存在していたことは、それらがGo言語の構文解析やコンパイルの根幹をなす部分であったことを示唆しています。
技術的詳細
このコミットの技術的な詳細は、主に以下の2点に集約されます。
- ディレクトリのリネーム:
src/lib/lang
ディレクトリがsrc/lib/go
に変更されました。これは、ファイルシステム上の物理的な変更であり、それに伴い、このディレクトリを参照するすべてのパスが更新される必要があります。 - ビルドシステムの更新: ディレクトリのリネームに伴い、
Makefile
内の参照パスが更新されました。これは、Go言語のビルドプロセスが、新しいディレクトリ構造を正しく認識し、関連するパッケージをビルドできるようにするために不可欠です。
Gitの差分を見ると、src/lib/lang/Makefile
、src/lib/lang/scanner.go
、src/lib/lang/scanner_test.go
、src/lib/lang/token.go
の4つのファイルがリネームされています。Gitはリネームを検出するため、これらのファイルの内容自体は変更されていません(similarity index 100%
がその証拠です)。
src/lib/Makefile
の変更は、ビルドシステムが lang
パッケージの代わりに go
パッケージを認識するように更新されたことを示しています。
DIRS
変数からlang
が削除され、go
が追加されました。これにより、make
コマンドがビルド対象のディレクトリを探索する際に、新しいパスを辿るようになります。lang.dirinstall
ターゲットがgo.dirinstall
に変更されました。これに伴い、go.dirinstall
の依存関係も定義されています。strconv.dirinstall
、utf8.install
、unicode.dirinstall
は、go
パッケージが依存する他の標準ライブラリパッケージを示しています。これは、scanner
やtoken
パッケージが文字列変換、UTF-8エンコーディング、Unicode処理などの機能に依存していたことを意味します。
src/run.bash
の変更も同様に、テスト実行スクリプトが lib/lang
の代わりに lib/go
を参照するように更新されたことを示しています。これは、リネームされたパッケージのテストが引き続き実行されるようにするために必要です。
この変更は、Go言語の初期のモジュール化とパッケージング戦略における重要なステップであり、後のGoモジュールシステムやパッケージ管理の基盤となる考え方の一端を垣間見ることができます。
コアとなるコードの変更箇所
このコミットにおけるコアとなるコードの変更箇所は、以下のファイルとその内容です。
-
src/lib/Makefile
:DIRS
変数から-lang
が削除され、+go
が追加されました。lang.dirinstall
ターゲットが削除され、go.dirinstall
ターゲットが追加されました。go.dirinstall: strconv.dirinstall utf8.install unicode.dirinstall
-
src/run.bash
:maketest
関数内で参照されるパスから-lib/lang
が削除され、+lib/go
が追加されました。
-
ディレクトリとファイルのリネーム:
src/lib/lang/Makefile
->src/lib/go/Makefile
src/lib/lang/scanner.go
->src/lib/go/scanner.go
src/lib/lang/scanner_test.go
->src/lib/go/scanner_test.go
src/lib/lang/token.go
->src/lib/go/token.go
コアとなるコードの解説
src/lib/Makefile
の変更
この Makefile
は、Go言語の標準ライブラリのビルドプロセスを管理していました。
-
DIRS
変数の変更:- lang\ + go\
これは、
make
コマンドがサブディレクトリを探索してビルドする際に、これまでのlang
ディレクトリの代わりにgo
ディレクトリを対象とするように指示しています。これにより、ビルドシステムは新しいパスでパッケージを見つけることができます。 -
*.dirinstall
ターゲットの変更:-lang.dirinstall: strconv.dirinstall utf8.install unicode.dirinstall +go.dirinstall: strconv.dirinstall utf8.install unicode.dirinstall
lang.dirinstall
は、lang
パッケージをインストールするためのルールでした。このルールは、strconv
、utf8
、unicode
といった他のパッケージに依存していました。この変更により、go
パッケージがこれらの依存関係を引き継ぎ、正しくビルドおよびインストールされるようになります。これは、scanner.go
やtoken.go
が文字列変換、UTF-8エンコーディング、Unicode文字の処理といった機能に依存していたため、これらの依存パッケージが先にビルドされている必要があることを示しています。
src/run.bash
の変更
このシェルスクリプトは、Go言語のテストスイートを実行するためのものでした。
- lib/lang\
+ lib/go\
maketest
関数は、引数として与えられたパスにあるパッケージのテストを実行します。この変更は、テスト対象のパッケージのパスが lib/lang
から lib/go
に変更されたことを反映しており、リネーム後もテストが継続して実行されることを保証します。
ディレクトリとファイルのリネーム
Gitの差分では、rename from
と rename to
の行で示されているように、src/lib/lang
ディレクトリとその中のファイルが src/lib/go
に移動されました。similarity index 100%
は、ファイルの内容自体は変更されず、単に場所が移動しただけであることを意味します。
このリネームは、Go言語のコアパッケージが、より適切で簡潔な名前空間に配置されたことを示しています。scanner.go
と token.go
は、Go言語の字句解析器とトークン定義の根幹をなすファイルであり、これらが go
パッケージの一部となったことで、Go言語の基本的な構成要素が go
という名前の下に集約されることになりました。
これらの変更は、Go言語の初期の段階で、その内部構造とパッケージング戦略がどのように進化していったかを示す良い例です。
関連リンク
- Go言語の公式ウェブサイト: https://go.dev/
- Go言語のソースコードリポジトリ (GitHub): https://github.com/golang/go
- Go言語の初期の歴史に関する情報 (Go Blogなど): https://go.dev/blog/
参考にした情報源リンク
- Gitのドキュメント (特に
git diff
のリネーム検出について): https://git-scm.com/docs/git-diff - Makefileの基本的な構文と使い方: https://www.gnu.org/software/make/manual/make.html
- Go言語の字句解析と構文解析に関する一般的な情報 (コンパイラ理論): https://en.wikipedia.org/wiki/Lexical_analysis
- Go言語の初期のコミット履歴 (GitHub): https://github.com/golang/go/commits/master?after=dc5ddd7d84f46e898246e54ab417de90f33be41b+399 (このコミットの前後関係を確認するために使用)
- Go言語の歴史に関する非公式な情報源やブログ記事 (例: "The Go Programming Language" の初期のレビューなど)
これらの情報源は、コミットの背景、技術的な詳細、および関連する概念を理解する上で役立ちました。