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

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

このコミットは、Go言語のリリースノートファイルである doc/go1.2.txt を更新するものです。具体的には、Go 1.2リリースに向けた様々な変更点(Change List: CL)を追記し、既存のエントリのCL番号を修正しています。これは、Go 1.2の最終リリースに向けて、その時点までに取り込まれた重要な変更を文書化する作業の一環です。

コミット

commit 207289660a6f564d7264e4750d3d85307c864ddb
Author: Russ Cox <rsc@golang.org>
Date:   Fri Aug 9 22:25:49 2013 -0400

    doc: update go1.2.txt
    
    I skimmed the submitted CLs back to Monday.
    
    R=golang-dev, r
    CC=golang-dev
    https://golang.org/cl/12696045

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

https://github.com/golang/go/commit/207289660a6f564d7264e4750d3d85307c864ddb

元コミット内容

このコミットの元の内容は、doc/go1.2.txt ファイルの更新です。具体的には、以下の変更が加えられています。

  • cmd/5l: サブワード移動のための MOVBS, MOVHS などの命令が追加されたこと (CL 12682043)。
  • compress/bzip2: 連結されたファイルのサポートが追加されたこと (CL 12387044)。
  • crypto/cipher: AES-GCMモードが追加されたこと (CL 12375043)。
  • go/build: Package.AllTags が追加されたこと (CL 12703044)。
  • net/http: ReadResponsenil *Request パラメータを許容するようになったこと (CL 9821043)。
  • time: パターンが Mon, Jan などの後に非小文字を要求するようになったこと (CL 12448044)。
  • encoding/csv: 常に末尾のカンマを許可する変更のCL番号が 11916045 から 12294043 に更新されたこと。

これらの変更は、Go 1.2リリースに含まれる新機能や改善点を反映しています。

変更の背景

Go言語の開発プロセスでは、新しい機能の追加、バグ修正、パフォーマンス改善などがChange List (CL) として提出され、レビューを経てマージされます。Goのメジャーリリース(例: Go 1.2)に際しては、そのリリースに含まれる主要な変更点や新機能をユーザーに伝えるためのリリースノートが作成されます。

このコミットは、Go 1.2のリリースノートである doc/go1.2.txt を、その時点までにマージされた重要なCLに基づいて更新するものです。コミットメッセージにある「I skimmed the submitted CLs back to Monday.」という記述から、Russ Cox氏が直近のCLをレビューし、リリースノートに含めるべき項目を選定したことが伺えます。これは、リリースプロセスの最終段階で、ユーザーがGo 1.2で何が変わったのかを正確に理解できるようにするための重要な作業です。

特に、encoding/csv のCL番号が更新されている点は、同じ機能変更であっても、その実装やレビューの過程でCLが再提出されたり、別のCLに置き換えられたりすることがあるという開発プロセスの実情を示しています。

前提知識の解説

このコミットを理解するためには、以下の前提知識があると役立ちます。

  • Go言語のリリースサイクル: Go言語は、通常6ヶ月ごとにメジャーリリースを行います。各リリースでは、言語仕様の変更、標準ライブラリの拡充、ツールチェインの改善、ランタイムの最適化など、多岐にわたる変更が導入されます。go1.2.txt のようなファイルは、これらの変更をまとめたリリースノートの一部となります。
  • Change List (CL): Go言語の開発では、すべての変更は「Change List (CL)」としてGerrit(Goプロジェクトが使用するコードレビューシステム)に提出されます。各CLには一意の番号が割り当てられ、コードの変更内容、コミットメッセージ、レビューコメントなどが含まれます。golang.org/cl/ のURL形式は、Gerrit上の特定のCLを指します。
  • Goの標準ライブラリ: Goは豊富な標準ライブラリを提供しており、cmd/, compress/bzip2, crypto/cipher, go/build, net/http, time, encoding/csv などは、それぞれGoのツール、圧縮、暗号、ビルドシステム、ネットワーク、時間処理、CSVエンコーディング/デコーディングに関連する標準パッケージです。
  • アセンブリ言語 (cmd/5l): cmd/5l はGoのアセンブラリンカの一部であり、Goのランタイムや標準ライブラリの一部は、パフォーマンスが重要な箇所でアセンブリ言語で記述されています。MOVBS, MOVHS は、x86アーキテクチャにおけるバイト(Byte)やワード(Half-word)単位のデータ移動命令に関連する可能性があります。
  • AES-GCM (crypto/cipher): AES-GCM (Galois/Counter Mode) は、認証付き暗号化モードの一つで、データの機密性、完全性、認証を同時に提供します。現代のセキュアな通信プロトコル(TLSなど)で広く利用されています。
  • HTTPプロトコル (net/http): net/http パッケージは、GoでHTTPクライアントおよびサーバーを構築するための基本的な機能を提供します。ReadResponse は、HTTPレスポンスを読み取るための関数です。

技術的詳細

このコミット自体は、Goのソースコードの変更ではなく、Go 1.2のリリースノートのテキストファイル doc/go1.2.txt の変更です。しかし、その変更内容は、Go 1.2で導入された重要な技術的改善や新機能を示しています。

それぞれのCLが示す技術的詳細を以下に解説します。

  • cmd/5l: add MOVBS, MOVHS etc for sub-word moves (CL 12682043):

    • 背景: Goのコンパイラやアセンブラは、生成されるバイナリの効率性を追求します。特に、異なるデータサイズ(バイト、ワード、ダブルワードなど)間でのデータ移動は、アセンブリレベルで最適化されるべき重要な操作です。
    • 技術詳細: MOVBS (Move Byte Sign-extended), MOVHS (Move Half-word Sign-extended) などは、x86アーキテクチャのアセンブリ命令で、より小さいサイズのデータをより大きいサイズのレジスタやメモリに移動する際に、符号拡張(符号ビットを上位ビットにコピーして値を保持する)を行うものです。これらの命令が cmd/5l (Goのアセンブラリンカ) に追加されたということは、Goコンパイラが生成するコードが、これらの命令を利用して、より効率的かつ正確なサブワード(バイトやハーフワード)のデータ移動を行えるようになったことを意味します。これにより、特定のデータ型変換やメモリ操作のパフォーマンスが向上する可能性があります。
  • compress/bzip2: support concatenated files (CL 12387044):

    • 背景: bzip2 はブロック指向の圧縮アルゴリズムであり、複数の bzip2 圧縮ストリームが連結されたファイルを扱うことがあります(例: cat file1.bz2 file2.bz2 > combined.bz2)。以前のGoの compress/bzip2 パッケージでは、このような連結されたファイルを正しく解凍できない、あるいは最初のストリームしか処理できないといった制限があった可能性があります。
    • 技術詳細: この変更により、compress/bzip2 パッケージが、複数の bzip2 圧縮ストリームが連続して含まれるファイルを透過的に処理できるようになりました。これは、bzip2 のストリーム終端マーカーを正しく検出し、次のストリームの開始を認識するロジックが追加されたことを意味します。これにより、ユーザーは連結された bzip2 ファイルを特別な前処理なしにGoで直接扱うことができるようになり、利便性と堅牢性が向上します。
  • crypto/cipher: AES-GCM mode (CL 12375043):

    • 背景: 暗号化において、データの機密性(盗聴防止)だけでなく、完全性(改ざん防止)と認証(送信者の確認)も同時に提供することが重要です。従来のCBCモードなどでは、認証は別途HMACなどで行う必要がありました。AES-GCMは、これらを一度に行える認証付き暗号化モードとして広く採用されています。
    • 技術詳細: crypto/cipher パッケージにAES-GCMモードのサポートが追加されました。これは、Goの標準ライブラリが、よりセキュアで効率的な認証付き暗号化機能を提供できるようになったことを意味します。AES-GCMは、カウンタモード(CTR)とGaloisフィールド乗算を組み合わせることで、高速な暗号化と認証を実現します。この追加により、Goアプリケーションは、TLS、IPsec、SSHなどのプロトコルで利用される最新の暗号化要件に、より容易に対応できるようになります。
  • go/build: add Package.AllTags (CL 12703044):

    • 背景: Goのビルドシステムでは、ビルドタグ(build tags)を使用して、特定の環境や条件に基づいてコードのコンパイルを制御します(例: // +build linux)。しかし、go/build パッケージ(Goのビルドプロセスをプログラム的に扱うためのパッケージ)が、利用可能なすべてのビルドタグを簡単に列挙する手段を提供していなかった可能性があります。
    • 技術詳細: go/build.Package 構造体に AllTags フィールドが追加されました。このフィールドは、Goのビルドシステムが認識するすべてのビルドタグのリストを提供します。これにより、GoのツールやIDE、あるいはカスタムビルドスクリプトなどが、プロジェクト内のすべてのビルドタグをプログラム的に取得し、それに基づいてより高度な分析や操作(例: 特定のタグが有効な場合のコードパスの特定、タグの自動補完など)を実行できるようになります。
  • net/http: allow ReadResponse with nil *Request parameter (CL 9821043):

    • 背景: net/http.ReadResponse 関数は、HTTPレスポンスを読み取るために使用されます。通常、この関数は対応する *http.Request オブジェクトを引数として受け取ります。しかし、場合によっては、対応するリクエストオブジェクトが利用できない、あるいは不要なシナリオ(例: プロキシが受信したレスポンスを転送するが、元のリクエストは保持しない場合など)が存在します。
    • 技術詳細: この変更により、net/http.ReadResponse 関数が、*http.Request パラメータとして nil を受け入れるようになりました。これは、関数内部で nil リクエストが渡された場合の挙動が適切にハンドリングされるようになったことを意味します。具体的には、nil リクエストの場合でも、レスポンスの読み取りとパースが正しく行われるようになり、特にリクエストのメソッドやURLに依存しないレスポンス処理(例: ステータスコードやヘッダの読み取り)が可能になります。これにより、net/http パッケージの柔軟性が向上し、より多様なHTTP処理シナリオに対応できるようになります。
  • time: patterns require non-lowercase letter to follow Mon, Jan etc (CL 12448044):

    • 背景: Goの time パッケージの Parse および Format 関数は、特定の参照時刻(Mon Jan 2 15:04:05 MST 2006)に基づいて日付と時刻のフォーマットを定義します。この参照時刻の要素(例: MonJan)は、フォーマット文字列内で大文字と小文字を区別して使用されます。しかし、ユーザーが誤って monjan のように小文字で指定した場合の挙動が曖昧であったり、予期せぬ結果を招く可能性がありました。
    • 技術詳細: この変更は、time パッケージのフォーマットパターンにおいて、Mon, Jan などの参照時刻要素の後に続く文字が小文字でないことを要求するようになりました。これは、フォーマット文字列の解釈をより厳密にし、曖昧さを排除するためのものです。例えば、MondayMon と認識させるためには、Mon の後に続く文字が d のように小文字であってはならない、というルールが適用されます。これにより、開発者が意図しないフォーマットエラーを減らし、より堅牢な日付/時刻のパースとフォーマットが可能になります。
  • encoding/csv: always allow trailing commas (CL 12294043) (CL 11916045 からの更新):

    • 背景: CSV (Comma Separated Values) 形式は、データ交換によく使われますが、その仕様は厳密ではありません。特に、行の最後に余分なカンマがある場合の扱いは、実装によって異なることがあります。Goの encoding/csv パッケージは、CSVデータの読み書きを扱いますが、以前のバージョンでは末尾のカンマの扱いに一貫性がなかったか、特定のシナリオで問題があった可能性があります。
    • 技術詳細: この変更により、encoding/csv パッケージは、CSV行の末尾にカンマがあっても常にそれを許可するようになりました。これは、CSVリーダーが、例えば a,b,c, のような行を a, b, c, "" のように解釈するのではなく、a, b, c と解釈するか、あるいは末尾の空フィールドを許容するような挙動になったことを示唆しています。この変更は、CSVファイルの多様なバリエーションに対応し、より堅牢なCSVパースを可能にすることを目的としています。CL番号が更新されているのは、この機能に関する以前のCLが何らかの理由で置き換えられたか、修正されたことを示しています。

これらの変更は、Go 1.2がリリースされた2013年当時のGo言語の進化の方向性を示しており、特に標準ライブラリの機能強化、パフォーマンス改善、そしてより堅牢なAPI設計に重点が置かれていたことがわかります。

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

このコミット自体は、Goのソースコードではなく、Go 1.2のリリースノートファイルである doc/go1.2.txt のみを変更しています。

--- a/doc/go1.2.txt
+++ b/doc/go1.2.txt
@@ -9,30 +9,35 @@ package or cmd/xxx directory name, and ending in a CL number.
 Please keep the list sorted (as in sort.Strings of the lines).
 
 cmd/5a: removed support for R9/R10 (use m/g instead) (CL 9840043).
+cmd/5l: add MOVBS, MOVHS etc for sub-word moves (CL 12682043).
 cmd/cgo, cmd/go: support including C++ code with cgo (CL 8248043).
 cmd/gc: make missing package error fatal (CL 12677043).
 cmd/go: test coverage (CL 10413044).
 
+compress/bzip2: support concatenated files (CL 12387044).
 container/heap: added Fix (CL 12265043).
 container/list: added MoveBefore and MoveAfter (CL 12021044).
+crypto/cipher: AES-GCM mode (CL 12375043).\
 crypto/md5: Sum function to simplify hashing (CL10624044).\
 crypto/sha1: Sum function to simplify hashing (CL 10571043).\
 crypto/sha256: Sum256 and Sum224 functions to simplify hashing (CL 10629043).\
 crypto/sha512: Sum512 and Sum384 functions to simplify hashing (CL 10630043).\
 crypto/tls: add support for TLS 1.1. (CL 7872043).\
-encoding/csv: always allow trailing commas (CL 11916045).\
+encoding/csv: always allow trailing commas (CL 12294043)\
 encoding/json: accept but correct invalid UTF-8 in Marshal (CL 11211045).\
 encoding/xml: allow attributes stored in pointers to be marshaled (CL 8653047).\
 flag: add Getter interface (CL 10472043).\
 flag: export commandLine (now CommandLine) (CL 12587043).\
 fmt: indexed access to arguments in Printf etc. (CL 9680043).\
 go/build: support including C++ code with cgo (CL 8248043).\
+go/build: add Package.AllTags (CL 12703044).\
 image/draw: added Drawer, FloydSteinberg and the op.Draw method (CL 10977043).\
 image/draw: added Quantizer type (CL 11148043).\
 image/gif: added Encode and EncodeAll (CL 10896043).\
 io: Copy prioritizes WriterTo over ReaderFrom (CL 9462044).\
 ioutil: add WriteString to Discard (CL 12580045).\
 net: new build tag netgo for building a pure Go net package (CL 7100050).\
+net/http: allow ReadResponse with nil *Request parameter (CL 9821043).\
 runtime: allow SetFinalizer with a func(interface{}) (CL 11858043).\
 runtime: preemption of goroutines at function entry (CL 12371043).\
 sort: new Stable function provides stable sort (CL 9612044).\
@@ -40,4 +45,5 @@ strings: add IndexByte, for consistency with bytes package (CL 12214044).\
 syscall: implemented Sendfile for Darwin, added Syscall9 for Darwin/amd64 (CL 10980043).\
 testing: AllocsPerRun is now quantized to an integer (the type is still float64) (CL 9837049).\
 time: Allow Parse and Format to handle time zone offsets with seconds (CL 8132044)\
+time: patterns require non-lowercase letter to follow Mon, Jan etc (CL 12448044).\
 unicode: add In, a nicer-to-use but equivalent version of IsOneOf (CL 11672044).\

このdiffは、doc/go1.2.txt に追加された行(+ で始まる行)と削除された行(- で始まる行)を示しています。削除された行は、encoding/csv のエントリのCL番号が更新されたことによるものです。

コアとなるコードの解説

このコミット自体には、Go言語の機能的なコード変更は含まれていません。代わりに、Go 1.2リリースで導入された様々な機能変更や改善を文書化した doc/go1.2.txt ファイルの更新がその目的です。

したがって、「コアとなるコードの解説」は、このコミットが直接変更したコードではなく、このコミットで言及されている各CLがGoのコードベースにどのような影響を与えたか、という観点から行われます。上記の「技術的詳細」セクションで、各CLがGoの標準ライブラリやツールチェインに与えた影響について詳しく解説しています。

このコミットの「コア」は、Go 1.2のリリースノートを正確かつ最新の状態に保つという文書化のプロセスにあります。これは、Goユーザーが新しいバージョンにアップグレードする際に、どのような変更があったのかを把握するための重要な情報源となります。

関連リンク

  • Go 1.2 Release Notes (公式): このコミットが更新しているファイルが最終的に含まれるGo 1.2の公式リリースノートです。
  • Go Project on Gerrit: Go言語のすべてのCLがレビューされるシステムです。

参考にした情報源リンク

  • Go 1.2 Release Notes: https://go.dev/doc/go1.2
  • Gerrit Code Review: https://go-review.googlesource.com/
  • 各CLのGerritページ(Web検索で確認):
    • CL 12682043: cmd/5l: add MOVBS, MOVHS etc for sub-word moves
    • CL 12387044: compress/bzip2: support concatenated files
    • CL 12375043: crypto/cipher: AES-GCM mode
    • CL 12703044: go/build: add Package.AllTags
    • CL 9821043: net/http: allow ReadResponse with nil *Request parameter
    • CL 12448044: time: patterns require non-lowercase letter to follow Mon, Jan etc
    • CL 12294043: encoding/csv: always allow trailing commas
    • CL 11916045: encoding/csv: always allow trailing commas (旧CL)
  • Go言語のドキュメント(各パッケージの機能詳細について)
  • x86アセンブリ命令セットに関する一般的な知識
  • 暗号化モード(AES-GCMなど)に関する一般的な知識
  • CSV形式に関する一般的な知識
  • Goのビルドタグに関する一般的な知識
  • HTTPプロトコルに関する一般的な知識
  • Goのtimeパッケージのフォーマットに関する一般的な知識