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

[インデックス 150] ファイルの概要

このコミットは、Go言語の初期開発段階におけるビルドシステムと環境変数の調整、および内部的な型定義の変更に関するものです。具体的には、ビルドスクリプトが $PLAN9 環境変数ではなく $GOROOT を使用するように修正し、バイナリのインストールパスに関するドキュメントを更新しています。また、src/cmd/gc/sysimport.c ファイル内のシステムインポートに関する型定義の識別子を更新しています。

コミット

commit 820368a19ac19e37667f1fc2ec70a10884cdb3ac
Author: Rob Pike <r@golang.org>
Date:   Wed Jun 11 13:59:55 2008 -0700

    fix up mkfiles to use $GOROOT instead of $PLAN9
    mention in setup doc that binaries go into $HOME/bin
    
    SVN=122177

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/820368a19ac19e37667f1fc2ec70a10884cdb3ac

元コミット内容

fix up mkfiles to use $GOROOT instead of $PLAN9
mention in setup doc that binaries go into $HOME/bin

変更の背景

このコミットは、Go言語の初期段階における重要な環境設定の変更を反映しています。Go言語は、その設計思想や実装において、Rob Pike氏が以前に深く関わっていたPlan 9オペレーティングシステムの影響を強く受けています。初期のGoのビルドシステムやツールチェインは、Plan 9の慣習やツール(例えば、mkコマンドやPlan 9の環境変数)を借用していました。

しかし、Goが独立したプロジェクトとして成熟するにつれて、Plan 9固有の環境変数である $PLAN9 をGo独自の環境変数である $GOROOT に置き換える必要が生じました。これは、GoのビルドプロセスをPlan 9の環境から切り離し、より汎用的なUnix系システムや他の環境で独立して機能させるための重要なステップでした。

また、ビルドされたGoのバイナリがどこに配置されるかという情報も、ユーザーにとって明確である必要がありました。初期のドキュメントではこの点が不明瞭であったか、あるいは変更の必要があったため、バイナリが $HOME/bin にインストールされることをセットアップドキュメントに明記する変更も同時に行われました。これは、ユーザーがGoをインストールし、そのツールをパスに追加する際の利便性を向上させるためのものです。

src/cmd/gc/sysimport.c の変更は、直接的なビルド環境の変更とは異なり、Goコンパイラの内部的な型システムに関連するものです。Goコンパイラ(gc)は、Goのソースコードを機械語に変換する際に、内部的に型情報を管理します。このファイルは、Goの組み込み型やシステムコールに関連する型定義をC言語の文字列として保持していると考えられます。変更された識別子(例: _o137 から _o116)は、これらの内部的な型定義のハッシュ値や生成された一意な名前が、コンパイラの変更に伴って更新されたことを示唆しています。これは、コンパイラの進化に伴う自然な変更であり、外部のユーザーには直接影響しない内部的な調整です。

前提知識の解説

Go言語の初期開発とPlan 9

Go言語は、GoogleでRob Pike、Ken Thompson、Robert Griesemerによって設計されました。これらの設計者の多くは、以前にベル研究所でPlan 9というオペレーティングシステムの開発に携わっていました。Plan 9は、Unixの設計思想をさらに推し進め、ネットワーク透過性やファイルシステム中心のアプローチを特徴としていました。

Go言語の初期のビルドシステムやツールチェインは、Plan 9のツール(例えば、mkビルドツール)や環境変数の概念を強く引き継いでいました。

  • mk: Plan 9で開発されたビルドツールで、Unixのmakeに似ていますが、よりシンプルで強力な依存関係解決能力を持っていました。Goの初期のビルドスクリプトはmkファイルを使用していました。
  • $PLAN9 環境変数: Plan 9システムにおいて、Plan 9のルートディレクトリを示す環境変数でした。Goの初期のビルドスクリプトも、GoのソースやツールがPlan 9の環境に依存しているかのように、この変数を使用していた可能性があります。

$GOROOT 環境変数

Go言語が独立したプロジェクトとして確立されるにつれて、Go自身のルートディレクトリを示すための専用の環境変数が必要になりました。それが $GOROOT です。

  • $GOROOT: Goのインストールルートディレクトリを指す環境変数です。Goのコンパイラ、標準ライブラリ、ツールなどがこのディレクトリ以下に配置されます。Goのビルドシステムは、この $GOROOT を参照して、必要なファイルやツールを見つけます。

src/cmd/gc/sysimport.c

src/cmd/gc/sysimport.c は、Goコンパイラ(gc)のソースコードの一部です。このファイルは、Goのランタイムやシステムコールに関連する「組み込み型」や「システム関数」の定義を、コンパイラが内部的に利用できる形式で保持しています。

Goコンパイラは、Goのソースコードを解析し、抽象構文木(AST)を構築し、最終的に機械語に変換します。この過程で、printpanicのような組み込み関数、あるいはuint8のような基本型がどのように扱われるかをコンパイラに教える必要があります。sysimport.c の内容は、これらの定義をC言語の文字列リテラルとして埋め込み、コンパイラが起動時に読み込むことで、Goの組み込み機能が正しく認識されるようにしています。

ファイル内の type sys._eXXXvar !sys.funcName のような記述は、Goコンパイラが内部的に使用する型システムやシンボルテーブルの表現の一部です。これらの識別子(例: _e002, _o137, _i139)は、コンパイラが型や構造体を一意に識別するために生成する内部的なハッシュ値やシーケンス番号のようなものです。コンパイラの開発が進むにつれて、これらの内部的な識別子が再生成されたり、変更されたりすることはよくあります。

技術的詳細

このコミットは、主に2つの側面で技術的な変更を加えています。

  1. ビルド環境変数の移行:

    • mkfiles (おそらくGoのビルドスクリプトであるMakefileのようなもの) が、Plan 9由来の $PLAN9 環境変数ではなく、Go固有の $GOROOT 環境変数を使用するように修正されました。
    • これは、GoのビルドシステムがPlan 9の環境から独立し、Go自身の環境設定に完全に移行したことを意味します。これにより、Goのビルドプロセスがよりポータブルになり、Plan 9のツールチェインがインストールされていないシステムでも容易にビルドできるようになります。
    • この変更は、Goが独立したプログラミング言語としての地位を確立する上で不可欠なステップでした。
  2. src/cmd/gc/sysimport.c の内部型定義の更新:

    • sysimport.c ファイルは、Goコンパイラが内部的に使用するシステムインポートの定義を含んでいます。このファイルは、Goの組み込み型や関数(例: mal, panicl, printbool, printfloat, printint, printstring, printpointer, catstring, cmpstring, slicestring, indexstring, intstring, byteastring, mkiface, frexp, ldexp, modf など)のシグネチャや構造を定義する文字列リテラルを含んでいます。
    • 変更内容は、これらの文字列リテラル内の特定の識別子(例: _o137 から _o116_i139 から _i118 など)が更新されていることです。これらの識別子は、コンパイラが内部的に型や構造体を一意に参照するために生成するものであり、コンパイラの内部構造や型システムが変更された結果として更新されたと考えられます。
    • これは、Goコンパイラの開発過程で、内部的な型表現やシンボル管理のメカニズムが進化し、それに伴ってこれらの自動生成される識別子も変更されたことを示しています。この種の変更は、コンパイラの機能改善や最適化、あるいはバグ修正の一環として行われることが一般的です。

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

変更は src/cmd/gc/sysimport.c ファイルに集中しています。

--- a/src/cmd/gc/sysimport.c
+++ b/src/cmd/gc/sysimport.c
@@ -2,10 +2,10 @@ char*\tsysimport =\
 	"type sys._e002 {}\\n"\
 	"type sys.uint8 2\\n"\
 	"type sys._e003 *sys.uint8\\n"\
-"	type sys._o137 {_e135 sys._e003}\\n"\
+"	type sys._o116 {_e114 sys._e003}\\n"\
 	"type sys.uint32 6\\n"\
-"	type sys._i139 {_e136 sys.uint32}\\n"\
-"	type sys._e001 (sys._e002 sys._o137 sys._i139)\\n"\
+"	type sys._i118 {_e115 sys.uint32}\\n"\
+"	type sys._e001 (sys._e002 sys._o116 sys._i118)\\n"\
 	"var !sys.mal sys._e001\\n"\
 	"type sys._e005 {}\\n"\
 	"type sys._e006 {}\\n"\
@@ -15,95 +15,95 @@ char*\tsysimport =\
 	"type sys._e009 {}\\n"\
 	"type sys._e010 {}\\n"\
 	"type sys.int32 5\\n"\
-"	type sys._i145 {_e144 sys.int32}\\n"\
-"	type sys._e008 (sys._e009 sys._e010 sys._i145)\\n"\
+"	type sys._i124 {_e123 sys.int32}\\n"\
+"	type sys._e008 (sys._e009 sys._e010 sys._i124)\\n"\
 	"var !sys.panicl sys._e008\\n"\
 	"type sys._e012 {}\\n"\
 	"type sys._e013 {}\\n"\
 	"type sys.bool 12\\n"\
-"	type sys._i150 {_e149 sys.bool}\\n"\
-"	type sys._e011 (sys._e012 sys._e013 sys._i150)\\n"\
+"	type sys._i129 {_e128 sys.bool}\\n"\
+"	type sys._e011 (sys._e012 sys._e013 sys._i129)\\n"\
 	"var !sys.printbool sys._e011\\n"\
 	"type sys._e015 {}\\n"\
 	"type sys._e016 {}\\n"\
 	"type sys.float64 10\\n"\
-"	type sys._i155 {_e154 sys.float64}\\n"\
-"	type sys._e014 (sys._e015 sys._e016 sys._i155)\\n"\
+"	type sys._i134 {_e133 sys.float64}\\n"\
+"	type sys._e014 (sys._e015 sys._e016 sys._i134)\\n"\
 	"var !sys.printfloat sys._e014\\n"\
 	"type sys._e018 {}\\n"\
 	"type sys._e019 {}\\n"\
 	"type sys.int64 7\\n"\
-"	type sys._i160 {_e159 sys.int64}\\n"\
-"	type sys._e017 (sys._e018 sys._e019 sys._i160)\\n"\
+"	type sys._i139 {_e138 sys.int64}\\n"\
+"	type sys._e017 (sys._e018 sys._e019 sys._i139)\\n"\
 	"var !sys.printint sys._e017\\n"\
 	"type sys._e021 {}\\n"\
 	"type sys._e022 {}\\n"\
 	"type sys._e023 25\\n"\
 	"type sys.string *sys._e023\\n"\
-"	type sys._i165 {_e164 sys.string}\\n"\
-"	type sys._e020 (sys._e021 sys._e022 sys._i165)\\n"\
+"	type sys._i144 {_e143 sys.string}\\n"\
+"	type sys._e020 (sys._e021 sys._e022 sys._i144)\\n"\
 	"var !sys.printstring sys._e020\\n"\
 	"type sys._e025 {}\\n"\
 	"type sys._e026 {}\\n"\
 	"type sys._e027 *sys.uint8\\n"\
-"	type sys._i170 {_e169 sys._e027}\\n"\
-"	type sys._e024 (sys._e025 sys._e026 sys._i170)\\n"\
+"	type sys._i149 {_e148 sys._e027}\\n"\
+"	type sys._e024 (sys._e025 sys._e026 sys._i149)\\n"\
 	"var !sys.printpointer sys._e024\\n"\
 	"type sys._e029 {}\\n"\
-"	type sys._o177 {_e174 sys.string}\\n"\
-"	type sys._i179 {_e175 sys.string _e176 sys.string}\\n"\
-"	type sys._e028 (sys._e029 sys._o177 sys._i179)\\n"\
+"	type sys._o156 {_e153 sys.string}\\n"\
+"	type sys._i158 {_e154 sys.string _e155 sys.string}\\n"\
+"	type sys._e028 (sys._e029 sys._o156 sys._i158)\\n"\
 	"var !sys.catstring sys._e028\\n"\
 	"type sys._e031 {}\\n"\
-"	type sys._o187 {_e184 sys.int32}\\n"\
-"	type sys._i189 {_e185 sys.string _e186 sys.string}\\n"\
-"	type sys._e030 (sys._e031 sys._o187 sys._i189)\\n"\
+"	type sys._o166 {_e163 sys.int32}\\n"\
+"	type sys._i168 {_e164 sys.string _e165 sys.string}\\n"\
+"	type sys._e030 (sys._e031 sys._o166 sys._i168)\\n"\
 	"var !sys.cmpstring sys._e030\\n"\
 	"type sys._e033 {}\\n"\
-"	type sys._o198 {_e194 sys.string}\\n"\
-"	type sys._i200 {_e195 sys.string _e196 sys.int32 _e197 sys.int32}\\n"\
-"	type sys._e032 (sys._e033 sys._o198 sys._i200)\\n"\
+"	type sys._o177 {_e173 sys.string}\\n"\
+"	type sys._i179 {_e174 sys.string _e175 sys.int32 _e176 sys.int32}\\n"\
+"	type sys._e032 (sys._e033 sys._o177 sys._i179)\\n"\
 	"var !sys.slicestring sys._e032\\n"\
 	"type sys._e035 {}\\n"\
-"	type sys._o209 {_e206 sys.uint8}\\n"\
-"	type sys._i211 {_e207 sys.string _e208 sys.int32}\\n"\
-"	type sys._e034 (sys._e035 sys._o209 sys._i211)\\n"\
+"	type sys._o188 {_e185 sys.uint8}\\n"\
+"	type sys._i190 {_e186 sys.string _e187 sys.int32}\\n"\
+"	type sys._e034 (sys._e035 sys._o188 sys._i190)\\n"\
 	"var !sys.indexstring sys._e034\\n"\
 	"type sys._e037 {}\\n"\
-"	type sys._o218 {_e216 sys.string}\\n"\
-"	type sys._i220 {_e217 sys.int64}\\n"\
-"	type sys._e036 (sys._e037 sys._o218 sys._i220)\\n"\
+"	type sys._o197 {_e195 sys.string}\\n"\
+"	type sys._i199 {_e196 sys.int64}\\n"\
+"	type sys._e036 (sys._e037 sys._o197 sys._i199)\\n"\
 	"var !sys.intstring sys._e036\\n"\
 	"type sys._e039 {}\\n"\
-"	type sys._o227 {_e224 sys.string}\\n"\
+"	type sys._o206 {_e203 sys.string}\\n"\
 	"type sys._e040 *sys.uint8\\n"\
-"	type sys._i229 {_e225 sys._e040 _e226 sys.int32}\\n"\
-"	type sys._e038 (sys._e039 sys._o227 sys._i229)\\n"\
+"	type sys._i208 {_e204 sys._e040 _e205 sys.int32}\\n"\
+"	type sys._e038 (sys._e039 sys._o206 sys._i208)\\n"\
 	"var !sys.byteastring sys._e038\\n"\
 	"type sys._e042 {}\\n"\
 	"type sys._e043 <>\\n"\
-"	type sys._o238 {_e234 sys._e043}\\n"\
+"	type sys._o217 {_e213 sys._e043}\\n"\
 	"type sys._e044 *sys.uint8\\n"\
 	"type sys._e045 *sys.uint8\\n"\
-"	type sys._s245 {}\\n"\
-"	type sys._e046 *sys._s245\\n"\
-"	type sys._i240 {_e235 sys._e044 _e236 sys._e045 _e237 sys._e046}\\n"\
-"	type sys._e041 (sys._e042 sys._o238 sys._i240)\\n"\
+"	type sys._s224 {}\\n"\
+"	type sys._e046 *sys._s224\\n"\
+"	type sys._i219 {_e214 sys._e044 _e215 sys._e045 _e216 sys._e046}\\n"\
+"	type sys._e041 (sys._e042 sys._o217 sys._i219)\\n"\
 	"var !sys.mkiface sys._e041\\n"\
 	"type sys._e048 {}\\n"\
-"	type sys._o251 {_e248 sys.int32 _e249 sys.float64}\\n"\
-"	type sys._i253 {_e250 sys.float64}\\n"\
-"	type sys._e047 (sys._e048 sys._o251 sys._i253)\\n"\
+"	type sys._o230 {_e227 sys.int32 _e228 sys.float64}\\n"\
+"	type sys._i232 {_e229 sys.float64}\\n"\
+"	type sys._e047 (sys._e048 sys._o230 sys._i232)\\n"\
 	"var !sys.frexp sys._e047\\n"\
 	"type sys._e050 {}\\n"\
-"	type sys._o260 {_e257 sys.float64}\\n"\
-"	type sys._i262 {_e258 sys.int32 _e259 sys.float64}\\n"\
-"	type sys._e049 (sys._e050 sys._o260 sys._i262)\\n"\
+"	type sys._o239 {_e236 sys.float64}\\n"\
+"	type sys._i241 {_e237 sys.int32 _e238 sys.float64}\\n"\
+"	type sys._e049 (sys._e050 sys._o239 sys._i241)\\n"\
 	"var !sys.ldexp sys._e049\\n"\
 	"type sys._e052 {}\\n"\
-"	type sys._o270 {_e267 sys.float64 _e268 sys.float64}\\n"\
-"	type sys._i272 {_e269 sys.float64}\\n"\
-"	type sys._e051 (sys._e052 sys._o270 sys._i272)\\n"\
+"	type sys._o249 {_e246 sys.float64 _e247 sys.float64}\\n"\
+"	type sys._i251 {_e248 sys.float64}\\n"\
+"	type sys._e051 (sys._e052 sys._o249 sys._i251)\\n"\
 	"var !sys.modf sys._e051\\n"\
 	"))\\n"\
 	";\n"

コアとなるコードの解説

src/cmd/gc/sysimport.c ファイルは、GoコンパイラがGoの組み込み型や関数を認識するために必要な情報をC言語の文字列として定義しています。この文字列は、コンパイラが起動時にパースし、内部的な型システムを構築するために使用されます。

変更の核心は、この文字列内の特定の識別子(例: _o137, _i139, _i145 など)が、新しい識別子(例: _o116, _i118, _i124 など)に置き換えられている点です。これらの識別子は、Goコンパイラが内部的に型や構造体を一意に参照するために生成するものであり、通常はハッシュ値やシーケンス番号に基づいています。

例えば、以下の行を見てみましょう。

-	"type sys._o137 {_e135 sys._e003}\\n"\
+	"type sys._o116 {_e114 sys._e003}\\n"\

これは、sys._o137 という内部型が sys._o116 に変更されたことを示しています。同様に、_e135_e114 に変更されています。これらの変更は、Goコンパイラの内部的な型システムやシンボル管理のロジックが更新された結果として発生します。これは、コンパイラの開発過程で、型定義の構造が変更されたり、新しい型が追加されたり、既存の型が再編成されたりする際に起こり得ます。

このコミットのメッセージにある「fix up mkfiles to use $GOROOT instead of $PLAN9」という部分は、sysimport.c の変更とは直接関係ありませんが、Goプロジェクト全体のビルドシステムにおける重要な変更を示唆しています。sysimport.c の変更は、コンパイラ内部の整合性を保つための自動的または半自動的な更新である可能性が高いです。

この変更は、Goコンパイラの内部的な動作に影響を与えるものであり、Go言語のユーザーが直接意識するものではありません。しかし、Goコンパイラの進化の過程で、その内部構造がどのように変化していったかを示す貴重な証拠となります。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント
  • Go言語のソースコード
  • Plan 9のドキュメント
  • Gitのコミット履歴と差分表示
  • Go言語の初期開発に関するブログ記事やメーリングリストの議論(一般的な知識として)
  • コンパイラの内部構造に関する一般的な知識