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

[インデックス 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言語の構文定義の曖昧さを排除することを目的としています。言語の機能や動作に直接的な変更を加えるものではありませんが、言語仕様の記述の品質を高める上で重要な修正です。

関連リンク

参考にした情報源リンク