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

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

このコミットは、Go言語の初期開発段階における、テストコードの機械的な変換作業を記録したものです。具体的には、Go言語の識別子の可視性(エクスポート)に関する仕様変更に伴い、既存のテストファイルに export キーワードを追加する変更が広範囲にわたって適用されています。コミットメッセージには「convert tests; nothing interesting.」とありますが、これは当時の開発者にとってはルーチンワークであったものの、Go言語の進化の歴史を理解する上で重要な意味を持つ変更です。

コミット

commit f48cbfdf5629526ed49534e55298a5a12216ea0c
Author: Russ Cox <rsc@golang.org>
Date:   Fri Jan 16 16:12:14 2009 -0800

    convert tests; nothing interesting.
    
    R=r
    OCL=23012
    CL=23014

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

https://github.com/golang/go/commit/f48cbfdf5629526ed49534e55298a5a12216ea0c

元コミット内容

コミットメッセージは「convert tests; nothing interesting.」と非常に簡潔です。これは、Go言語の初期の可視性メカニズムの変更に対応するため、既存のテストコードに対して一括して export キーワードを追加する作業が行われたことを示唆しています。この変更は、言語仕様の進化に伴う機械的な修正であり、個々のテストのロジック自体には影響を与えないため、「nothing interesting」と表現されています。

変更の背景

この変更の背景には、Go言語の初期の設計における識別子の可視性(エクスポート)に関する試行錯誤があります。Go言語は当初、C++やJavaのような明示的な publicexport キーワードを用いて、パッケージ外に公開する識別子を指定する方式を検討していました。しかし、最終的には、識別子の最初の文字を大文字にすることでエクスポートされるという、より簡潔で慣習的なルールに落ち着きました。

このコミットが行われた2009年1月は、Go言語が一般に公開される前の非常に初期の段階です。この時期には、まだ言語仕様が流動的であり、export キーワードが実際に使用されていた時期があったことを示しています。このコミットは、その export キーワードが導入された、あるいはその使用がテストコードに反映された時期のものです。後にこの export キーワードは廃止され、現在の「大文字で始まる識別子はエクスポートされる」というルールに移行しました。したがって、このコミットは、Go言語の可視性ルールの歴史的な変遷を示す貴重な証拠となります。

前提知識の解説

Go言語の識別子の可視性(エクスポート)

Go言語において、識別子(変数、関数、型など)がパッケージ外からアクセス可能であるか(エクスポートされているか)は、その識別子の最初の文字が大文字であるか小文字であるかによって決まります。

  • 大文字で始まる識別子: パッケージ外にエクスポートされ、他のパッケージからアクセス可能です。
  • 小文字で始まる識別子: パッケージ内に限定され、そのパッケージ内でのみアクセス可能です。

このシンプルで慣習的なルールは、Go言語の設計哲学である「簡潔さ」と「明示性」を反映しています。しかし、このコミットが示すように、Go言語の初期には export という明示的なキーワードが存在していました。

export キーワード (Go言語の初期)

Go言語の非常に初期のバージョンでは、現在の「大文字/小文字」ルールではなく、export というキーワードを識別子の宣言の前に付けることで、その識別子をパッケージ外に公開する仕組みが採用されていました。このコミットは、その export キーワードがテストコードに適用されたことを示しています。

例えば、現在のGo言語では type MyStruct struct {} と宣言すれば MyStruct はエクスポートされますが、当時のGo言語では export type MyStruct struct {} のように export キーワードが必要だったと考えられます。

技術的詳細

このコミットの技術的詳細は、Go言語のコンパイラが識別子の可視性をどのように解釈していたか、そしてその解釈がどのように変更されたかに関連します。

変更前は、識別子の可視性がデフォルトでパッケージ内部に限定されており、外部に公開するためには何らかの特別な指定(この場合は export キーワード)が必要でした。このコミットでは、その export キーワードが、型 (type), 関数 (func), 変数 (var), 定数 (const) の宣言に一貫して追加されています。

これは、Go言語のコンパイラが export キーワードを認識し、それに基づいてシンボルテーブルやリンケージ情報を生成していたことを意味します。この変更は、コンパイラが識別子の可視性を判断するロジックに影響を与え、その後の言語仕様の変更(export キーワードの廃止と大文字/小文字ルールへの移行)への布石となった可能性があります。

広範囲にわたるファイル変更は、当時のGo言語のコードベース全体で export キーワードの適用が必要であったことを示しており、これは言語仕様の変更が既存のコードに与える影響の大きさを物語っています。

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

このコミットは、src/lib/malloc.gotest/ ディレクトリ以下の多数のGoファイルに export キーワードを追加しています。以下にいくつかの代表的な変更箇所を挙げます。

src/lib/malloc.go の変更:

--- a/src/lib/malloc.go
+++ b/src/lib/malloc.go
@@ -9,8 +9,8 @@
  package malloc
  
  export type Stats struct {
 -	alloc	uint64;
 -	sys	uint64;
 +	Alloc	uint64;
 +	Sys	uint64;
  };
  
  export func Alloc(uint64) *byte;

ここでは、Stats 構造体のフィールド名が小文字から大文字に変更され、同時に export キーワードが追加されています。これは、フィールドもエクスポート対象となることを示唆しています。

test/235.go の変更:

--- a/test/235.go
+++ b/test/235.go
@@ -6,9 +6,9 @@
  
  package main
  
 -type T chan uint64;
 +export type T chan uint64;
  
 -func M(f uint64) (in, out T) {
 +export func M(f uint64) (in, out T) {
  	in = make(T, 100);
  	out = make(T, 100);
  	go func(in, out T, f uint64) {

ここでは、型 T と関数 M の宣言に export キーワードが追加されています。

test/chan/powser1.go の変更:

--- a/test/chan/powser1.go
+++ b/test/chan/powser1.go
@@ -41,7 +41,7 @@ var chnames string
  var chnameserial int
  var seqno int
  
 -func Init();
 +export func Init();
  
  func mkdch() *dch {
  	c := chnameserial % len(chnames);
@@ -176,11 +176,11 @@ func repeat(dat item, out *dch){
  	}
  }
  
 -type PS *dch;	// power series
 -type PS2 *[2] PS; // pair of power series
 +export type PS *dch;	// power series
 +export type PS2 *[2] PS; // pair of power series
  
 -var Ones PS
 -var Twos PS
 +export var Ones PS
 +export var Twos PS

ここでは、関数 Init、型 PSPS2、変数 OnesTwosexport キーワードが追加されています。

コアとなるコードの解説

上記の変更箇所は、Go言語の初期における export キーワードの適用範囲を示しています。

  • export type: 型定義をパッケージ外に公開します。これにより、他のパッケージからこの型を使用できるようになります。
  • export func: 関数をパッケージ外に公開します。これにより、他のパッケージからこの関数を呼び出せるようになります。
  • export var: 変数をパッケージ外に公開します。これにより、他のパッケージからこの変数にアクセスできるようになります。
  • export const: 定数をパッケージ外に公開します。これにより、他のパッケージからこの定数にアクセスできるようになります。

src/lib/malloc.goStats 構造体のフィールド名が小文字から大文字に変更されている点も注目に値します。これは、export キーワードの導入と同時に、フィールドの可視性についても現在のGo言語のルール(大文字で始まるフィールドはエクスポートされる)が適用され始めた可能性を示唆しています。

このコミットは、Go言語の可視性ルールが現在の形に落ち着くまでの過渡期における、重要なスナップショットと言えます。

関連リンク

  • Go言語の公式ドキュメント(現在の可視性ルールについて): https://go.dev/doc/effective_go#names
  • Go言語の歴史に関する情報源(export キーワードの変遷について言及がある可能性)

参考にした情報源リンク

  • Go言語の初期の設計に関する議論やメーリングリストのアーカイブ(例: golang-nutsメーリングリストの初期の投稿)
  • Go言語のソースコードリポジトリの初期のコミットログ
  • Go言語の歴史を解説している技術ブログや記事(例: "The Evolution of Go" など)

(注: 2009年当時の正確な情報源を見つけるのは困難な場合がありますが、Go言語の歴史に関する一般的な情報源から推測しています。)