[インデックス 17] ファイルの概要
このコミットは、Go言語の初期のドキュメントファイル doc/go_lang.txt
における、Send
ステートメントの構文定義の修正に関するものです。具体的には、構文定義中の引用符の欠落を修正しています。
コミット
commit 1cf631b4c75ef65f03380ef83163b5c4de677cc9
Author: Robert Griesemer <gri@golang.org>
Date: Thu Mar 6 22:40:49 2008 -0800
- added missing ''''s
SVN=111693
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/1cf631b4c75ef65f03380ef83163b5c4de677cc9
元コミット内容
- added missing ''''s
このコミットメッセージは非常に簡潔で、「欠けていた引用符を追加した」という内容です。これは、コードの機能変更ではなく、ドキュメントの記述ミスを修正するものであることを示唆しています。
変更の背景
このコミットは、Go言語の初期開発段階(2008年)に行われたものです。当時のGo言語はまだ公式リリースされておらず、言語仕様やドキュメントが活発に作成・修正されていました。doc/go_lang.txt
は、Go言語の初期の言語仕様を記述したドキュメントの一つであり、その中で Send
ステートメントの構文定義に誤りがあったため、それを修正する必要がありました。
具体的には、Send
ステートメントの構文を定義する際に、リテラルとして扱われるべき記号 '='
が引用符で囲まれていなかったため、構文の解釈が曖昧になる可能性がありました。このコミットは、その表記上の不備を修正し、ドキュメントの正確性を向上させることを目的としています。
前提知識の解説
Go言語の初期仕様とドキュメント
Go言語は、Googleによって開発された静的型付けのコンパイル型言語です。その設計思想は、シンプルさ、効率性、並行処理の容易さに重点を置いています。初期のGo言語は、現在のGo言語とは異なる部分も多く、言語仕様は徐々に固まっていきました。
doc/go_lang.txt
のようなドキュメントは、言語の設計者や初期の貢献者が言語の構文、セマンティクス、およびその他の側面を記述するために使用されました。これらのドキュメントは、言語の進化とともに更新され、最終的には公式のGo言語仕様書へと発展していきました。
構文定義における引用符の重要性
プログラミング言語の構文を記述する際には、BNF (Backus-Naur Form) や EBNF (Extended Backus-Naur Form) のような形式文法がよく用いられます。これらの文法では、リテラル(言語のキーワードや記号そのもの)と、非終端記号(他の構文要素を表すシンボル)を区別することが重要です。
一般的に、リテラルは引用符(シングルクォート '
やダブルクォート "
)で囲んで表現されます。これにより、その記号が構文の一部として文字通り出現することを明確に示します。引用符がない場合、その記号が非終端記号として解釈される可能性があり、構文定義の曖昧さや誤解を招く原因となります。
Go言語における Send
ステートメント
Go言語には、ゴルーチン間の通信メカニズムとして「チャネル」があります。チャネルは、値を送受信するためのパイプのようなものです。Send
ステートメントは、チャネルに値を送信するための構文です。
初期のGo言語の構文定義では、Send
ステートメントは以下のように定義されていました(修正前):
Send = '>' Expression = Expression .
これは、チャネルへの送信操作を表す >
と、送信される値の Expression
、そしてチャネルと値の間の Expression
を示しています。しかし、この定義では Expression = Expression
の部分が曖昧です。Go言語のチャネル送信構文は channel <- value
の形式を取るため、=
はリテラルとして扱われるべきでした。
技術的詳細
このコミットの技術的な詳細は、Go言語の初期の言語仕様ドキュメント doc/go_lang.txt
内の Send
ステートメントの構文定義の修正に集約されます。
修正前の Send
ステートメントの定義は以下の通りでした。
Send = '>' Expression = Expression .
ここで問題となるのは、Expression = Expression
の部分です。Go言語のチャネル送信演算子は <-
であり、この定義は >
と Expression
の後に Expression
が続くことを示唆していますが、その間の =
が何を意味するのかが不明確でした。
Go言語の構文定義において、リテラルな記号は通常、シングルクォートで囲まれます。例えば、assign_op
の定義では assign_op = [ add_op | mul_op ] '=' .
のように、リテラルな =
が引用符で囲まれています。
このコミットでは、Send
ステートメントの定義における =
が、リテラルな等号記号として扱われるべきであることを明確にするために、シングルクォートで囲む修正が行われました。
修正後の定義は以下の通りです。
Send = '>' Expression '=' Expression .
この変更により、Send
ステートメントの構文がより正確に記述され、>
の後に Expression
が続き、その後にリテラルな =
が続き、さらに Expression
が続くという構造が明確になりました。これは、Go言語のチャネル送信構文 channel <- value
の初期の表現形式をドキュメント上で正確に反映するための修正と考えられます。
この修正は、言語のセマンティクス自体を変更するものではなく、あくまでドキュメントの正確性を高めるためのものです。しかし、言語仕様ドキュメントの正確性は、コンパイラの実装や開発者の理解において非常に重要であるため、このような小さな修正も言語の品質向上に貢献します。
コアとなるコードの変更箇所
変更は doc/go_lang.txt
ファイルの1箇所のみです。
--- a/doc/go_lang.txt
+++ b/doc/go_lang.txt
@@ -1139,7 +1139,7 @@ Assignments
Assignment = SingleAssignment | TupleAssignment | Send .
SimpleAssignment = Designator assign_op Expression .
TupleAssignment = DesignatorList assign_op ExpressionList .
- Send = '>' Expression = Expression .
+ Send = '>' Expression '=' Expression .
assign_op = [ add_op | mul_op ] '=' .
具体的には、1142行目の Send
ステートメントの定義が変更されています。
コアとなるコードの解説
変更された行は、Go言語の初期の言語仕様ドキュメント doc/go_lang.txt
内の Send
ステートメントの構文定義です。
- 変更前:
Send = '>' Expression = Expression .
- 変更後:
Send = '>' Expression '=' Expression .
この修正は、Send
ステートメントの定義において、Expression
の後に続く =
がリテラルな記号であることを明確にするために、シングルクォート '
で囲んだものです。
Go言語の構文定義では、リテラルな記号は通常引用符で囲まれます。例えば、同じファイル内の assign_op
の定義では、リテラルな =
が '='
と記述されています。このコミットは、Send
ステートメントの定義もこの慣例に従うように修正したものです。
この修正は、ドキュメントの正確性を向上させ、Go言語の構文定義の曖昧さを排除することを目的としています。言語の機能や動作に直接的な変更を加えるものではありませんが、言語仕様の記述の品質を高める上で重要な修正です。
関連リンク
- Go言語の公式ウェブサイト: https://golang.org/
- Go言語の初期のコミット履歴 (GitHub): https://github.com/golang/go/commits/master?after=1cf631b4c75ef65f03380ef83163b5c4de677cc9+34 (このコミットの周辺の履歴を確認できます)
参考にした情報源リンク
- Go言語の公式ドキュメント (現在の仕様): https://golang.org/ref/spec (当時の仕様とは異なりますが、現在のGo言語の構文定義の慣例を理解するのに役立ちます)
- BNF/EBNFに関する一般的な情報源 (例: Wikipedia): https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83%E3%82%AF%E3%82%A6%E3%82%B9%E3%83%BB%E3%83%8A%E3%82%A6%E3%83%AB%E5%BD%A2%E5%BC%8F (構文定義の一般的な概念を理解するのに役立ちます)
- Go言語のチャネルに関する情報: https://go.dev/tour/concurrency/2 (現在のチャネルの動作を理解するのに役立ちます)