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

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

このコミットは、Go言語の仕様書(doc/go_spec.html)におけるセミコロン挿入規則の記述を簡素化し、より正確にするための変更です。具体的には、セミコロンを省略できる条件を、より包括的な単一のルールに集約しています。これは、Go言語の構文をよりシンプルで理解しやすいものにする初期の試みの一環です。

コミット

an attempt at simpler yet more correct semicolon rules.
(i'd be happy to drop the paren one as well, reducing it to one case)

DELTA=4  (0 added, 3 deleted, 1 changed)
OCL=27058
CL=27060

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

https://github.com/golang/go/commit/736a1aeb81f09edd77f7303d98cbcc5b1cf7d98e

元コミット内容

an attempt at simpler yet more correct semicolon rules.
(i'd be happy to drop the paren one as well, reducing it to one case)

DELTA=4  (0 added, 3 deleted, 1 changed)
OCL=27058
CL=27060

変更の背景

Go言語は、その設計当初からシンプルさと明瞭さを重視しており、CやC++のような既存の言語と比較して、より「軽量な」構文を目指していました。初期のGo言語ではセミコロンが存在しましたが、その省略可能な性質が解析を混乱させ、理解しにくいものにしていました。

このコミットは、Go言語の共同開発者の一人であるRob Pikeによって行われました。彼は、セミコロンのルールを簡素化し、最終的には行末のセミコロンのほとんどを削除するという大きな変更を提案しました。このコミットは、その方向性への初期のステップであり、Go言語の構文をより直感的で、プログラマが「面倒な詳細」に煩わされることなくコードに集中できるようにするための試みです。この変更は、最終的にGoの自動セミコロン挿入(ASI)規則の基礎を築くことになります。

前提知識の解説

セミコロンの役割

プログラミング言語におけるセミコロン(;)は、通常、文(statement)の終端を示す区切り文字として機能します。これにより、コンパイラやインタプリタは、コードのどこで一つの文が終わり、次の文が始まるかを識別できます。例えば、C、C++、Javaなどの言語では、ほとんどの文の終わりにセミコロンが必要です。

自動セミコロン挿入 (Automatic Semicolon Insertion, ASI)

一部のプログラミング言語では、プログラマが明示的にセミコロンを記述しなくても、言語処理系が自動的にセミコロンを挿入するメカニズムを持っています。これを自動セミコロン挿入(ASI)と呼びます。Go言語のASIは、BCPL(Basic Combined Programming Language)から着想を得ており、字句解析器(lexer)がセミコロンを挿入します。これにより、Goのプログラマは通常、行末にセミコロンを記述する必要がありませんが、言語の文法は内部的にセミコロンに依存しています。ASIの主な目的は、構文上の「ノイズ」を減らし、コードをより読みやすく、簡潔にすることです。

技術的詳細

このコミットは、Go言語の仕様書であるdoc/go_spec.htmlファイル内のセミコロン省略規則の記述を変更しています。以前の仕様では、セミコロンが省略できる条件として、以下の3つの具体的なケースが挙げられていました。

  1. 宣言リストの閉じ括弧 ) で終わる場合
  2. 型宣言の閉じ波括弧 } で終わる場合
  3. ブロック(switchselect文を含む)の閉じ波括弧 } で終わる場合

このコミットでは、これら3つの条件を削除し、より一般的な単一の条件に置き換えています。新しい条件は「式の一部ではない閉じ波括弧 } で終わる場合」です。

この変更の技術的な意味合いは、セミコロンの省略規則をより抽象化し、特定の構文要素に依存しないようにすることです。これにより、仕様が簡潔になり、将来的な言語の進化にも対応しやすくなります。また、この簡素化は、Go言語が目指す「明示的なセミコロン記述の削減」という方向性における重要な一歩です。

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

変更はdoc/go_spec.htmlファイル内の以下の部分です。

--- a/doc/go_spec.html
+++ b/doc/go_spec.html
@@ -3011,10 +3011,7 @@ which may be omitted only if the previous statement:
 <ul>
 	<li>ends with the closing parenthesis \")\" of a list of declarations
 	    (§Declarations and Scope); or</li>
-	<li>ends with the closing brace \"}\" of a type declaration
-	    (§Type declarations); or </li>
-	<li>ends with the closing brace \"}\" of a block
-	    (including \"switch\" and \"select\" statements).\n
+	<li>ends with a closing brace \"}\" that is not part of an expression.\n
 </ul>

具体的には、以下の3行が削除されました。

  • <li>ends with the closing brace \")\" of a type declaration
  • (§Type declarations); or </li>
  • <li>ends with the closing brace \"}\" of a block
  • (including \"switch\" and \"select\" statements).\n

そして、以下の1行が追加されました。

  • <li>ends with a closing brace \"}\" that is not part of an expression.\n

コアとなるコードの解説

この変更は、Go言語のセミコロン省略規則の記述を、より汎用的で簡潔なものに再定義しています。

削除された3つの条件は、いずれも文が閉じ波括弧 } で終わる特定のケース(型宣言、ブロック)を指していました。これらは、Go言語の構文において非常に頻繁に現れるパターンです。

新たに追加された「ends with a closing brace "}" that is not part of an expression.」(式の一部ではない閉じ波括弧 } で終わる)という条件は、これら個別のケースを包含し、さらに広範な状況に適用できる一般的なルールです。例えば、関数定義の本体、構造体リテラル、複合リテラルなど、式ではない文脈で } が現れる場合にセミコロンが省略できることを示唆しています。

この変更により、Go言語の仕様書はより簡潔になり、セミコロンの省略規則がより一貫性のある形で記述されるようになりました。これは、Go言語の構文解析器の実装を簡素化し、プログラマがセミコロンの有無について推論する際の複雑さを軽減する効果があります。

関連リンク

参考にした情報源リンク