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

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

このコミットは、Go言語の公式仕様書である doc/go_spec.html に関連する変更です。doc/go_spec.html は、Go言語の構文、セマンティクス、およびその他の言語機能に関する詳細な定義を提供し、Go言語の設計と実装の基礎となる文書です。このファイルは、Goコンパイラやツールの開発者、そしてGo言語の深い理解を求めるプログラマーにとって重要なリファレンスとなります。

コミット

commit 1141716c5c90e31c38e7a2c6c9fa51d05027139e
Author: Rob Pike <r@golang.org>
Date:   Tue Mar 24 17:45:53 2009 -0700

    change notation: s/Stat/Stmt/ in grammatical productions
    
    DELTA=26  (0 added, 0 deleted, 26 changed)
    OCL=26703
    CL=26705

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

https://github.com/golang/go/commit/1141716c5c90e31c38e7a2c6c9fa51d05027139e

元コミット内容

change notation: s/Stat/Stmt/ in grammatical productions

変更の背景

このコミットの背景には、Go言語の仕様書における用語の統一と明確化があります。StatStmt はどちらも "Statement"(文)を意味する略語ですが、プログラミング言語の文脈、特に構文規則を記述する際には、より一般的で慣習的な Stmt が好まれます。

Go言語の初期開発段階において、仕様書内の用語はまだ完全に固まっていませんでした。この変更は、Go言語の設計者の一人であるRob Pike氏によって行われ、仕様書全体の整合性を高め、将来的な誤解を防ぐことを目的としています。Stat から Stmt への変更は、単なるタイポの修正ではなく、言語仕様の記述における専門用語の標準化に向けた一歩と見なすことができます。これにより、Go言語の構文規則がより明確に、そして国際的なプログラミング言語の慣習に沿った形で表現されるようになりました。

前提知識の解説

文法規則 (Grammatical Productions)

プログラミング言語の仕様書では、その言語の構文を厳密に定義するために「文法規則」が用いられます。これは通常、バッカス・ナウア記法(BNF)や拡張バッカス・ナウア記法(EBNF)といった形式的な記法で記述されます。これらの記法では、言語の要素(非終端記号)がどのように構成されるか(終端記号や他の非終端記号の組み合わせ)を定義します。

例: Statement = ExpressionStatement | IncDecStatement | Assignment | SimpleVarDecl .

これは、「Statement(文)は、ExpressionStatement(式文)、IncDecStatement(インクリメント/デクリメント文)、Assignment(代入)、またはSimpleVarDecl(単純変数宣言)のいずれかである」という規則を示しています。

Statement (文)

プログラミング言語における「文 (Statement)」とは、プログラムが実行するアクションを表現する最小の独立した単位です。文は、変数への値の代入、関数の呼び出し、条件分岐(if文)、繰り返し(for文)、ジャンプ(goto文)など、様々な操作を指示します。

Go言語における主な文の種類には以下のようなものがあります。

  • Declaration (宣言): 変数、定数、型、関数の宣言など。
  • Empty Statement (空文): 何も実行しない文。
  • Labeled Statement (ラベル付き文): goto 文のターゲットとなるラベルを持つ文。
  • Simple Statement (単純文): 式文、インクリメント/デクリメント文、代入、短い変数宣言など。
  • Go Statement (Go文): ゴルーチンを起動する文。
  • Return Statement (Return文): 関数から値を返して終了する文。
  • Break Statement (Break文): ループやswitch文、select文を終了する文。
  • Continue Statement (Continue文): ループの次のイテレーションに進む文。
  • Goto Statement (Goto文): 指定されたラベルにジャンプする文。
  • Fallthrough Statement (Fallthrough文): switch 文で次の case へ処理を継続する文。
  • Block (ブロック): 波括弧 {} で囲まれた一連の文。
  • If Statement (If文): 条件に基づいてコードブロックを実行する文。
  • Switch Statement (Switch文): 式の値や型の種類に基づいて異なるコードブロックを実行する文。
  • Select Statement (Select文): 複数の通信操作の中から準備ができたものを選択して実行する文。
  • For Statement (For文): 繰り返し処理を行う文。
  • Defer Statement (Defer文): 現在の関数がリターンする直前に実行される関数呼び出しをスケジュールする文。

これらの文は、Goプログラムの制御フローを構築するための基本的な要素となります。

技術的詳細

このコミットは、Go言語の仕様書 doc/go_spec.html 内で、文法規則を記述する際に使用されていた Stat という略語を、より標準的で一般的な Stmt に一括置換するものです。変更は、HTMLファイル内の <pre class="grammar"> タグで囲まれた文法規則の定義部分に限定されています。

具体的には、以下の非終端記号の名称が変更されました。

  • Statement の定義内で参照されるすべての *Stat*Stmt に変更。
    • EmptyStat -> EmptyStmt
    • LabeledStat -> LabeledStmt
    • SimpleStat -> SimpleStmt
    • GoStat -> GoStmt
    • ReturnStat -> ReturnStmt
    • BreakStat -> BreakStmt
    • ContinueStat -> ContinueStmt
    • GotoStat -> GotoStmt
    • FallthroughStat -> FallthroughStmt
    • IfStat -> IfStmt
    • SwitchStat -> SwitchStmt
    • SelectStat -> SelectStmt
    • ForStat -> ForStmt
    • DeferStat -> DeferStmt
  • SimpleStat の定義内で参照される ExpressionStatIncDecStat も変更。
    • ExpressionStat -> ExpressionStmt
    • IncDecStat -> IncDecStmt
  • IfStat, SwitchStat, ForStat などの定義内で参照される SimpleStatSimpleStmt に変更。
  • ForClause の定義内で参照される InitStatPostStat も変更。
    • InitStat -> InitStmt
    • PostStat -> PostStmt

この変更は、仕様書の内部的な整合性を高めるだけでなく、Go言語の構文を学習する開発者や、Go言語のツールを開発する人々にとって、より直感的で標準的な用語法を提供します。このような細かな用語の統一は、大規模なプロジェクトや言語設計において、長期的なメンテナンス性と理解のしやすさに大きく貢献します。

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

--- a/doc/go_spec.html
+++ b/doc/go_spec.html
@@ -2960,12 +2960,12 @@ Statements control execution.
 
 <pre class="grammar">
 Statement =
-	Declaration | EmptyStat | LabeledStat |
-	SimpleStat | GoStat | ReturnStat | BreakStat | ContinueStat | GotoStat |
-	FallthroughStat | Block | IfStat | SwitchStat | SelectStat | ForStat |
-	DeferStat .
+	Declaration | EmptyStmt | LabeledStmt |
+	SimpleStmt | GoStmt | ReturnStmt | BreakStmt | ContinueStmt | GotoStmt |
+	FallthroughStmt | Block | IfStmt | SwitchStmt | SelectStmt | ForStmt |
+	DeferStmt .
 
-SimpleStat = ExpressionStat | IncDecStat | Assignment | SimpleVarDecl .
+SimpleStmt = ExpressionStmt | IncDecStmt | Assignment | SimpleVarDecl .
 
 StatementList = Statement { Separator Statement } .
 Separator     = [ ";" ]
@@ -2992,7 +2992,7 @@ The empty statement does nothing.
 </p>
 
 <pre class="grammar">
-EmptyStat = .
+EmptyStmt = .
 </pre>
 
 <p>
@@ -3009,7 +3009,7 @@ A labeled statement may be the target of a <code>goto</code>,
 </p>
 
 <pre class="grammar">
-LabeledStat = Label ":" Statement .
+LabeledStmt = Label ":" Statement .
 Label       = identifier .
 </pre>
 
@@ -3027,7 +3027,7 @@ can appear in statement context.
 
 
 <pre class="grammar">
-ExpressionStat = Expression .
+ExpressionStmt = Expression .
 </pre>
 
 <pre>
@@ -3045,7 +3045,7 @@ must be a variable, pointer indirection, field selector or index expression.
 </p>
 
 <pre class="grammar">
-IncDecStat = Expression ( "++" | "--" ) .
+IncDecStmt = Expression ( "++" | "--" ) .
 </pre>
 
 <p>
@@ -3141,7 +3141,7 @@ is equivalent to <code>true</code>.
 </p>
 
 <pre class="grammar">
-IfStat    = "if" [ [ SimpleStat ] ";" ] [ Expression ] Block [ "else" Statement ] .
+IfStmt    = "if" [ [ SimpleStmt ] ";" ] [ Expression ] Block [ "else" Statement ] .
 </pre>
 
 <pre>
@@ -3178,7 +3178,7 @@ to execute.
 </p>
 
 <pre class="grammar">
-SwitchStat = ExprSwitchStat | TypeSwitchStat .
+SwitchStmt = ExprSwitchStmt | TypeSwitchStmt .
 </pre>
 
 <p>
@@ -3208,7 +3208,7 @@ the expression <code>true</code>.
 </p>
 
 <pre class="grammar">
-ExprSwitchStat = "switch" [ [ SimpleStat ] ";" ] [ Expression ] "{" { ExprCaseClause } "}" .
+ExprSwitchStmt = "switch" [ [ SimpleStmt ] ";" ] [ Expression ] "{" { ExprCaseClause } "}" .
 ExprCaseClause = ExprSwitchCase ":" [ StatementList ] .
 ExprSwitchCase = "case" ExpressionList | "default" .
 </pre>
@@ -3265,7 +3265,7 @@ in the type guard.
 </p>
 
 <pre class="grammar">
-TypeSwitchStat  = "switch" [ [ SimpleStat ] ";" ] TypeSwitchGuard "{" { TypeCaseClause } "}" .
+TypeSwitchStmt  = "switch" [ [ SimpleStmt ] ";" ] TypeSwitchGuard "{" { TypeCaseClause } "}" .
 TypeSwitchGuard = identifier ":=" Expression "." "(" "type" ")" .
 TypeCaseClause  = TypeSwitchCase ":" [ StatementList ] .
 TypeSwitchCase  = "case" ( type | "nil" ) | "default" .
@@ -3331,7 +3331,7 @@ controlled by a condition, a "for" clause, or a "range" clause.
 </p>
 
 <pre class="grammar">
-ForStat = "for" [ Condition | ForClause | RangeClause ] Block .
+ForStmt = "for" [ Condition | ForClause | RangeClause ] Block .
 Condition = Expression .
 </pre>
 
@@ -3359,9 +3359,9 @@ it declares ends at the end of the statement
 </p>
 
 <pre class="grammar">
-ForClause = [ InitStat ] ";" [ Condition ] ";" [ PostStat ] .
-InitStat = SimpleStat .
-PostStat = SimpleStat .
+ForClause = [ InitStmt ] ";" [ Condition ] ";" [ PostStmt ] .
+InitStmt = SimpleStmt .
+PostStmt = SimpleStmt .
 </pre>
 
 <pre>
@@ -3460,7 +3460,7 @@ within the same address space.
 </p>
 
 <pre class="grammar">
-GoStat = "go" Expression .
+GoStmt = "go" Expression .
 </pre>
 
 <p>
@@ -3484,7 +3484,7 @@ cases all referring to communication operations.\n </p>\n \n <pre class="grammar">\n-SelectStat = "select" "{" { CommClause } "}" .\n+SelectStmt = "select" "{" { CommClause } "}" .\n CommClause = CommCase ":" StatementList .\n CommCase = "case" ( SendExpr | RecvExpr) | "default" .\n SendExpr =  Expression "&lt;-" Expression .\n@@ -3557,7 +3557,7 @@ and optionally provides a result value or values to the caller.\n </p>\n \n <pre class="grammar">\n-ReturnStat = "return" [ ExpressionList ] .\n+ReturnStmt = "return" [ ExpressionList ] .\n </pre>\n \n <pre>\n@@ -3627,7 +3627,7 @@ A "break" statement terminates execution of the innermost\n </p>\n \n <pre class="grammar">\n-BreakStat = "break" [ Label ].\n+BreakStmt = "break" [ Label ].\n </pre>\n \n <p>\n@@ -3653,7 +3653,7 @@ innermost "for" loop at the post statement (§For statements).\n </p>\n \n <pre class="grammar">\n-ContinueStat = "continue" [ Label ].\n+ContinueStmt = "continue" [ Label ].\n </pre>\n \n <p>\n@@ -3667,7 +3667,7 @@ A "goto" statement transfers control to the statement with the corresponding lab\n </p>\n \n <pre class="grammar">\n-GotoStat = "goto" Label .\n+GotoStmt = "goto" Label .\n </pre>\n \n <pre>\n@@ -3702,7 +3702,7 @@ expression "switch" statement.\n </p>\n \n <pre class="grammar">\n-FallthroughStat = "fallthrough" .\n+FallthroughStmt = "fallthrough" .\n </pre>\n \n \n@@ -3714,7 +3714,7 @@ the surrounding function returns.\n </p>\n \n <pre class="grammar">\n-DeferStat = "defer" Expression .\n+DeferStmt = "defer" Expression .\n </pre>\n \n <p>\n```

## コアとなるコードの解説

上記の差分は、`doc/go_spec.html` 内のGo言語の文法規則において、`Stat` という接尾辞を持つ非終端記号の全てが `Stmt` に変更されたことを示しています。

例えば、`Statement` の定義では、以前は `EmptyStat`, `LabeledStat`, `SimpleStat` などと記述されていましたが、この変更により `EmptyStmt`, `LabeledStmt`, `SimpleStmt` となりました。同様に、`SimpleStat` の定義も `ExpressionStat | IncDecStat` から `ExpressionStmt | IncDecStmt` へと更新されています。

この変更は、Go言語の仕様書における用語の標準化と一貫性の向上を目的としています。`Stmt` は "Statement" のより一般的な略語であり、プログラミング言語の文法定義において広く認識されています。この統一により、仕様書の可読性が向上し、Go言語の構文を理解する上での混乱が減少することが期待されます。

技術的な機能変更は一切なく、純粋にドキュメント内の表記の修正です。しかし、このような細かな修正も、言語仕様の正確性とプロフェッショナリズムを保つ上で非常に重要です。

## 関連リンク

このコミットに直接関連する公開された議論や提案は、Go言語の初期段階のものであるため、特定のリンクを見つけるのは困難です。しかし、Go言語の設計に関する一般的な議論は、Goのメーリングリストや初期のGoブログ記事で確認できる場合があります。

## 参考にした情報源リンク

*   Go言語の公式ドキュメント: [https://go.dev/doc/](https://go.dev/doc/)
*   Go言語の仕様書: [https://go.dev/ref/spec](https://go.dev/ref/spec) (現在の最新版)
*   GitHubのGoリポジトリ: [https://github.com/golang/go](https://github.com/golang/go)
*   プログラミング言語の文法に関する一般的な情報 (BNF, EBNFなど)
*   "Statement" の定義に関する一般的なプログラミング用語集