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

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

コミット

commit c863db4e8762d24df791025314ceb4241df921a3
Author: Robert Griesemer <gri@golang.org>
Date:   Mon Jan 7 18:02:58 2013 -0800

    spec: s/char_lit/rune_lit/
    
    The spec talks explicitly about rune literals but the
    respective production is still called char_lit for
    historic reasons. Updated the two occurences.
    
    Fixes #4602.
    
    R=rsc, iant, r, ken
    CC=golang-dev
    https://golang.org/cl/7070048

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

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

元コミット内容

このコミットは、Go言語の仕様書(doc/go_spec.html)において、char_litという用語をrune_litに置換するものです。コミットメッセージによると、仕様書自体は「rune literal」について明示的に言及しているにもかかわらず、歴史的な理由から関連するプロダクションルール(構文定義)がchar_litのままになっていたため、これを修正しました。この変更はIssue #4602を修正するものです。

変更の背景

Go言語では、単一の文字リテラルは「rune literal」と呼ばれます。これは、GoがUTF-8をネイティブにサポートしており、文字が単なるバイトではなくUnicodeのコードポイント(rune)として扱われるためです。しかし、Go言語の仕様書の初期のバージョンでは、歴史的な経緯から、この「rune literal」を定義する構文規則(EBNFプロダクション)がchar_lit(character literalの略)と記述されていました。

この用語の不一致は、仕様書の記述と実際の言語の概念との間に混乱を生じさせる可能性がありました。特に、Goの「rune」という概念は他の言語の「char」(通常は単一バイトまたは固定長の文字を指す)とは異なるため、正確な用語を使用することが重要でした。

このコミットは、Go言語の仕様書における用語の整合性を高め、読者がより正確にGoの文字リテラルの概念を理解できるようにするために行われました。Issue #4602がこの修正のトリガーとなっています。

前提知識の解説

  • Go言語のRune (ルーン): Go言語において、rune型はUnicodeのコードポイントを表す組み込み型です。これはint32のエイリアスであり、UTF-8でエンコードされた任意のUnicode文字を保持できます。Goの文字列はUTF-8バイトのシーケンスであり、個々の文字は「rune」として扱われます。単一引用符で囲まれた文字(例: 'a', '世')はrune literalと呼ばれ、そのUnicodeコードポイントの値を持ちます。
  • EBNF (Extended Backus-Naur Form): プログラミング言語の構文を記述するためのメタ言語です。Go言語の仕様書では、言語の構文規則をEBNFで定義しています。EBNFのプロダクションルールは、名前 = 定義 . の形式で記述され、名前は非終端記号(構文要素)を、定義はその構文要素がどのように構成されるかを示します。
  • Literal (リテラル): プログラミング言語において、ソースコード中に直接記述された固定値のことです。例えば、数値リテラル(123)、文字列リテラル("hello")、ブールリテラル(true)などがあります。Goにおける'a'のような単一引用符で囲まれた文字は「rune literal」です。
  • Go言語の仕様書: Go言語の公式な定義を記述した文書です。言語の構文、セマンティクス、組み込み型、パッケージなどが詳細に記述されており、Goコンパイラの実装やGoプログラムの動作の基準となります。

技術的詳細

このコミットの技術的な変更は非常にシンプルで、Go言語の仕様書HTMLファイル(doc/go_spec.html)内の2箇所の文字列置換です。

具体的には、EBNF形式で記述された構文規則において、以下の変更が行われました。

  1. char_litプロダクションの名称変更: 変更前: <pre class="ebnf">char_lit = "'" ( unicode_value | byte_value ) "'" .</pre> 変更後: <pre class="ebnf">rune_lit = "'" ( unicode_value | byte_value ) "'" .</pre> これは、単一引用符で囲まれた文字リテラルを定義するプロダクションの名前を、その実体である「rune literal」に合わせてrune_litに変更したものです。

  2. BasicLitプロダクション内の参照変更: 変更前: <pre class="ebnf">BasicLit = int_lit | float_lit | imaginary_lit | char_lit | string_lit .</pre> 変更後: <pre class="ebnf">BasicLit = int_lit | float_lit | imaginary_lit | rune_lit | string_lit .</pre> これは、基本的なリテラル(BasicLit)の定義において、char_litへの参照を新しいrune_litへの参照に更新したものです。

これらの変更により、Go言語の仕様書全体で「rune literal」という概念が統一的に扱われるようになり、用語の混乱が解消されました。これは、言語の正確な理解を促進し、将来的な仕様の拡張や教育資料の作成においても一貫性を保つ上で重要な修正です。

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

変更はdoc/go_spec.htmlファイルのみです。

--- a/doc/go_spec.html
+++ b/doc/go_spec.html
@@ -1,6 +1,6 @@
 <!--{
  	"Title": "The Go Programming Language Specification",
- 	"Subtitle": "Version of January 6, 2013",
+ 	"Subtitle": "Version of January 7, 2013",
  	"Path": "/ref/spec"
 }-->
 
@@ -423,7 +423,7 @@ After a backslash, certain single-character escapes represent special values:
 All other sequences starting with a backslash are illegal inside rune literals.
 </p>
 <pre class="ebnf">
-char_lit         = "'" ( unicode_value | byte_value ) "'" .
+rune_lit         = "'" ( unicode_value | byte_value ) "'" .
 unicode_value    = unicode_char | little_u_value | big_u_value | escaped_char .
 byte_value       = octal_byte_value | hex_byte_value .
 octal_byte_value = `\` octal_digit octal_digit octal_digit .
@@ -2063,7 +2063,7 @@ or a parenthesized expression.
 <pre class="ebnf">
 Operand    = Literal | OperandName | MethodExpr | "(" Expression ")" .
 Literal    = BasicLit | CompositeLit | FunctionLit .
-BasicLit   = int_lit | float_lit | imaginary_lit | char_lit | string_lit .
+BasicLit   = int_lit | float_lit | imaginary_lit | rune_lit | string_lit .
 OperandName = identifier | QualifiedIdent.
 </pre>
 

コアとなるコードの解説

上記の差分が示すように、変更は主にHTMLファイル内のテキスト置換です。

  1. 仕様書の日付更新: Subtitleのバージョン日付が「Version of January 6, 2013」から「Version of January 7, 2013」に更新されています。これは、仕様書の内容が更新されたことを示す標準的な慣行です。

  2. char_litからrune_litへの置換: doc/go_spec.html内の2箇所で、char_litという文字列がrune_litに置き換えられています。

    • 1箇所目は、EBNFのプロダクション定義自体です。char_litという非終端記号がrune_litに改名されました。
    • 2箇所目は、BasicLit(基本的なリテラル)の定義内で、char_litへの参照がrune_litへの参照に更新されました。

これらの変更は、Go言語の仕様書における用語の正確性と一貫性を向上させることを目的としています。Go言語の設計思想において、文字はUnicodeのコードポイントとして扱われる「rune」であるという点が強調されており、この変更はその概念を仕様書に明確に反映させたものです。これにより、Go言語の学習者や開発者が、文字リテラルに関するGoのユニークなアプローチをより正確に理解できるようになります。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント
  • Go言語のGitHubリポジトリ
  • EBNF (Extended Backus-Naur Form) に関する一般的な情報
  • UnicodeとUTF-8に関する一般的な情報