[インデックス 1756] ファイルの概要
このコミットは、Go言語の仕様書 (doc/go_spec.html
) における QualifiedIdent
(修飾子付き識別子) の文法定義に対する変更です。具体的には、以前の定義に戻す(revert)ことで、よりシンプルで正確な文法表現に修正しています。
コミット
commit b813ee0e44cc10f75fe2bbfae991797a7e799f6e
Author: Robert Griesemer <gri@golang.org>
Date: Thu Mar 5 15:01:54 2009 -0800
revert QualifiedIdent to old production
R=r
DELTA=1 (0 added, 0 deleted, 1 changed)
OCL=25732
CL=25777
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/b813ee0e44cc10f75fe2bbfae991797a7e799f6e
元コミット内容
revert QualifiedIdent to old production
R=r
DELTA=1 (0 added, 0 deleted, 1 changed)
OCL=25732
CL=25777
変更の背景
このコミットは、Go言語の仕様書 (doc/go_spec.html
) 内の QualifiedIdent
(修飾子付き識別子) の文法定義を、以前の「より正しい」または「より意図された」形式に戻すことを目的としています。コミットメッセージの "revert QualifiedIdent to old production" が示すように、何らかの理由で QualifiedIdent
の文法定義が変更されたが、その変更が適切でなかったため、元の定義に戻すという判断がなされました。
Go言語では、他のパッケージで定義された識別子を参照する際に、パッケージ名.識別子
の形式を使用します。この パッケージ名.識別子
の部分が QualifiedIdent
に該当します。初期のGo言語開発段階では、文法定義が頻繁に調整されており、このコミットもその過程の一部と考えられます。特に、仕様書は言語の正確な振る舞いを定義するものであり、その文法定義は非常に重要です。誤った文法定義は、コンパイラの誤った実装や、開発者の誤解を招く可能性があります。
この変更は、Go言語の初期の仕様策定における試行錯誤の一端を示しており、文法定義の正確性と簡潔性を追求する過程で発生した修正であると推測されます。
前提知識の解説
Go言語のパッケージと識別子
Go言語では、コードは「パッケージ」という単位で整理されます。パッケージは関連する機能の集合であり、他のパッケージからその機能を利用できます。
- 識別子 (Identifier): 変数名、関数名、型名など、プログラム内で名前を付けるための文字列です。
- パッケージ名 (PackageName): パッケージを識別するための名前です。通常、ディレクトリ名と同じになります。
- ローカルパッケージ名 (LocalPackageName):
import . "package_path"
のように、パッケージをローカルな名前でインポートした場合に、そのローカル名がLocalPackageName
に該当します。ただし、Goの慣習として、このようなインポートは非推奨とされています。 - 修飾子付き識別子 (QualifiedIdent): 他のパッケージで定義された識別子を参照する際に使用される形式です。
パッケージ名.識別子
のように、パッケージ名をプレフィックスとして付けます。例えば、fmt.Println
のfmt.Println
がこれに該当します。fmt
はパッケージ名、Println
は識別子です。
文法定義 (Production)
プログラミング言語の文法は、通常、バッカス・ナウア記法 (BNF) やその拡張である拡張バッカス・ナウア記法 (EBNF) のような形式文法で定義されます。Go言語の仕様書もEBNFに似た記法で文法を記述しています。
=
: 定義|
: または (選択肢)[]
: オプション (0回または1回出現)()
: グループ化.
: 終端記号 (文の終わり)
このコミットで変更されているのは、Go言語の仕様書に記載されている QualifiedIdent
のEBNF形式の定義です。
技術的詳細
このコミットの核心は、Go言語の仕様書における QualifiedIdent
の文法定義の修正です。
変更前の定義:
QualifiedIdent = [ [ LocalPackageName "." ] PackageName "." ] identifier .
変更後の定義:
QualifiedIdent = [ ( LocalPackageName | PackageName ) "." ] identifier .
この変更は、QualifiedIdent
の構造をより正確かつ簡潔に表現しています。
変更前の定義の問題点(推測)
変更前の定義 [ [ LocalPackageName "." ] PackageName "." ] identifier .
は、以下のような解釈を可能にしてしまう可能性があります。
LocalPackageName "." PackageName "." identifier
PackageName "." identifier
identifier
(これはQualifiedIdent
ではないため、文法的に矛盾する)
特に [ LocalPackageName "." ] PackageName "."
の部分が問題です。これは「オプションの LocalPackageName.
の後に PackageName.
が続く」という構造を示唆しており、例えば local.pkg.identifier
のような二重の修飾を許容するかのような誤解を招く可能性があります。Go言語では、識別子の修飾は常に単一のパッケージ名(またはローカルパッケージ名)によって行われます。
変更後の定義の改善点
変更後の定義 [ ( LocalPackageName | PackageName ) "." ] identifier .
は、この問題を解決し、Go言語の実際のセマンティクスに合致しています。
( LocalPackageName | PackageName )
: これは「LocalPackageName
またはPackageName
のいずれか一方」を意味します。[ ... "." ]
: この全体がオプションであることを示します。つまり、修飾子付き識別子は、パッケージ名(またはローカルパッケージ名)とそれに続くドットが「あってもなくてもよい」ことを意味します。しかし、QualifiedIdent
の定義上、通常はパッケージ名が必須です。この[]
は、identifier
単独でもQualifiedIdent
の一部として扱われる可能性を示唆しているかもしれませんが、文脈的にはidentifier
はQualifiedIdent
ではないため、この[]
はQualifiedIdent
がパッケージ修飾を「持つ場合」と「持たない場合」を区別するためのものと解釈できます。しかし、Goの仕様ではQualifiedIdent
は常にパッケージ修飾を持つものとして扱われます。
より正確な解釈としては、この文法は「LocalPackageName
または PackageName
のいずれか一つがドットと共に存在し、その後に識別子が続く」という構造を表現しています。[]
は、この文法規則が identifier
単独のケースも含むことを示唆している可能性がありますが、Goの文脈では QualifiedIdent
は常にパッケージ修飾を伴います。
この変更により、Go言語のパーサーが QualifiedIdent
を解釈する際の曖昧さが解消され、仕様書がより正確に言語の文法を反映するようになりました。これは、コンパイラの実装者や言語の学習者にとって非常に重要な修正です。
コアとなるコードの変更箇所
変更は doc/go_spec.html
ファイルの1行のみです。
--- a/doc/go_spec.html
+++ b/doc/go_spec.html
@@ -1845,7 +1845,7 @@ A qualified identifier is an identifier qualified by a package name prefix.
</p>
<pre class="grammar">\
-QualifiedIdent = [ [ LocalPackageName "." ] PackageName "." ] identifier .\
+QualifiedIdent = [ ( LocalPackageName | PackageName ) "." ] identifier .\
LocalPackageName = identifier .\
PackageName = identifier .\
</pre>\
コアとなるコードの解説
変更された行は、Go言語の仕様書における QualifiedIdent
の文法定義です。
-
変更前:
QualifiedIdent = [ [ LocalPackageName "." ] PackageName "." ] identifier .
- この定義は、
LocalPackageName
とPackageName
の両方が修飾子として現れる可能性を示唆しているか、あるいはその組み合わせが複雑なオプション構造を持つかのように見えます。これはGo言語の実際のセマンティクスとは異なります。Goでは、識別子は単一のパッケージ名(またはローカルパッケージ名)によって修飾されます。
- この定義は、
-
変更後:
QualifiedIdent = [ ( LocalPackageName | PackageName ) "." ] identifier .
- この定義は、
LocalPackageName
またはPackageName
の「いずれか一方」が修飾子として使用され、その後にドットが続くことを明確に示しています。()
でグループ化されたLocalPackageName | PackageName
は、これら二つのうち一つが選択されることを意味します。そして、その全体が[]
でオプションとして囲まれています。 - この修正により、
QualifiedIdent
の文法がより簡潔になり、Go言語の実際の動作(package.identifier
の形式)と一致するようになりました。
- この定義は、
この変更は、Go言語の文法定義の正確性を高め、仕様書が言語の振る舞いをより明確に記述するための重要なステップです。
関連リンク
- The Go Programming Language Specification (現在のGo言語仕様)
- Go言語のパッケージについて (Go公式ドキュメントのパッケージに関する説明)
参考にした情報源リンク
- Go言語の公式ドキュメントおよび仕様書
- コミットメッセージと差分情報
- Go言語の文法に関する一般的な知識
[インデックス 1756] ファイルの概要
このコミットは、Go言語の仕様書 (doc/go_spec.html
) における QualifiedIdent
(修飾子付き識別子) の文法定義に対する変更です。具体的には、以前の定義に戻す(revert)ことで、よりシンプルで正確な文法表現に修正しています。
コミット
commit b813ee0e44cc10f75fe2bbfae991797a7e799f6e
Author: Robert Griesemer <gri@golang.org>
Date: Thu Mar 5 15:01:54 2009 -0800
revert QualifiedIdent to old production
R=r
DELTA=1 (0 added, 0 deleted, 1 changed)
OCL=25732
CL=25777
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/b813ee0e44cc10f75fe2bbfae991797a7e799f6e
元コミット内容
revert QualifiedIdent to old production
R=r
DELTA=1 (0 added, 0 deleted, 1 changed)
OCL=25732
CL=25777
変更の背景
このコミットは、Go言語の仕様書 (doc/go_spec.html
) 内の QualifiedIdent
(修飾子付き識別子) の文法定義を、以前の「より正しい」または「より意図された」形式に戻すことを目的としています。コミットメッセージの "revert QualifiedIdent to old production" が示すように、何らかの理由で QualifiedIdent
の文法定義が変更されたが、その変更が適切でなかったため、元の定義に戻すという判断がなされました。
Go言語では、他のパッケージで定義された識別子を参照する際に、パッケージ名.識別子
の形式を使用します。この パッケージ名.識別子
の部分が QualifiedIdent
に該当します。初期のGo言語開発段階では、文法定義が頻繁に調整されており、このコミットもその過程の一部と考えられます。特に、仕様書は言語の正確な振る舞いを定義するものであり、その文法定義は非常に重要です。誤った文法定義は、コンパイラの誤った実装や、開発者の誤解を招く可能性があります。
この変更は、Go言語の初期の仕様策定における試行錯誤の一端を示しており、文法定義の正確性と簡潔性を追求する過程で発生した修正であると推測されます。
前提知識の解説
Go言語のパッケージと識別子
Go言語では、コードは「パッケージ」という単位で整理されます。パッケージは関連する機能の集合であり、他のパッケージからその機能を利用できます。
- 識別子 (Identifier): 変数名、関数名、型名など、プログラム内で名前を付けるための文字列です。
- パッケージ名 (PackageName): パッケージを識別するための名前です。通常、ディレクトリ名と同じになります。
- ローカルパッケージ名 (LocalPackageName):
import . "package_path"
のように、パッケージをローカルな名前でインポートした場合に、そのローカル名がLocalPackageName
に該当します。ただし、Goの慣習として、このようなインポートは非推奨とされています。 - 修飾子付き識別子 (QualifiedIdent): 他のパッケージで定義された識別子を参照する際に使用される形式です。
パッケージ名.識別子
のように、パッケージ名をプレフィックスとして付けます。例えば、fmt.Println
のfmt.Println
がこれに該当します。fmt
はパッケージ名、Println
は識別子です。
文法定義 (Production)
プログラミング言語の文法は、通常、バッカス・ナウア記法 (BNF) やその拡張である拡張バッカス・ナウア記法 (EBNF) のような形式文法で定義されます。Go言語の仕様書もEBNFに似た記法で文法を記述しています。
=
: 定義|
: または (選択肢)[]
: オプション (0回または1回出現)()
: グループ化.
: 終端記号 (文の終わり)
このコミットで変更されているのは、Go言語の仕様書に記載されている QualifiedIdent
のEBNF形式の定義です。
技術的詳細
このコミットの核心は、Go言語の仕様書における QualifiedIdent
の文法定義の修正です。
変更前の定義:
QualifiedIdent = [ [ LocalPackageName "." ] PackageName "." ] identifier .
変更後の定義:
QualifiedIdent = [ ( LocalPackageName | PackageName ) "." ] identifier .
この変更は、QualifiedIdent
の構造をより正確かつ簡潔に表現しています。
変更前の定義の問題点(推測)
変更前の定義 [ [ LocalPackageName "." ] PackageName "." ] identifier .
は、以下のような解釈を可能にしてしまう可能性があります。
LocalPackageName "." PackageName "." identifier
PackageName "." identifier
identifier
(これはQualifiedIdent
ではないため、文法的に矛盾する)
特に [ LocalPackageName "." ] PackageName "."
の部分が問題です。これは「オプションの LocalPackageName.
の後に PackageName.
が続く」という構造を示唆しており、例えば local.pkg.identifier
のような二重の修飾を許容するかのような誤解を招く可能性があります。Go言語では、識別子の修飾は常に単一のパッケージ名(またはローカルパッケージ名)によって行われます。
変更後の定義の改善点
変更後の定義 [ ( LocalPackageName | PackageName ) "." ] identifier .
は、この問題を解決し、Go言語の実際のセマンティクスに合致しています。
( LocalPackageName | PackageName )
: これは「LocalPackageName
またはPackageName
のいずれか一方」を意味します。[ ... "." ]
: この全体がオプションであることを示します。つまり、修飾子付き識別子は、パッケージ名(またはローカルパッケージ名)とそれに続くドットが「あってもなくてもよい」ことを意味します。しかし、QualifiedIdent
の定義上、通常はパッケージ名が必須です。この[]
は、identifier
単独でもQualifiedIdent
の一部として扱われる可能性を示唆しているかもしれませんが、文脈的にはidentifier
はQualifiedIdent
ではないため、この[]
はQualifiedIdent
がパッケージ修飾を「持つ場合」と「持たない場合」を区別するためのものと解釈できます。しかし、Goの仕様ではQualifiedIdent
は常にパッケージ修飾を持つものとして扱われます。
より正確な解釈としては、この文法は「LocalPackageName
または PackageName
のいずれか一つがドットと共に存在し、その後に識別子が続く」という構造を表現しています。[]
は、この文法規則が identifier
単独のケースも含むことを示唆している可能性がありますが、Goの文脈では QualifiedIdent
は常にパッケージ修飾を伴います。
この変更により、Go言語のパーサーが QualifiedIdent
を解釈する際の曖昧さが解消され、仕様書がより正確に言語の文法を反映するようになりました。これは、コンパイラの実装者や言語の学習者にとって非常に重要な修正です。
コアとなるコードの変更箇所
変更は doc/go_spec.html
ファイルの1行のみです。
--- a/doc/go_spec.html
+++ b/doc/go_spec.html
@@ -1845,7 +1845,7 @@ A qualified identifier is an identifier qualified by a package name prefix.
</p>
<pre class="grammar">\
-QualifiedIdent = [ [ LocalPackageName "." ] PackageName "." ] identifier .\
+QualifiedIdent = [ ( LocalPackageName | PackageName ) "." ] identifier .\
LocalPackageName = identifier .\
PackageName = identifier .\
</pre>\
コアとなるコードの解説
変更された行は、Go言語の仕様書における QualifiedIdent
の文法定義です。
-
変更前:
QualifiedIdent = [ [ LocalPackageName "." ] PackageName "." ] identifier .
- この定義は、
LocalPackageName
とPackageName
の両方が修飾子として現れる可能性を示唆しているか、あるいはその組み合わせが複雑なオプション構造を持つかのように見えます。これはGo言語の実際のセマンティクスとは異なります。Goでは、識別子は単一のパッケージ名(またはローカルパッケージ名)によって修飾されます。
- この定義は、
-
変更後:
QualifiedIdent = [ ( LocalPackageName | PackageName ) "." ] identifier .
- この定義は、
LocalPackageName
またはPackageName
の「いずれか一方」が修飾子として使用され、その後にドットが続くことを明確に示しています。()
でグループ化されたLocalPackageName | PackageName
は、これら二つのうち一つが選択されることを意味します。そして、その全体が[]
でオプションとして囲まれています。 - この修正により、
QualifiedIdent
の文法がより簡潔になり、Go言語の実際の動作(package.identifier
の形式)と一致するようになりました。
- この定義は、
この変更は、Go言語の文法定義の正確性を高め、仕様書が言語の振る舞いをより明確に記述するための重要なステップです。
関連リンク
- The Go Programming Language Specification (現在のGo言語仕様)
- Go言語のパッケージについて (Go公式ドキュメントのパッケージに関する説明)
参考にした情報源リンク
- Go言語の公式ドキュメントおよび仕様書
- コミットメッセージと差分情報
- Go言語の文法に関する一般的な知識