[インデックス 1540] ファイルの概要
コミット
このコミットは、Go言語の仕様書 (doc/go_spec.txt
) における文法定義の記述を、より簡潔かつ一貫性のある形に整形するコスメティックな変更です。具体的には、CommClause
(通信句) と SwitchClause
(スイッチ句) のプロダクション(生成規則)の順序を入れ替えることで、定義をわずかに簡素化しています。
- コミットハッシュ:
ae299f0d6997329183e1709c28aeadb1c814b092
- 作者: Robert Griesemer gri@golang.org
- コミット日時: 2009年1月22日 木曜日 15:16:48 -0800
- 変更ファイル数: 1 (doc/go_spec.txt)
- 変更行数: 5行の追加、5行の削除 (実質的な変更は5行)
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/ae299f0d6997329183e1709c28aeadb1c814b092
元コミット内容
cosmetic change only:
- slightly simplified a couple of productions (CommClause, SwitchClause)
by reordering
R=r
DELTA=5 (0 added, 0 deleted, 5 changed)
OCL=23304
CL=23323
変更の背景
この変更は、Go言語の仕様書における文法定義の記述を改善することを目的としています。コミットメッセージにある通り、「コスメティックな変更」であり、言語の動作やセマンティクスに影響を与えるものではありません。文法規則の定義をより読みやすく、理解しやすく、そして一貫性のある形式にすることで、仕様書の品質向上を図っています。特に、:
(コロン) の位置を調整し、CaseClause
とCommClause
の定義内でSwitchCase
とCommCase
を参照する形にすることで、文法構造の表現がより自然になっています。
前提知識の解説
Go言語仕様書
Go言語の仕様書は、Go言語の構文、セマンティクス、標準ライブラリの動作などを厳密に定義した公式ドキュメントです。プログラマーがGo言語の動作を正確に理解し、コンパイラやツールが言語仕様に準拠していることを確認するための基準となります。この仕様書は、BNF (Backus–Naur Form) や EBNF (Extended Backus–Naur Form) に似た形式で言語の文法規則を記述しています。
文法定義(プロダクション)
プログラミング言語の文法は、通常、生成規則(プロダクション)の集合として定義されます。各プロダクションは、非終端記号(構文の抽象的な要素、例: Expression
, Statement
)がどのように終端記号(実際のコードに現れるキーワード、識別子、演算子など)や他の非終端記号の組み合わせで構成されるかを示します。
例: A = B C | D
は、「AはBの後にCが続くか、またはDである」という意味です。
SwitchStat
(スイッチ文)
Go言語の switch
文は、複数の条件分岐を簡潔に記述するための制御構造です。式スイッチと型スイッチの2種類があります。
SwitchStat = "switch" [ [ Simplestat ] ";" ] [ Expression ] "{" { CaseClause } "}" .
SwitchStat
はswitch
キーワードで始まり、オプションで簡単なステートメントと式が続き、{}
の中に複数のCaseClause
を含みます。
SelectStat
(セレクト文)
Go言語の select
文は、複数のチャネル操作(送受信)を同時に待機し、最初に準備ができた操作を実行するための制御構造です。並行処理において非常に重要です。
SelectStat = "select" "{" { CommClause } "}" .
SelectStat
はselect
キーワードで始まり、{}
の中に複数のCommClause
を含みます。
CaseClause
と CommClause
CaseClause
:switch
文の各case
ブロックを定義する文法要素です。CommClause
:select
文の各case
ブロック(チャネル通信操作)を定義する文法要素です。
技術的詳細
このコミットの技術的な変更は、Go言語仕様書内の2つの文法プロダクション、CaseClause
と CommClause
の定義方法を再構築することにあります。
SwitchStat
の変更詳細
変更前:
CaseClause = Case [ StatementList ] .
Case = ( "case" ExpressionList | "default" ) ":" .
この定義では、CaseClause
は Case
とオプションの StatementList
から構成され、Case
自体が case
キーワードと式リスト、または default
キーワードの後に :
(コロン) が続く形でした。
変更後:
CaseClause = SwitchCase ":" [ StatementList ] .
SwitchCase = "case" ExpressionList | "default" .
変更後では、Case
が SwitchCase
にリネームされ、その定義から :
(コロン) が削除されました。代わりに、CaseClause
の定義に :
が直接含まれるようになりました。これにより、CaseClause
は SwitchCase
の後に必ず :
が続き、その後にオプションの StatementList
が続くという、より直感的な構造になりました。これは、case
や default
の後にコロンが続くという実際のGoの構文を、文法定義により直接的に反映しています。
SelectStat
の変更詳細
変更前:
CommClause = CommCase [ StatementList ] .
CommCase = ( "default" | ( "case" ( SendExpr | RecvExpr) ) ) ":" .
この定義では、CommClause
は CommCase
とオプションの StatementList
から構成され、CommCase
自体が default
または case
キーワードとチャネル操作(SendExpr
または RecvExpr
)の後に :
(コロン) が続く形でした。
変更後:
CommClause = CommCase ":" [ StatementList ] .
CommCase = "case" ( SendExpr | RecvExpr) | "default" .
変更後では、CommCase
の定義から :
(コロン) が削除され、CommClause
の定義に直接含まれるようになりました。また、CommCase
内の case
と default
の順序が入れ替わっていますが、これは意味的な違いはありません。この変更も SwitchStat
の場合と同様に、実際のGoの構文(チャネル操作の後にコロンが続く)を文法定義により直接的に反映し、一貫性を高めるためのものです。
これらの変更は、文法規則の記述スタイルを統一し、読みやすさを向上させるためのものです。言語のパーサーの実装には影響を与えませんが、仕様書を読む人間にとっては理解が深まります。
コアとなるコードの変更箇所
変更は doc/go_spec.txt
ファイル内で行われました。
--- a/doc/go_spec.txt
+++ b/doc/go_spec.txt
@@ -3,7 +3,7 @@ The Go Programming Language Specification (DRAFT)
Robert Griesemer, Rob Pike, Ken Thompson
-(January 16, 2009)
+(January 22, 2009)
----
@@ -2638,8 +2638,8 @@ Switch statements
Switches provide multi-way execution.
SwitchStat = "switch" [ [ Simplestat ] ";" ] [ Expression ] "{" { CaseClause } "}" .
- CaseClause = Case [ StatementList ] .
- Case = ( "case" ExpressionList | "default" ) ":" .
+ CaseClause = SwitchCase ":" [ StatementList ] .
+ SwitchCase = "case" ExpressionList | "default" .
There can be at most one default case in a switch statement. In a case clause,
the last statement only may be a fallthrough statement ($Fallthrough statement).
@@ -2810,8 +2810,8 @@ will proceed. It looks similar to a switch statement but with the
cases all referring to communication operations.
SelectStat = "select" "{" { CommClause } "}" .
- CommClause = CommCase [ StatementList ] .
- CommCase = ( "default" | ( "case" ( SendExpr | RecvExpr) ) ) ":" .
+ CommClause = CommCase ":" [ StatementList ] .
+ CommCase = "case" ( SendExpr | RecvExpr) | "default" .
SendExpr = Expression "<-" Expression .
RecvExpr = [ Expression ( "=" | ":=" ) ] "<-" Expression .
コアとなるコードの解説
上記の差分は、Go言語仕様書における SwitchStat
と SelectStat
の文法定義の変更を示しています。
-
日付の更新:
-(January 16, 2009) +(January 22, 2009)
これは、仕様書のドラフト版の日付がコミット日に合わせて更新されたことを示しています。
-
SwitchStat
のCaseClause
定義の変更:- 変更前:
CaseClause
はCase
とオプションのStatementList
から構成され、Case
の定義に:
が含まれていました。 - 変更後:
Case
がSwitchCase
にリネームされ、SwitchCase
の定義から:
が削除されました。代わりに、CaseClause
の定義に直接:
が含まれるようになりました。CaseClause = SwitchCase ":" [ StatementList ] .
SwitchCase = "case" ExpressionList | "default" .
この変更により、case
またはdefault
の後にコロンが続くというGoの実際の構文が、文法定義により直接的に表現されるようになりました。
- 変更前:
-
SelectStat
のCommClause
定義の変更:- 変更前:
CommClause
はCommCase
とオプションのStatementList
から構成され、CommCase
の定義に:
が含まれていました。 - 変更後:
CommCase
の定義から:
が削除され、CommClause
の定義に直接:
が含まれるようになりました。また、CommCase
内のdefault
とcase
の順序が入れ替わっています。CommClause = CommCase ":" [ StatementList ] .
CommCase = "case" ( SendExpr | RecvExpr) | "default" .
これもSwitchStat
の変更と同様に、select
文のcase
ブロックの構文をより正確かつ一貫性のある形で表現するための変更です。
- 変更前:
これらの変更は、文法規則の記述をより明確にし、仕様書全体の整合性を高めることを目的とした、純粋に記述上の改善です。
関連リンク
- Go言語公式サイト: https://go.dev/
- Go言語仕様書: https://go.dev/ref/spec (現在の最新版)
参考にした情報源リンク
- Go言語仕様書 (コミット時点のドラフト版の内容を基に解説)
- Go言語の
switch
文とselect
文に関する一般的な知識。