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

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

このコミットは、Goプログラミング言語の初期のリファレンスマニュアルの最初の部分を導入するものです。具体的には、doc/go_ref.htmlという新しいHTMLファイルが追加され、Go言語の概要、字句的特性(Unicodeテキストの扱い、トークンの種類、コメント、識別子、キーワード、演算子と区切り文字、リテラル)について記述されています。

コミット

commit d1107adb522c387dbcad07493f9d80b72c3642d0
Author: Rob Pike <r@golang.org>
Date:   Wed Feb 18 15:39:51 2009 -0800

    First piece of Go reference manual.
    
    R=ken,gri,rsc
    DELTA=185  (185 added, 0 deleted, 0 changed)
    OCL=25133
    CL=25169

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

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

元コミット内容

First piece of Go reference manual.

R=ken,gri,rsc
DELTA=185  (185 added, 0 deleted, 0 changed)
OCL=25133
CL=25169

変更の背景

このコミットは、Goプログラミング言語の公式リファレンスマニュアルの最初の部分を公開するためのものです。Go言語は2009年にGoogleで開発が始まり、このコミットが行われた2009年2月18日は、Go言語が一般に公開される前の初期段階にあたります。言語の設計が進む中で、その仕様を明確にし、開発者や将来のユーザーが言語を理解するための公式ドキュメントが必要とされました。このコミットは、その重要な一歩として、言語の基本的な字句構造を定義するリファレンスマニュアルの草稿を導入しています。これは、Go言語の安定した仕様を確立し、コミュニティが言語を学習・利用するための基盤を築く上で不可欠な作業でした。

前提知識の解説

このコミットを理解するためには、以下の概念が役立ちます。

  • プログラミング言語のリファレンスマニュアル: プログラミング言語の構文、セマンティクス、標準ライブラリなどを公式に定義した文書です。言語の「憲法」のようなもので、言語の挙動に関する最終的な権威となります。
  • 字句解析 (Lexical Analysis): コンパイラやインタプリタの最初の段階で、ソースコードの文字列を意味のある最小単位(トークン)に分割するプロセスです。例えば、int x = 10;というコードは、int(キーワード)、x(識別子)、=(演算子)、10(リテラル)、;(区切り文字)といったトークンに分割されます。
  • トークン (Token): 字句解析によって識別される、プログラミング言語における意味を持つ最小単位です。キーワード、識別子、演算子、リテラル、区切り文字などが含まれます。
  • UnicodeとUTF-8:
    • Unicode: 世界中の文字を統一的に扱うための文字コード標準です。各文字に一意の番号(コードポイント)を割り当てます。
    • UTF-8: Unicodeのコードポイントをバイト列にエンコードするための可変長エンコーディング方式の一つです。ASCII互換性があり、Webで広く利用されています。Go言語のソースコードはUTF-8でエンコードされたUnicodeテキストとして扱われます。
  • 識別子 (Identifier): プログラム内で変数、関数、型などの名前として使用される文字列です。
  • キーワード (Keyword): プログラミング言語において特別な意味を持つ予約語で、識別子として使用することはできません。
  • リテラル (Literal): ソースコード中に直接記述された定数値です。整数リテラル、浮動小数点リテラル、文字リテラル、文字列リテラルなどがあります。
  • コメント (Comment): ソースコード中に記述される、プログラムの実行には影響しない注釈です。コードの可読性を高めるために使用されます。

技術的詳細

このコミットで追加されたdoc/go_ref.htmlは、Go言語の字句的特性に焦点を当てたリファレンスマニュアルの初期ドラフトです。

  1. Go言語の概要:

    • Goが汎用言語であり、システムプログラミングを念頭に設計されていることが述べられています。
    • 強く型付けされ、ガベージコレクションを備え、並行プログラミングを明示的にサポートしている点が強調されています。
    • プログラムが「パッケージ」から構築され、依存関係の効率的な管理を可能にすることが説明されています。
    • 既存の実装が従来のコンパイル/リンクモデルを使用して実行可能バイナリを生成することも言及されています。
    • 文法がシンプルで規則的であり、統合開発環境(IDE)などの自動ツールによる解析が容易であるとされています。
  2. 字句的特性 (Lexical properties):

    • プログラムは「パッケージ」の集合から構築され、各パッケージは個別にコンパイルされる1つ以上のソースファイルによって定義されると説明されています。
    • 各ファイルのソーステキストを処理する際、入力は「トークン」のシーケンスに分割されます。
  3. Unicodeテキスト:

    • Goのソーステキストは、UTF-8でエンコードされたUnicodeコードポイントのシーケンスであると明記されています。
    • 言語プロセッサは入力を正規化しないため、結合文字(例:アクセント記号と文字を組み合わせたもの)は個別のコードポイントとして扱われることが強調されています。
    • 「文字」という用語は、Unicodeコードポイントを指すために使用されると定義されています。
    • 大文字と小文字は異なる文字として扱われます。
  4. トークン:

    • 識別子、キーワード、演算子と区切り文字、リテラルの4種類のトークンクラスが存在します。
    • 空白(スペース、タブ、改行)は、トークンを分離する場合を除いて無視されます。
    • コメントも空白として扱われます。
    • 入力がトークンに分割される際、次のトークンは有効なトークンを形成する最長の文字シーケンスであるという「最長一致」ルールが適用されます。
  5. コメント:

    • 2種類のコメント形式が定義されています。
      • // で始まり、次の改行まで続く単一行コメント。
      • /* で始まり、*/ で終わる複数行コメント。
    • コメントはネストしないことが明記されています。
  6. 識別子:

    • 1つ以上の文字と数字のシーケンスとして定義されます。
    • 「文字」と「数字」の意味は、対応するUnicodeプロパティによって定義されます。
    • アンダースコア文字 _ (U+005F) は文字と見なされます。
    • 識別子の最初の文字は文字でなければなりません。
    • (注記): 当時の実装では、数字にはASCII数字のみが受け入れられていたという赤い文字での注記があります。これは、Go言語の初期段階における実装の制約を示唆しています。
  7. キーワード:

    • 予約されており、識別子として使用できないキーワードのリストが提供されています。
    • リストには、break, case, chan, const, continue, default, defer, else, fallthrough, for, func, go, goto, if, import, interface, map, package, range, return, select, struct, switch, type, var が含まれています。これらは現在のGo言語のキーワードとほぼ一致しており、言語の基本的な制御構造や型システムが初期段階から確立されていたことがわかります。
  8. 演算子と区切り文字:

    • 演算子、区切り文字、その他の特殊な字句を表す文字シーケンスのリストが提供されています。
    • 算術演算子 (+, -, *, /, %)、ビット演算子 (&, |, ^, <<, >>)、代入演算子 (+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=)、論理演算子 (&&, ||, !)、比較演算子 (==, !=, <, <=, >, >=)、インクリメント/デクリメント (++, --)、アドレス演算子 (&, *)、チャネル送受信 (<-)、代入 (=, :=)、区切り文字 ((, ), [, ], {, }, ,, ;, ., :)、可変引数 (...) など、Go言語の基本的な構文要素が網羅されています。
  9. リテラル:

    • 整数リテラル、浮動小数点リテラル、文字リテラル、文字列リテラルのセクション見出しが設けられていますが、このコミットの時点では具体的な内容はまだ記述されていません。これは、リファレンスマニュアルが段階的に構築されていく過程を示しています。

全体として、このコミットはGo言語の字句解析の基礎を定義し、言語の構文規則の厳密な定義に向けた重要な一歩を踏み出しています。特にUnicodeとUTF-8の扱いに関する明確な記述は、Goが国際化を最初から考慮していたことを示唆しています。

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

このコミットでは、doc/go_ref.html という新しいファイルが追加されています。

--- /dev/null
+++ b/doc/go_ref.html
@@ -0,0 +1,93 @@
+
+<h2>Introduction</h2>
+
+<p>
+This is a reference manual for the Go programming language. For more information and other documents, see <a href="/">the Go home page</a>.
+</p>
+
+<p>
+Go is a general-purpose language designed with systems programming in mind. It is strongly typed and garbage-collected, and has explicit support for concurrent programming.  Programs are constructed from <i>packages</i>, whose properties allow efficient management of dependencies. The existing implementations use a traditional compile/link model to generate executable binaries.
+</p>
+
+<p>
+The grammar is simple and regular, allowing for easy analysis by automatic tools such as integrated development environments.
+</p>
+
+<h2>Lexical properties</h2>
+
+<p>
+A program is constructed from a set of <i>packages</i>.  Each package is defined by one or more source files compiled separately.  In processing the source text in each file, the input is divided into a sequence of <i>tokens</i>.
+</p>
+
+<h3>Unicode text</h3>
+
+<p>
+Go source text is a sequence of Unicode code points encoded in UTF-8.  The language processor does not canonicalize the input, so it will treat a single accented code point as distinct from the same character constructed from combining an accent and a letter; those are treated as two code points.  For simplicity, this document will use the term <i>character</i> to refer to a Unicode code point.
+</p>
+<p>
+Each code point is distinct; for example, upper and lower case letters are different characters.
+</p>
+
+<h3>Tokens</h3>
+
+<p>
+There are four classes of tokens: identifiers, keywords, operators and delimiters, and literals.  <i>White space</i>, formed from blanks, tabs, and newlines, is ignored except as it separates tokens that would otherwise combine into a single token.  Comments, defined below, behave as white space.  While breaking the input into tokens, the next token is the longest sequence of characters that form a valid token.
+</p>
+
+<h3>Comments</h3>
+
+<p>
+There are two forms of comments.  The first starts at a the character sequence <tt>//</tt> and continues through the next newline.  The second starts at the character sequence <tt>/*</tt> and continues through the character sequence <tt>*/</tt>.  Comments do not nest.
+</p>
+
+<h3>Identifiers</h3>
+
+<p>
+An identifier is a sequence of one or more letters and digits. The meaning of <i>letter</i> and <i>digit</i> is defined by the Unicode properties for the corresponding characters, with the addition that the underscore character <tt>_</tt> (U+005F) is considered a letter.  The first character in an identifier must be a letter. <font color=red>(Current implementation accepts only ASCII digits for digits.)</font>
+</p>
+
+<h3>Keywords</h3>
+
+<p>
+The following keywords are reserved and may not be used as identifiers.
+</p>
+<pre>
+break        default      func         interface    select
+case         defer        go           map          struct
+chan         else         goto         package      switch
+const        fallthrough  if           range        type
+continue     for          import       return       var
+</pre>
+
+<h3>Operators and Delimiters</h3>
+
+<p>
+The following character sequences are tokens representing operators, delimiters, and other special lexemes:
+</p>
+<pre>
++    &amp;     +=    &amp;=     &amp;&amp;    ==    !=    (    )
+-    |     -=    |=     ||    <     <=    [    ]
+*    ^     *=    ^=     <-    >     >=    {    }
+/    <<    /=    <<=    ++    =     :=    ,    ;
+%    >>    %=    >>=    --    !     ...   .    :
+</pre>
+
+<h3>Literals</h3>
+
+<h4>Integer literals</h4>
+
+<h4>Floating-point literals</h4>
+
+<h4>Character literals</h4>
+
+<h4>String literals</h4>
+
+
+</div>
+
+<br class="clearboth" />
+<div id="pageFooter">
+<p><span class="conf">Google Confidential:</span> For Internal Use Only.<br />&copy;&nbsp;2009 Google, Inc. All Rights Reserved.</p>
+</div>
+</body>
+</html>

コアとなるコードの解説

追加されたdoc/go_ref.htmlファイルは、Go言語のリファレンスマニュアルの最初のセクションを構成しています。このHTMLドキュメントは、Go言語の基本的な特性と、ソースコードがどのように字句的に解析されるかを説明しています。

主要なセクションとその内容は以下の通りです。

  • Introduction (導入):

    • Go言語がシステムプログラミングを目的とした汎用言語であること、強く型付けされ、ガベージコレクションを持ち、並行プログラミングをサポートしていることが述べられています。
    • プログラムがパッケージから構成され、依存関係の管理に優れていること、そして従来のコンパイル/リンクモデルを使用することが説明されています。
    • 文法がシンプルで、自動ツールによる解析が容易であるという利点が強調されています。
  • Lexical properties (字句的特性):

    • Goプログラムがパッケージとソースファイルから構成され、ソーステキストがトークンに分割されるプロセスが説明されています。
  • Unicode text (Unicodeテキスト):

    • GoのソースコードがUTF-8でエンコードされたUnicodeコードポイントのシーケンスであると定義されています。
    • 言語プロセッサがUnicodeの正規化を行わないため、結合文字と分解された文字が異なるコードポイントとして扱われる点が重要です。これは、ソースコードの文字表現が厳密にコードポイントレベルで扱われることを意味します。
  • Tokens (トークン):

    • 識別子、キーワード、演算子と区切り文字、リテラルの4種類のトークンクラスが定義されています。
    • 空白とコメントはトークン分離の役割を果たすが、それ自体は無視されることが述べられています。
    • 字句解析において「最長一致」ルールが適用されることが明記されています。これは、例えば>>=のような演算子が>>=の2つのトークンではなく、1つの>>=トークンとして解釈されることを保証します。
  • Comments (コメント):

    • //による単一行コメントと、/* ... */による複数行コメントの2つの形式が説明されています。
    • コメントがネストしないという重要な制約が示されています。これは、/* /* nested */ */のような記述が許可されないことを意味します。
  • Identifiers (識別子):

    • 識別子の定義(文字と数字のシーケンス、アンダースコアも文字と見なされる)と、最初の文字が文字でなければならないというルールが示されています。
    • 特に、当時の実装では数字にASCII数字のみが受け入れられていたという注記があり、これはGo言語の初期段階における国際化対応の進捗状況を示唆しています。
  • Keywords (キーワード):

    • Go言語の予約語の包括的なリストが提供されています。このリストは、Go言語の基本的な制御フロー(if, for, switch)、並行処理(go, chan, select)、型システム(func, interface, struct, type, var)、パッケージ管理(package, import)など、言語の核となる要素が初期段階から設計されていたことを示しています。
  • Operators and Delimiters (演算子と区切り文字):

    • Go言語で使用される様々な演算子と区切り文字のリストが示されています。これには、算術、ビット、論理、比較、代入、インクリメント/デクリメント、チャネル操作、ポインタ操作など、幅広い種類の演算子が含まれています。:=(ショート変数宣言)のようなGo特有の演算子もこの初期段階から存在していたことがわかります。
  • Literals (リテラル):

    • 整数、浮動小数点、文字、文字列リテラルのセクション見出しが用意されていますが、具体的な定義はまだ含まれていません。これは、リファレンスマニュアルが段階的に詳細化されていく過程を示唆しています。

このコミットは、Go言語の公式ドキュメントの基礎を築くものであり、言語の設計思想、特にシンプルさ、並行性、そしてUnicode対応への初期からのコミットメントを反映しています。

関連リンク

参考にした情報源リンク