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

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

このコミットは、Go言語の初期開発段階における文法定義の修正に関するものです。具体的には、doc/go_lang.txtファイル内のリテラル定義において、BasicLitの構成要素の表記をより一貫性のあるものに変更しています。

コミット

commit b1d991d6fd15db7bd646bc892110bed65ee0d8a0
Author: Robert Griesemer <gri@golang.org>
Date:   Thu Mar 6 21:50:28 2008 -0800

    - more grammar fixes
    
    SVN=111688

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

https://github.com/golang/go/commit/b1d991d6fd15db7bd646bc892110bed65ee0d8a0

元コミット内容

コミットメッセージは非常に簡潔で、「- more grammar fixes」(さらなる文法修正)とだけ記されています。これは、Go言語の初期開発段階において、言語仕様や文法の定義が頻繁に調整されていたことを示唆しています。SVN=111688という記述は、当時のバージョン管理システムがSubversionであったことを示しており、そのリビジョン番号が111688であることを意味します。

変更の背景

このコミットは、Go言語がまだGoogle社内で開発されていた2008年3月に行われたものです。Go言語は2009年11月に一般公開されるまで、活発な内部開発が進められていました。この時期の変更は、言語の基本的な構文やセマンティクスを確立するための試行錯誤の一環として行われたと考えられます。

doc/go_lang.txtは、当時のGo言語の仕様を記述したドキュメントであり、言語の文法規則が定義されていました。このコミットは、その文法定義における表記の整合性を高めることを目的としています。具体的には、BasicLit(基本的なリテラル)の構成要素の命名規則を統一し、より明確で一貫性のある記述に修正しています。

前提知識の解説

Go言語の初期開発

Go言語は、Google社内でロバート・グリーセマー(Robert Griesemer)、ロブ・パイク(Rob Pike)、ケン・トンプソン(Ken Thompson)によって設計されました。彼らは、既存のプログラミング言語が抱える問題点(コンパイル時間の長さ、依存関係の管理の複雑さ、並行処理の難しさなど)を解決することを目指しました。2008年3月という時期は、Go言語がまだコンセプト段階から具体的な言語仕様へと形作られていく非常に初期の段階にあたります。この時期のdoc/go_lang.txtは、現在のGo言語仕様書(The Go Programming Language Specification)の原型となるドキュメントであったと推測されます。

文法定義とBNF記法

プログラミング言語の文法は、通常、バッカス・ナウア記法(BNF: Backus-Naur Form)やその拡張であるEBNF(Extended Backus-Naur Form)のような形式的な記法で定義されます。これにより、言語の構文が曖昧さなく記述され、コンパイラやインタプリタの実装の基盤となります。

このコミットで変更されている部分は、BNFライクな記法で書かれた文法規則の一部です。

  • Literal = BasicLit | CompoundLit .: LiteralBasicLitまたはCompoundLitのいずれかであることを示します。|は「または」を意味します。
  • BasicLit = CharLit | StringLit | IntLit | FloatLit .: BasicLitCharLit(文字リテラル)、StringLit(文字列リテラル)、IntLit(整数リテラル)、FloatLit(浮動小数点リテラル)のいずれかであることを示します。
  • CompoundLit = ArrayLit | MapLit | StructLit | FunctionLit .: CompoundLit(複合リテラル)はArrayLit(配列リテラル)、MapLit(マップリテラル)、StructLit(構造体リテラル)、FunctionLit(関数リテラル)のいずれかであることを示します。

命名規則の重要性

プログラミング言語の仕様やドキュメントにおいて、一貫性のある命名規則は非常に重要です。これにより、読解性が向上し、誤解を招く可能性が低減されます。このコミットでは、CharLitStringLitなどの既存の命名パターンに合わせて、char_litstring_litといったアンダースコア区切りの小文字表記に統一しようとしています。これは、文法定義内で使用されるターミナル記号(言語の最小単位)や非ターミナル記号(複数のターミナル記号や非ターミナル記号から構成される概念)の命名規則を標準化する意図があったと考えられます。

技術的詳細

このコミットの技術的な変更は、doc/go_lang.txtファイル内の1行の修正に集約されます。

変更前: BasicLit = CharLit | StringLit | IntLit | FloatLit .

変更後: BasicLit = char_lit | string_lit | int_lit | float_lit .

この変更は、BasicLitを構成する要素の表記を、キャメルケース(CharLit)からスネークケース(char_lit)へと変更しています。これは、文法定義内で使用される識別子の命名規則を統一するためのものです。一般的に、文法定義においては、非終端記号(構文規則の左辺に来るもの)はキャメルケースやパスカルケースで記述され、終端記号(言語の実際の要素、例えばキーワードやリテラル)は小文字やスネークケースで記述されることがあります。この変更は、CharLitなどが終端記号に近い概念として扱われることを示唆している可能性があります。

この修正自体は、Go言語のコンパイラの動作やランタイムに直接的な影響を与えるものではありません。あくまで言語仕様を記述したドキュメントの表記上の修正であり、ドキュメントの正確性と一貫性を向上させるためのものです。しかし、このような細かな修正が積み重なることで、言語仕様全体の品質が保たれ、将来的な言語設計や実装の基盤が強固になります。

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

--- a/doc/go_lang.txt
+++ b/doc/go_lang.txt
@@ -816,7 +816,7 @@ Literals
 ----
 
   Literal = BasicLit | CompoundLit .
-  BasicLit = CharLit | StringLit | IntLit | FloatLit .
+  BasicLit = char_lit | string_lit | int_lit | float_lit .
   CompoundLit = ArrayLit | MapLit | StructLit | FunctionLit .
 
 

コアとなるコードの解説

変更された行は、Go言語の文法定義の一部です。

  • - BasicLit = CharLit | StringLit | IntLit | FloatLit . (変更前)
  • + BasicLit = char_lit | string_lit | int_lit | float_lit . (変更後)

この変更は、BasicLitがどのような基本的なリテラルから構成されるかを定義している部分です。変更前はCharLitStringLitIntLitFloatLitというキャメルケースの表記が使われていました。変更後は、これらがchar_litstring_litint_litfloat_litというスネークケースの表記に統一されています。

この修正の意図は、文法定義における命名規則の統一にあります。おそらく、他の文法要素や、より低レベルな構文要素の定義において、スネークケースが採用されていたため、それに合わせてBasicLitの構成要素も変更されたと考えられます。これにより、ドキュメント全体の整合性が高まり、言語仕様の理解が容易になります。

このような細かな文法定義の修正は、言語の設計者が言語の構文をどのように捉え、どのように形式的に記述しようとしていたかを示す貴重な手がかりとなります。初期の段階では、このような表記上の揺れはよく見られ、開発が進むにつれて徐々に統一されていくのが一般的です。

関連リンク

このコミットはGo言語の非常に初期の段階のものであり、直接的な関連リンクを見つけることは困難です。しかし、Go言語の歴史や設計思想に関する一般的な情報が参考になります。

参考にした情報源リンク