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

[インデックス 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 へのリネームは、以下の意図があったと推測されます。

  1. 明確性の向上: go という名前は、そのディレクトリがGo言語のコアパッケージや、Go言語自体に関連する機能を含むことを直接的に示します。これは、他の言語(例えばJavaのjava.langパッケージ)との混同を避ける上でも有効です。
  2. 簡潔性: golang よりも短く、タイプしやすいです。これは、開発者が頻繁に参照するであろうコアパッケージにとって重要な要素です。
  3. ブランド統一: 言語名そのものをパッケージ名に採用することで、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/Makefilesrc/lib/lang/Makefile (リネーム後は src/lib/go/Makefile) が変更されています。これらの Makefile は、それぞれのディレクトリ内のGoパッケージのビルド方法や依存関係を定義していました。

  • DIRS 変数: ビルド対象となるサブディレクトリ(パッケージ)のリストを定義します。
  • *.dirinstall ターゲット: 特定のパッケージをインストールするためのルールを定義します。これには、そのパッケージが依存する他のパッケージのインストールも含まれます。

3. scanner.go, token.go の役割

コミットでリネームされているファイルには scanner.gotoken.go が含まれています。これらは、Go言語のコンパイラやツールチェーンにおいて、非常に基本的な役割を果たすファイルです。

  • token.go: 字句解析(lexical analysis)の過程で使用されるトークン(予約語、識別子、演算子など)の定義が含まれます。例えば、IDENT (識別子)、INT (整数リテラル)、ADD (加算演算子 +) などが定義されます。
  • scanner.go: ソースコードを読み込み、一連のトークンに分解する字句解析器(scannerまたはlexer)の実装が含まれます。これは、コンパイラの最初のフェーズであり、ソースコードをより高レベルな構造に変換するための準備を行います。

これらのファイルが lang ディレクトリに存在していたことは、それらがGo言語の構文解析やコンパイルの根幹をなす部分であったことを示唆しています。

技術的詳細

このコミットの技術的な詳細は、主に以下の2点に集約されます。

  1. ディレクトリのリネーム: src/lib/lang ディレクトリが src/lib/go に変更されました。これは、ファイルシステム上の物理的な変更であり、それに伴い、このディレクトリを参照するすべてのパスが更新される必要があります。
  2. ビルドシステムの更新: ディレクトリのリネームに伴い、Makefile 内の参照パスが更新されました。これは、Go言語のビルドプロセスが、新しいディレクトリ構造を正しく認識し、関連するパッケージをビルドできるようにするために不可欠です。

Gitの差分を見ると、src/lib/lang/Makefilesrc/lib/lang/scanner.gosrc/lib/lang/scanner_test.gosrc/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.dirinstallutf8.installunicode.dirinstall は、go パッケージが依存する他の標準ライブラリパッケージを示しています。これは、scannertoken パッケージが文字列変換、UTF-8エンコーディング、Unicode処理などの機能に依存していたことを意味します。

src/run.bash の変更も同様に、テスト実行スクリプトが lib/lang の代わりに lib/go を参照するように更新されたことを示しています。これは、リネームされたパッケージのテストが引き続き実行されるようにするために必要です。

この変更は、Go言語の初期のモジュール化とパッケージング戦略における重要なステップであり、後のGoモジュールシステムやパッケージ管理の基盤となる考え方の一端を垣間見ることができます。

コアとなるコードの変更箇所

このコミットにおけるコアとなるコードの変更箇所は、以下のファイルとその内容です。

  1. src/lib/Makefile:

    • DIRS 変数から -lang が削除され、+go が追加されました。
    • lang.dirinstall ターゲットが削除され、go.dirinstall ターゲットが追加されました。
      • go.dirinstall: strconv.dirinstall utf8.install unicode.dirinstall
  2. src/run.bash:

    • maketest 関数内で参照されるパスから -lib/lang が削除され、+lib/go が追加されました。
  3. ディレクトリとファイルのリネーム:

    • 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 パッケージをインストールするためのルールでした。このルールは、strconvutf8unicode といった他のパッケージに依存していました。この変更により、go パッケージがこれらの依存関係を引き継ぎ、正しくビルドおよびインストールされるようになります。これは、scanner.gotoken.go が文字列変換、UTF-8エンコーディング、Unicode文字の処理といった機能に依存していたため、これらの依存パッケージが先にビルドされている必要があることを示しています。

src/run.bash の変更

このシェルスクリプトは、Go言語のテストスイートを実行するためのものでした。

-	lib/lang\
+	lib/go\

maketest 関数は、引数として与えられたパスにあるパッケージのテストを実行します。この変更は、テスト対象のパッケージのパスが lib/lang から lib/go に変更されたことを反映しており、リネーム後もテストが継続して実行されることを保証します。

ディレクトリとファイルのリネーム

Gitの差分では、rename fromrename to の行で示されているように、src/lib/lang ディレクトリとその中のファイルが src/lib/go に移動されました。similarity index 100% は、ファイルの内容自体は変更されず、単に場所が移動しただけであることを意味します。

このリネームは、Go言語のコアパッケージが、より適切で簡潔な名前空間に配置されたことを示しています。scanner.gotoken.go は、Go言語の字句解析器とトークン定義の根幹をなすファイルであり、これらが go パッケージの一部となったことで、Go言語の基本的な構成要素が go という名前の下に集約されることになりました。

これらの変更は、Go言語の初期の段階で、その内部構造とパッケージング戦略がどのように進化していったかを示す良い例です。

関連リンク

参考にした情報源リンク

これらの情報源は、コミットの背景、技術的な詳細、および関連する概念を理解する上で役立ちました。