[インデックス 13] ファイルの概要
このコミットは、Go言語の初期の仕様書である doc/go_lang.txt
における文法定義の誤りを修正するものです。具体的には、配列型 (ArrayType
) と関数の戻り値 (Result
) の文法記述が修正されています。
コミット
commit 5009237adbaccbaca89eed21f6cb69193b213fbc
Author: Robert Griesemer <gri@golang.org>
Date: Thu Mar 6 21:24:57 2008 -0800
- fixed a couple of grammar errors
SVN=111685
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/5009237adbaccbaca89eed21f6cb69193b213fbc
元コミット内容
- fixed a couple of grammar errors
変更の背景
このコミットは、Go言語の初期開発段階(2008年)に行われたもので、言語仕様のドキュメント (doc/go_lang.txt
) に含まれる文法定義の記述に誤りがあったため、それを修正することを目的としています。言語がまだ活発に設計・進化していた時期であり、仕様書の記述もそれに合わせて調整される必要がありました。特に、文法定義は言語の挙動を正確に記述する上で極めて重要であり、曖昧さや誤りがあると、コンパイラの実装や開発者の理解に混乱を招く可能性があります。
前提知識の解説
このコミットを理解するためには、以下の概念が役立ちます。
- Go言語の文法定義: Go言語の仕様書では、BNF (Backus-Naur Form) や EBNF (Extended Backus-Naur Form) に似た形式で言語の文法が定義されています。この形式では、
=
は定義、|
は選択、[ ]
はオプション(0回または1回)、{ }
は繰り返し(0回以上)を意味することが一般的です。 - 配列型 (ArrayType): Go言語における配列は、固定長で同じ型の要素のシーケンスです。例えば、
[5]int
は5つの整数を格納できる配列型です。 - スライス (Slice): Go言語のスライスは、配列への参照のようなもので、可変長です。
[]int
のように角括弧内に長さを指定しない形式で宣言されます。仕様書では「open array」と記述されることもあります。 - 関数の戻り値 (Result): Go言語の関数は、0個、1個、または複数の値を返すことができます。複数の値を返す場合は、それらを括弧
()
で囲んで型を記述します。
技術的詳細
このコミットでは、doc/go_lang.txt
内の2つの文法定義が修正されています。
-
ArrayType
の定義修正:- 修正前:
ArrayType = { '[' ArrayLength ']' } ElementType.
- この定義は、
{ ... }
が「0回以上の繰り返し」を意味するため、[ ]
のブロックが複数回出現することを許容していました。これは、[[5]]int
のような多次元配列の型定義を誤って示唆する可能性がありました。また、ElementType
の前に[ ]
ブロックが全くない場合も許容されるため、int
のような基本型が配列型として解釈される可能性も示唆していました。
- この定義は、
- 修正後:
ArrayType = '[' [ ArrayLength ] ']' ElementType .
{ ... }
が'[' [ ArrayLength ] ']'
に変更されました。これは、「[
の後にオプションのArrayLength
が続き、その後に]
が続く」という単一のブロックを意味します。これにより、配列型は必ず[]
または[Length]
の形式で始まることが明確になり、多次元配列の型定義や、基本型が配列型として誤解される可能性が排除されました。また、行末の.
が文法定義の一部として明示的に記述されています。
- 修正前:
-
Result
の定義修正:- 修正前:
Result = [ Type ] | '(' ParameterList ')' .
- この定義では、単一の戻り値の型が
[ Type ]
と記述されており、Type
がオプションであることを示していました。これは、戻り値の型を省略できるかのような誤解を招く可能性がありました。
- この定義では、単一の戻り値の型が
- 修正後:
Result = Type | '(' ParameterList ')' .
[ Type ]
がType
に変更されました。これにより、単一の戻り値を持つ関数は、その戻り値の型を必ず明示的に指定する必要があることが明確になりました。Go言語では、単一の戻り値の型を省略することはできません。複数の戻り値の場合は、これまで通り(' ParameterList ')'
の形式で記述されます。
- 修正前:
これらの修正は、Go言語の文法をより正確に、かつ曖昧さなく記述するための重要な変更であり、言語仕様の厳密性を高めることに貢献しています。
コアとなるコードの変更箇所
--- a/doc/go_lang.txt
+++ b/doc/go_lang.txt
@@ -532,9 +532,9 @@ Any array may be assigned to an open array variable with the
same element type. Typically, open arrays are used as
formal parameters for functions.
- ArrayType = { '[' ArrayLength ']' } ElementType.
- ArrayLength = Expression.
- ElementType = Type.
+ ArrayType = '[' [ ArrayLength ] ']' ElementType .
+ ArrayLength = Expression .
+ ElementType = Type .
[] uint8
[2*n] int
@@ -687,7 +687,7 @@ Functions can return multiple values simultaneously.
Parameters = '(' [ ParameterList ] ')' .
ParameterList = ParameterSection { ',' ParameterSection } .
ParameterSection = [ IdentifierList ] Type .
- Result = [ Type ] | '(' ParameterList ')' .
+ Result = Type | '(' ParameterList ')' .
// Function types
func ()
コアとなるコードの解説
上記の差分は、doc/go_lang.txt
ファイル内のGo言語の文法定義セクションに対する変更を示しています。
-
ArrayType
の変更:- ArrayType = { '[' ArrayLength ']' } ElementType.
- これは削除された行で、
{ ... }
構文が「0回以上の繰り返し」を意味するため、配列の次元指定[ArrayLength]
が複数回繰り返されるか、全く存在しないことを示唆していました。
- これは削除された行で、
+ ArrayType = '[' [ ArrayLength ] ']' ElementType .
- これは追加された行で、
'[' [ ArrayLength ] ']'
は「[
の後にオプションのArrayLength
が続き、その後に]
が続く」という単一のブロックを意味します。これにより、配列型は必ず[]
または[Length]
の形式で始まることが明確になります。また、各定義の行末に.
が追加され、文法定義の終端を明示しています。
- これは追加された行で、
-
Result
の変更:- Result = [ Type ] | '(' ParameterList ')' .
- これは削除された行で、
[ Type ]
が「Type
がオプション」であることを示していました。これは、単一の戻り値の型を省略できるかのような誤解を招く可能性がありました。
- これは削除された行で、
+ Result = Type | '(' ParameterList ')' .
- これは追加された行で、
Type
が「Type
が必須」であることを示しています。これにより、単一の戻り値を持つ関数は、その戻り値の型を必ず明示的に指定する必要があることが明確になります。
- これは追加された行で、
これらの変更は、Go言語の文法規則をより正確に、かつ曖昧さなく記述するためのものであり、言語仕様の厳密性を向上させています。
関連リンク
- Go言語の公式ウェブサイト: https://go.dev/
- Go言語の仕様書 (現在のバージョン): https://go.dev/ref/spec
参考にした情報源リンク
- Go言語のコミット履歴 (GitHub): https://github.com/golang/go/commits/master
- BNF (Backus-Naur Form) および EBNF (Extended Backus-Naur Form) に関する情報 (一般的なプログラミング言語の文法定義について):