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

[インデックス 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言語の仕様書における文法定義の記述を改善することを目的としています。コミットメッセージにある通り、「コスメティックな変更」であり、言語の動作やセマンティクスに影響を与えるものではありません。文法規則の定義をより読みやすく、理解しやすく、そして一貫性のある形式にすることで、仕様書の品質向上を図っています。特に、: (コロン) の位置を調整し、CaseClauseCommClauseの定義内でSwitchCaseCommCaseを参照する形にすることで、文法構造の表現がより自然になっています。

前提知識の解説

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 } "}" .
    • SwitchStatswitch キーワードで始まり、オプションで簡単なステートメントと式が続き、{} の中に複数の CaseClause を含みます。

SelectStat (セレクト文)

Go言語の select 文は、複数のチャネル操作(送受信)を同時に待機し、最初に準備ができた操作を実行するための制御構造です。並行処理において非常に重要です。

  • SelectStat = "select" "{" { CommClause } "}" .
    • SelectStatselect キーワードで始まり、{} の中に複数の CommClause を含みます。

CaseClauseCommClause

  • CaseClause: switch 文の各 case ブロックを定義する文法要素です。
  • CommClause: select 文の各 case ブロック(チャネル通信操作)を定義する文法要素です。

技術的詳細

このコミットの技術的な変更は、Go言語仕様書内の2つの文法プロダクション、CaseClauseCommClause の定義方法を再構築することにあります。

SwitchStat の変更詳細

変更前:

CaseClause = Case [ StatementList ] .
Case = ( "case" ExpressionList | "default" ) ":" .

この定義では、CaseClauseCase とオプションの StatementList から構成され、Case 自体が case キーワードと式リスト、または default キーワードの後に : (コロン) が続く形でした。

変更後:

CaseClause = SwitchCase ":" [ StatementList ] .
SwitchCase = "case" ExpressionList | "default" .

変更後では、CaseSwitchCase にリネームされ、その定義から : (コロン) が削除されました。代わりに、CaseClause の定義に : が直接含まれるようになりました。これにより、CaseClauseSwitchCase の後に必ず : が続き、その後にオプションの StatementList が続くという、より直感的な構造になりました。これは、casedefault の後にコロンが続くという実際のGoの構文を、文法定義により直接的に反映しています。

SelectStat の変更詳細

変更前:

CommClause = CommCase [ StatementList ] .
CommCase = ( "default" | ( "case" ( SendExpr | RecvExpr) ) ) ":" .

この定義では、CommClauseCommCase とオプションの StatementList から構成され、CommCase 自体が default または case キーワードとチャネル操作(SendExpr または RecvExpr)の後に : (コロン) が続く形でした。

変更後:

CommClause = CommCase ":" [ StatementList ] .
CommCase = "case" ( SendExpr | RecvExpr) | "default" .

変更後では、CommCase の定義から : (コロン) が削除され、CommClause の定義に直接含まれるようになりました。また、CommCase 内の casedefault の順序が入れ替わっていますが、これは意味的な違いはありません。この変更も 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言語仕様書における SwitchStatSelectStat の文法定義の変更を示しています。

  1. 日付の更新:

    -(January 16, 2009)
    +(January 22, 2009)
    

    これは、仕様書のドラフト版の日付がコミット日に合わせて更新されたことを示しています。

  2. SwitchStatCaseClause 定義の変更:

    • 変更前: CaseClauseCase とオプションの StatementList から構成され、Case の定義に : が含まれていました。
    • 変更後: CaseSwitchCase にリネームされ、SwitchCase の定義から : が削除されました。代わりに、CaseClause の定義に直接 : が含まれるようになりました。
      • CaseClause = SwitchCase ":" [ StatementList ] .
      • SwitchCase = "case" ExpressionList | "default" . この変更により、case または default の後にコロンが続くというGoの実際の構文が、文法定義により直接的に表現されるようになりました。
  3. SelectStatCommClause 定義の変更:

    • 変更前: CommClauseCommCase とオプションの StatementList から構成され、CommCase の定義に : が含まれていました。
    • 変更後: CommCase の定義から : が削除され、CommClause の定義に直接 : が含まれるようになりました。また、CommCase 内の defaultcase の順序が入れ替わっています。
      • CommClause = CommCase ":" [ StatementList ] .
      • CommCase = "case" ( SendExpr | RecvExpr) | "default" . これも SwitchStat の変更と同様に、select 文の case ブロックの構文をより正確かつ一貫性のある形で表現するための変更です。

これらの変更は、文法規則の記述をより明確にし、仕様書全体の整合性を高めることを目的とした、純粋に記述上の改善です。

関連リンク

参考にした情報源リンク

  • Go言語仕様書 (コミット時点のドラフト版の内容を基に解説)
  • Go言語の switch 文と select 文に関する一般的な知識。