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

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

このコミットは、doc/go_lang.txt というファイルを変更しています。このファイルは、Goプログラミング言語の初期の仕様ドラフトを記述したドキュメントです。Go言語の設計と進化の初期段階における重要な文書であり、言語の基本的な構文、型システム、セマンティクスなどが定義されていました。

コミット

このコミットは、Go言語の仕様ドラフトにおける軽微な問題と、iantによって指摘されたいくつかのバグを修正することを目的としています。具体的には、ドキュメントの日付の更新、型名の誤植の修正、およびnewキーワードの引数に関する記述の修正が含まれています。

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

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

元コミット内容

commit a40a79829ff1b4ba8230d10346f4029674364b17
Author: Robert Griesemer <gri@golang.org>
Date:   Thu Jun 12 13:12:41 2008 -0700

    - fixed minor issues in spec
    - fixed a couple of bugs in the spec (pointed out by iant)
    
    SVN=122479

変更の背景

このコミットは、Go言語の初期開発段階において、言語仕様の正確性と整合性を向上させるために行われました。Go言語は2007年末から2008年初頭にかけてGoogle社内で設計が開始され、この時期はまだ言語の仕様が固まっていないドラフト段階でした。

コミットメッセージにある「fixed minor issues in spec」と「fixed a couple of bugs in the spec (pointed out by iant)」という記述から、この変更は、Go言語の仕様書(doc/go_lang.txt)に存在する誤りや不明瞭な点を修正し、より正確で理解しやすいものにすることを目的としていたことがわかります。特に「iant」という人物からの指摘があったことは、初期のGo言語開発コミュニティ(あるいは内部レビュープロセス)において、仕様書に対する活発なレビューが行われていたことを示唆しています。このような修正は、言語の安定した定義を確立し、将来のコンパイラ実装やツールの開発の基盤を築く上で不可欠なプロセスでした。

前提知識の解説

Go言語の初期開発と仕様書

Go言語は、GoogleのRobert Griesemer、Rob Pike、Ken Thompsonによって設計されました。このコミットが行われた2008年6月は、Go言語がまだ一般に公開される前の、社内での開発と仕様策定が進められていた時期にあたります。doc/go_lang.txtは、この時期に作成されたGo言語の初期の仕様ドラフトであり、現在のGo言語仕様書(The Go Programming Language Specification)の原型となるものです。

uint64

Go言語におけるuint64は、符号なし64ビット整数型を表します。これは0から18,446,744,073,709,551,615までの値を表現できます。このコミットでは、仕様書内のunit64という誤植をuint64に修正しています。これは、Go言語の型システムにおける基本的なデータ型の一つであり、正確な記述が求められます。

newキーワード

Go言語のnewキーワードは、組み込み関数の一つで、指定された型のゼロ値を持つ新しい項目を割り当て、その項目へのポインタを返します。C++やJavaのnewとは異なり、Goのnewはメモリを割り当てるだけで、初期化は行いません(ゼロ値で初期化されます)。このコミットでは、new関数の引数に関する仕様記述を修正しています。初期のドラフトではnew(Type [, Expression])と記述されていたものが、new(Type [, ExpressionList])に修正されています。これは、newが複数の引数を取る可能性を示唆しているか、あるいはより一般的なExpressionListという用語を用いることで、将来的な拡張性や柔軟性を持たせたものと考えられます。ただし、現在のGo言語のnew関数は単一の型引数のみを取ります(例: new(T))。この変更は、初期の設計段階における試行錯誤の一端を示している可能性があります。

技術的詳細

このコミットで行われた技術的な変更は、Go言語の仕様ドラフトであるdoc/go_lang.txtの内容に対するものです。

  1. 日付の更新:

    • 変更前: (June 9, 2008)
    • 変更後: (June 12, 2008) これは、ドキュメントが更新された日付を反映するための単純な修正です。仕様書が継続的に改訂されていることを示しています。
  2. uint64の誤植修正:

    • 変更前: unit64 the set of all unsigned 64-bit integers
    • 変更後: uint64 the set of all unsigned 64-bit integers unit64という明らかな誤植を、正しい型名であるuint64に修正しています。これは、仕様書の正確性を保つ上で非常に重要な修正です。
  3. Allocationnewキーワード)の構文修正:

    • 変更前: Allocation = "new" "(" Type [ "," Expression ] ")" .
    • 変更後: Allocation = "new" "(" Type [ "," ExpressionList ] ")" . この修正は、newキーワードを用いたメモリ割り当ての構文定義に関するものです。
    • 変更前は、newの第2引数が単一のExpressionであるかのように記述されていました。
    • 変更後は、ExpressionList(式のリスト)に変更されています。 現在のGo言語のnew関数は、new(Type)という形式で、単一の型引数のみを取ります。この初期の仕様ドラフトにおけるExpressionExpressionListの記述は、Go言語の設計がまだ流動的であった時期に、newがより複雑な初期化や複数の引数を取る可能性を検討していた名残である可能性があります。例えば、C++のnew演算子のように、コンストラクタ引数を渡すような構文を一時的に検討していたのかもしれません。しかし、最終的にはGo言語のnewはシンプルにメモリ割り当てとゼロ値初期化に特化し、複合リテラルなど別の構文で初期化を行う設計に落ち着きました。この変更は、その設計プロセスの途中で行われた調整の一つと考えられます。

これらの修正は、Go言語の仕様書が初期段階でいかに厳密にレビューされ、改善されていたかを示しています。

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

diff --git a/doc/go_lang.txt b/doc/go_lang.txt
index 7b78a57f35..5faa695525 100644
--- a/doc/go_lang.txt
+++ b/doc/go_lang.txt
@@ -4,7 +4,7 @@ The Go Programming Language (DRAFT)
 Robert Griesemer, Rob Pike, Ken Thompson
 
 ----
-(June 9, 2008)
+(June 12, 2008)
 
 This document is a semi-informal specification/proposal for a new
 systems programming language.  The document is under active
@@ -299,7 +299,7 @@ The arithmetic types are:
   uint8    the set of all unsigned 8-bit integers
   uint16   the set of all unsigned 16-bit integers
   uint32   the set of all unsigned 32-bit integers
-  unit64   the set of all unsigned 64-bit integers
+  uint64   the set of all unsigned 64-bit integers
 
   int8     the set of all signed 8-bit integers, in 2's complement
   int16    the set of all signed 16-bit integers, in 2's complement
@@ -1135,7 +1135,7 @@ Expression syntax is based on that of C but with fewer precedence levels.
   Conversion = "convert" "(" Type [ "," ExpressionList ] ")" |
                ConversionType "(" [ ExpressionList ] ")" .
   ConversionType = TypeName | ArrayType | MapType | StructType | InterfaceType .
-  Allocation = "new" "(" Type [ "," Expression ] ")" .
+  Allocation = "new" "(" Type [ "," ExpressionList ] ")" .
 
   binary_op = log_op | rel_op | add_op | mul_op .
   log_op = "||" | "&&" .

コアとなるコードの解説

上記のdiffは、doc/go_lang.txtファイルに対する3つの主要な変更を示しています。

  1. 日付の更新:

    --- a/doc/go_lang.txt
    +++ b/doc/go_lang.txt
    @@ -4,7 +4,7 @@ The Go Programming Language (DRAFT)
     Robert Griesemer, Rob Pike, Ken Thompson
     
     ----
    -(June 9, 2008)
    +(June 12, 2008)
    

    この部分では、ドキュメントの最終更新日付が「June 9, 2008」から「June 12, 2008」に更新されています。これは、このコミットが行われた日付を反映しており、ドキュメントが活発にメンテナンスされていることを示します。

  2. uint64の誤植修正:

    @@ -299,7 +299,7 @@ The arithmetic types are:
       uint8    the set of all unsigned 8-bit integers
       uint16   the set of all unsigned 16-bit integers
       uint32   the set of all unsigned 32-bit integers
    -  unit64   the set of all unsigned 64-bit integers
    +  uint64   the set of all unsigned 64-bit integers
     
       int8     the set of all signed 8-bit integers, in 2's complement
       int16    the set of all signed 16-bit integers, in 2's complement
    

    ここでは、Go言語の組み込み型である符号なし64ビット整数型を記述する際に、「unit64」と誤って記述されていた箇所が、正しい「uint64」に修正されています。これは単純なタイポ修正ですが、言語仕様の正確性を保証する上で重要です。

  3. newキーワードの構文定義修正:

    @@ -1135,7 +1135,7 @@ Expression syntax is based on that of C but with fewer precedence levels.
       Conversion = "convert" "(" Type [ "," ExpressionList ] ")" |
                    ConversionType "(" [ ExpressionList ] ")" .
       ConversionType = TypeName | ArrayType | MapType | StructType | InterfaceType .
    -  Allocation = "new" "(" Type [ "," Expression ] ")" .
    +  Allocation = "new" "(" Type [ "," ExpressionList ] ")" .
     
       binary_op = log_op | rel_op | add_op | mul_op .
       log_op = "||" | "&&" .
    

    この変更は、newキーワードによるメモリ割り当ての構文定義を修正しています。変更前はnewのオプションの第2引数が単一のExpressionとして定義されていましたが、変更後はExpressionList(式のリスト)として定義されています。前述の「技術的詳細」で解説したように、これはGo言語のnew関数の初期設計における検討過程を示唆しており、最終的なGo言語のnew関数のセマンティクスとは異なる可能性があります。しかし、この時点では、より柔軟な引数リストを許容する可能性を考慮していたことが伺えます。

これらの変更は全体として、Go言語の初期仕様ドラフトの正確性と整合性を高めるための、細部にわたる修正作業の一環であったと言えます。

関連リンク

参考にした情報源リンク