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

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

このコミットは、Go言語のコンパイラにおけるインターフェース型のメソッド宣言に関する挙動の修正を反映したものです。具体的には、一つの型に対して複数のメソッド名をまとめて宣言する構文(例: g,f ()int;)が、コンパイラによって正しく許可されるべきであり、実際に許可されるようになったことを示しています。この変更に伴い、以前はこの構文を「バグ」として扱っていたテストケース test/bugs/bug032.go が削除されました。

コミット

  • Author: Ian Lance Taylor iant@golang.org
  • Date: Fri Nov 14 17:28:17 2008 -0800

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

https://github.com/golang/go/commit/7dee51f491af1f4aa115ba244306ffa81f4aa115ba244306ffa815ffa7f1

元コミット内容

The compilers should and do permit interface types to list
multiple method names with a single type.

R=r,gri
DELTA=10  (0 added, 10 deleted, 0 changed)
OCL=19292
CL=19298

変更の背景

Go言語の初期開発段階において、インターフェース型内で複数のメソッド名をカンマ区切りでまとめて宣言する構文(例: type I interface { g,f ()int; })の扱いについて、コンパイラの挙動に不整合がありました。この構文は、言語設計の意図としては許可されるべきものでしたが、当時のコンパイラはこれをエラーとして扱ったり、あるいは誤ってコンパイルを成功させてしまったりする可能性がありました。

test/bugs/bug032.go というテストファイルは、このコンパイラの不正確な挙動を捕捉するために作成されたものでした。このテストは、g,f ()int; という宣言が「バグ」であり、コンパイルが成功すべきではない、という前提で書かれていました。しかし、言語の設計意図が明確になり、この構文が正当なものであると判断されたため、コンパイラがこの構文を正しく処理するように修正されました。

このコミットは、コンパイラの修正が完了し、g,f ()int; のような宣言が正しく許可されるようになったことを受けて、もはや「バグ」ではなくなった bug032.go テストケースとその関連する golden.out のエントリを削除するために行われました。これにより、テストスイートが最新の言語仕様とコンパイラの挙動に合致するようになりました。

前提知識の解説

Go言語のインターフェース

Go言語におけるインターフェースは、メソッドのシグネチャの集合を定義する型です。インターフェース型は、そのインターフェースが定義するすべてのメソッドを実装する任意の具象型によって満たされます。Goのインターフェースは「暗黙的」であり、特定のインターフェースを実装するために implements キーワードなどを用いる必要はありません。

例:

type Reader interface {
    Read(p []byte) (n int, err error)
}

type Writer interface {
    Write(p []byte) (n int, err error)
}

メソッドシグネチャ

メソッドシグネチャは、メソッドの名前、引数の型、および戻り値の型を定義します。Goのインターフェースでは、各メソッドは一意の名前とシグネチャを持ちます。

例:

type MyInterface interface {
    MethodA(x int) string
    MethodB() error
}

複数のメソッド名と単一の型

Go言語のインターフェース定義では、複数のメソッドが同じシグネチャを持つ場合、それらをカンマ区切りでまとめて宣言することができます。これはコードの簡潔さを目的としたシンタックスシュガーです。

例:

type MyInterface interface {
    Read, Write(p []byte) (n int, err error) // ReadとWriteが同じシグネチャを持つ
}

この宣言は、以下の宣言と等価です。

type MyInterface interface {
    Read(p []byte) (n int, err error)
    Write(p []byte) (n int, err error)
}

このコミットの時点では、この「複数のメソッド名を単一の型でリストする」構文がコンパイラによって正しく解釈されるかどうかが問題となっていました。

技術的詳細

このコミットが修正した問題は、Goコンパイラの字句解析器(lexer)や構文解析器(parser)が、インターフェース型定義における複数のメソッド名宣言をどのように扱うかという点にありました。

test/bugs/bug032.go の内容を見ると、問題の構文は g,f ()int; でした。

type I interface {
	g,f	()int;  // BUG only one method name allowed per signature
}

このテストファイルは、この構文が「単一のシグネチャにつき一つのメソッド名のみが許可される」という当時の(誤った)前提に基づいて書かれていました。そのため、このテストはコンパイルが成功すると「バグ」であると報告するように設定されていました(echo BUG: compilation succeeds incorrectly)。

しかし、Go言語の設計思想では、同じシグネチャを持つ複数のメソッド名をカンマ区切りで宣言することは許容されるべき構文でした。このコミットは、コンパイラがこの設計意図に沿って動作するように修正されたことを示しています。つまり、g,f ()int; という記述は、g() intf() int という2つのメソッドを定義する有効な構文として認識されるようになったのです。

この修正により、bug032.go はもはや「バグ」をテストするものではなくなり、むしろ正しい構文を誤ってエラーと見なすテストになってしまいました。そのため、このテストケースは削除されることになりました。

コンパイラ内部では、インターフェースのメソッドリストを処理する際に、各メソッド名とそれに対応するシグネチャを正しく関連付けるロジックが調整されたと考えられます。これにより、カンマ区切りのリストが適切に複数のメソッド定義として展開され、型チェックやコード生成の段階で問題なく扱われるようになりました。

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

このコミットでは、以下の2つのファイルが削除されています。

  1. test/bugs/bug032.go

    • このファイルは、インターフェース型で複数のメソッド名をカンマ区切りで宣言する構文 g,f ()int; がコンパイラによって誤って処理されることをテストするためのものでした。コンパイラの修正により、この構文が正しく許可されるようになったため、テストケース自体が不要となり削除されました。
  2. test/golden.out

    • このファイルは、Goのテストスイートにおける期待される出力(ゴールデンファイル)を記録するものです。bug032.go のテスト結果に関するエントリが含まれていましたが、bug032.go の削除に伴い、そのエントリも削除されました。

変更の差分は以下の通りです。

--- a/test/bugs/bug032.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// $G $D/$F.go && echo BUG: compilation succeeds incorrectly
-
-package main
-
-type I interface {
-//	g,f	()int;  // BUG only one method name allowed per signature
-}
diff --git a/test/golden.out b/test/golden.out
index cedf02964a..3d7795022b 100644
--- a/test/golden.out
+++ b/test/golden.out
@@ -85,9 +85,6 @@ PASS
 bugs/bug020.go:7: type of a structure field cannot be an open array
 BUG should compile
 
-=========== bugs/bug032.go
-BUG: compilation succeeds incorrectly
-
 =========== bugs/bug041.go
 BUG: compilation succeeds incorrectly

コアとなるコードの解説

このコミット自体は、Goコンパイラのソースコードに対する直接的な変更(追加や修正)を含んでいません。その代わりに、コンパイラの修正が完了したことを受けて、関連するテストケースを削除するという「クリーンアップ」の性質を持っています。

test/bugs/bug032.go は、Go言語のテストフレームワークの一部であり、特定のバグを再現し、その修正を検証するために使用されていました。このファイルが削除されたことは、以下のことを意味します。

  1. バグの修正完了: bug032.go が対象としていたコンパイラのバグ(インターフェース型での複数メソッド名宣言の誤った処理)が、このコミット以前に修正されたことを示します。
  2. 言語仕様への準拠: Go言語の設計意図として、インターフェース内で同じシグネチャを持つ複数のメソッド名をカンマ区切りで宣言することが許可されるべきであったため、コンパイラがその仕様に準拠するようになったことを意味します。
  3. テストスイートの健全性: 修正されたバグをテストする古いテストケースは、もはや必要ありません。むしろ、正しい構文をエラーと見なすようなテストが残っていると、テストスイートの健全性を損ない、誤解を招く可能性があります。そのため、削除は適切な対応です。

test/golden.out からの関連エントリの削除も同様に、このテストケースがもはや存在しないため、そのテスト結果の記録も不要になったことを示しています。

このコミットは、Go言語の進化の初期段階において、言語仕様の細部が固まり、それに合わせてコンパイラとテストスイートが調整されていった過程の一端を示しています。

関連リンク

参考にした情報源リンク

  • Go言語のコミット履歴 (GitHub): https://github.com/golang/go/commits/master
  • Go言語の初期のバグトラッカーやメーリングリストの議論(公開されている場合)
    • 今回のコミットメッセージに含まれる OCLCL 番号は、Goの内部的な変更リスト(Change List)システムに関連するもので、当時の議論や詳細な背景情報がそこに記録されている可能性がありますが、一般には公開されていません。
  • Go言語のインターフェースに関する一般的な情報源。
  • Go言語のコンパイラ設計に関する情報源。
  • test/bugs/bug032.go の内容から読み取れる情報。
  • test/golden.out の役割に関する一般的な知識。
  • Go言語のテストの慣習に関する一般的な知識。
  • Go言語の初期のコミットメッセージのパターン。
  • Go言語のインターフェースの複数メソッド宣言に関する現在の仕様。
    • 現在のGo言語の仕様では、インターフェース型における複数メソッド名のカンマ区切り宣言は標準的な構文として記述されています。

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

このコミットは、Go言語のコンパイラにおけるインターフェース型のメソッド宣言に関する挙動の修正を反映したものです。具体的には、一つの型に対して複数のメソッド名をまとめて宣言する構文(例: g,f ()int;)が、コンパイラによって正しく許可されるべきであり、実際に許可されるようになったことを示しています。この変更に伴い、以前はこの構文を「バグ」として扱っていたテストケース test/bugs/bug032.go が削除されました。

コミット

  • Author: Ian Lance Taylor iant@golang.org
  • Date: Fri Nov 14 17:28:17 2008 -0800

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

https://github.com/golang/go/commit/7dee51f491af1f4aa115ba244306ffa815ffa7f1

元コミット内容

The compilers should and do permit interface types to list
multiple method names with a single type.

R=r,gri
DELTA=10  (0 added, 10 deleted, 0 changed)
OCL=19292
CL=19298

変更の背景

Go言語の初期開発段階において、インターフェース型内で複数のメソッド名をカンマ区切りでまとめて宣言する構文(例: type I interface { g,f ()int; })の扱いについて、コンパイラの挙動に不整合がありました。この構文は、言語設計の意図としては許可されるべきものでしたが、当時のコンパイラはこれをエラーとして扱ったり、あるいは誤ってコンパイルを成功させてしまったりする可能性がありました。

test/bugs/bug032.go というテストファイルは、このコンパイラの不正確な挙動を捕捉するために作成されたものでした。このテストは、g,f ()int; という宣言が「バグ」であり、コンパイルが成功すべきではない、という前提で書かれていました。そのため、テストファイル内には // BUG only one method name allowed per signature というコメントと、コンパイルが成功した場合に「BUG: compilation succeeds incorrectly」と出力するシェルコマンドが含まれていました。

しかし、Go言語の設計意図が明確になり、この構文が正当なものであると判断されたため、コンパイラがこの構文を正しく処理するように修正されました。つまり、g,f ()int;g() intf() int という二つの異なるメソッドを簡潔に定義するための有効なシンタックスシュガーとして認識されるようになったのです。

このコミットは、コンパイラの修正が完了し、g,f ()int; のような宣言が正しく許可されるようになったことを受けて、もはや「バグ」ではなくなった bug032.go テストケースとその関連する golden.out のエントリを削除するために行われました。これにより、テストスイートが最新の言語仕様とコンパイラの挙動に合致するようになりました。

前提知識の解説

Go言語のインターフェース

Go言語におけるインターフェースは、メソッドのシグネチャの集合を定義する型です。インターフェース型は、そのインターフェースが定義するすべてのメソッドを実装する任意の具象型によって満たされます。Goのインターフェースは「暗黙的」であり、特定のインターフェースを実装するために implements キーワードなどを用いる必要はありません。

例:

type Reader interface {
    Read(p []byte) (n int, err error)
}

メソッドシグネチャ

メソッドシグネチャは、メソッドの名前、引数の型、および戻り値の型を定義します。Goのインターフェースでは、各メソッドは一意の名前とシグネチャを持ちます。Go言語では、メソッドのオーバーロード(同じ名前で異なるシグネチャを持つメソッド)はサポートされていません。

例:

type MyInterface interface {
    MethodA(x int) string
    MethodB() error
}

複数のメソッド名と単一のシグネチャ定義

Go言語のインターフェース定義において、複数のメソッドが同じシグネチャを持つ場合、それらをカンマ区切りでまとめて宣言することができます。これはコードの簡潔さを目的としたシンタックスシュガーであり、それぞれのメソッド名が独立したメソッドとして扱われます。

例:

type MyInterface interface {
    Read, Write(p []byte) (n int, err error) // ReadとWriteが同じシグネチャを持つ
}

この宣言は、以下の宣言と完全に等価です。

type MyInterface interface {
    Read(p []byte) (n int, err error)
    Write(p []byte) (n int, err error)
}

このコミットの時点では、この「複数のメソッド名を単一のシグネチャ定義でリストする」構文がコンパイラによって正しく解釈されるかどうかが問題となっていました。この構文は、メソッドのオーバーロードとは異なり、あくまで異なる名前のメソッドが同じ型定義を共有する際の簡略記法です。

技術的詳細

このコミットが修正した問題は、Goコンパイラの字句解析器(lexer)や構文解析器(parser)が、インターフェース型定義における複数のメソッド名宣言をどのように扱うかという点にありました。

test/bugs/bug032.go の内容を見ると、問題の構文は g,f ()int; でした。

// test/bugs/bug032.go の一部
type I interface {
	g,f	()int;  // BUG only one method name allowed per signature
}

このテストファイルは、この構文が「単一のシグネチャにつき一つのメソッド名のみが許可される」という当時の(誤った)前提に基づいて書かれていました。そのため、このテストはコンパイルが成功すると「バグ」であると報告するように設定されていました($G $D/$F.go && echo BUG: compilation succeeds incorrectly)。

しかし、Go言語の設計思想では、同じシグネチャを持つ複数のメソッド名をカンマ区切りで宣言することは許容されるべき構文でした。このコミットは、コンパイラがこの設計意図に沿って動作するように修正されたことを示しています。つまり、g,f ()int; という記述は、g() intf() int という2つの異なるメソッドを定義する有効な構文として認識されるようになったのです。コンパイラは、このカンマ区切りのリストを内部的に個別のメソッド定義に展開し、それぞれが指定されたシグネチャを持つものとして処理するようになりました。

この修正により、bug032.go はもはや「バグ」をテストするものではなくなり、むしろ正しい構文を誤ってエラーと見なすテストになってしまいました。そのため、このテストケースは削除されることになりました。

コンパイラ内部では、インターフェースのメソッドリストを処理する際に、各メソッド名とそれに対応するシグネチャを正しく関連付けるロジックが調整されたと考えられます。これにより、カンマ区切りのリストが適切に複数のメソッド定義として展開され、型チェックやコード生成の段階で問題なく扱われるようになりました。これは、コンパイラのフロントエンド(特にパーサー)における構文解析規則の厳密化と、それに続くセマンティック解析の正確性の向上を意味します。

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

このコミットでは、以下の2つのファイルが削除されています。

  1. /home/orange/Project/comemo/test/bugs/bug032.go

    • このファイルは、インターフェース型で複数のメソッド名をカンマ区切りで宣言する構文 g,f ()int; がコンパイラによって誤って処理されることをテストするためのものでした。コンパイラの修正により、この構文が正しく許可されるようになったため、テストケース自体が不要となり削除されました。
  2. /home/orange/Project/comemo/test/golden.out

    • このファイルは、Goのテストスイートにおける期待される出力(ゴールデンファイル)を記録するものです。bug032.go のテスト結果に関するエントリが含まれていましたが、bug032.go の削除に伴い、そのエントリも削除されました。

変更の差分は以下の通りです。

--- a/test/bugs/bug032.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// $G $D/$F.go && echo BUG: compilation succeeds incorrectly
-
-package main
-
-type I interface {
-//	g,f	()int;  // BUG only one method name allowed per signature
-}
diff --git a/test/golden.out b/test/golden.out
index cedf02964a..3d7795022b 100644
--- a/test/golden.out
+++ b/test/golden.out
@@ -85,9 +85,6 @@ PASS
 bugs/bug020.go:7: type of a structure field cannot be an open array
 BUG should compile
 
-=========== bugs/bug032.go
-BUG: compilation succeeds incorrectly
-
 =========== bugs/bug041.go
 BUG: compilation succeeds incorrectly

コアとなるコードの解説

このコミット自体は、Goコンパイラのソースコードに対する直接的な変更(追加や修正)を含んでいません。その代わりに、コンパイラの修正が完了したことを受けて、関連するテストケースを削除するという「クリーンアップ」の性質を持っています。

/home/orange/Project/comemo/test/bugs/bug032.go は、Go言語のテストフレームワークの一部であり、特定のバグを再現し、その修正を検証するために使用されていました。このファイルが削除されたことは、以下のことを意味します。

  1. バグの修正完了: bug032.go が対象としていたコンパイラのバグ(インターフェース型での複数メソッド名宣言の誤った処理)が、このコミット以前に修正されたことを示します。これは、Goコンパイラの開発チームが、この構文が言語仕様として有効であると判断し、それに対応するコンパイラのロジックを実装したことを意味します。
  2. 言語仕様への準拠: Go言語の設計意図として、インターフェース内で同じシグネチャを持つ複数のメソッド名をカンマ区切りで宣言することが許可されるべきであったため、コンパイラがその仕様に準拠するようになったことを意味します。これにより、Go言語の構文がより柔軟になり、開発者は簡潔なコードを書くことができるようになりました。
  3. テストスイートの健全性: 修正されたバグをテストする古いテストケースは、もはや必要ありません。むしろ、正しい構文をエラーと見なすようなテストが残っていると、テストスイートの健全性を損ない、誤解を招く可能性があります。そのため、削除は適切な対応です。テストスイートは、現在の言語仕様とコンパイラの挙動を正確に反映している必要があります。

/home/orange/Project/comemo/test/golden.out からの関連エントリの削除も同様に、このテストケースがもはや存在しないため、そのテスト結果の記録も不要になったことを示しています。golden.out ファイルは、テストの出力が期待通りであることを検証するために使用されるため、テストケースが削除されれば、そのテストケースに関連する期待される出力も削除されるのが自然な流れです。

このコミットは、Go言語の進化の初期段階において、言語仕様の細部が固まり、それに合わせてコンパイラとテストスイートが調整されていった過程の一端を示しています。これは、言語設計と実装が密接に連携し、バグの修正を通じて言語の安定性と正確性が向上していく典型的な例と言えます。

関連リンク

  • Go言語の公式ドキュメント: https://go.dev/doc/
  • Go言語の仕様: https://go.dev/ref/spec
    • 特に「Interface types」のセクションが関連します。現在の仕様では、インターフェース型における複数メソッド名のカンマ区切り宣言は標準的な構文として記述されています。

参考にした情報源リンク

  • Go言語のコミット履歴 (GitHub): https://github.com/golang/go/commits/master
  • コミットメッセージに含まれる OCLCL 番号は、Goの内部的な変更リスト(Change List)システムに関連するもので、当時の議論や詳細な背景情報がそこに記録されている可能性がありますが、一般には公開されていません。
  • test/bugs/bug032.go の内容から読み取れる情報。
  • test/golden.out の役割に関する一般的な知識。
  • Go言語のテストの慣習に関する一般的な知識。
  • Go言語の初期のコミットメッセージのパターン。
  • Go言語のインターフェースの複数メソッド宣言に関する現在の仕様。
  • Go言語におけるメソッドのオーバーロードに関する一般的な知識(Goはメソッドのオーバーロードをサポートしない)。