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

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

このコミットは、Go言語プロジェクトの週次開発レポート「weekly.2012-02-14」を公式ドキュメントに追加するものです。具体的には、doc/devel/weekly.htmlファイルに2012年2月14日時点での主要な変更点、APIの破壊的変更、バグ修正、新機能などが詳細に記述されたセクションが追加されています。また、.hgtagsファイルから古い週次タグのエントリが削除されています。これは、当時のGoプロジェクトが活発に開発されており、その進捗をコミュニティに定期的に共有するプロセスの一環として行われたものです。

コミット

  • Author: Andrew Gerrand adg@golang.org
  • Date: Wed Feb 15 14:15:33 2012 +1100
  • Commit Message:
    weekly.2012-02-14
    
    R=golang-dev, dsymonds, r, mikioh.mikioh
    CC=golang-dev
    https://golang.org/cl/5675055
    

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

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

元コミット内容

weekly.2012-02-14

R=golang-dev, dsymonds, r, mikioh.mikioh
CC=golang-dev
https://golang.org/cl/5675055
---
 .hgtags               |   1 -
 doc/devel/weekly.html | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 119 insertions(+), 1 deletion(-)

diff --git a/.hgtags b/.hgtags
index a70ce8cc13..1b5ef2e5e9 100644
--- a/.hgtags
+++ b/.hgtags
@@ -104,4 +104,3 @@ b4a91b6933748db1a7150c06a1b55ad506e52906 weekly.2011-11-18
 9f2be4fbbf690b9562c6e98b91daa0003f0913c7 weekly.2012-01-20
 1107a7d3cb075836387adfab5ce56d1b3e56637d weekly.2012-01-27
 52ba9506bd993663a0a033c2bd68699e25d061ab weekly.2012-02-07
-52ba9506bd993663a0a033c2bd68699e25d061ab weekly
diff --git a/doc/devel/weekly.html b/doc/devel/weekly.html
index 7196de4460..b79f63facd 100644
--- a/doc/devel/weekly.html
+++ b/doc/devel/weekly.html
@@ -14,6 +14,125 @@ hg pull
 hg update weekly.<i>YYYY-MM-DD</i>
 </pre>
 
+<h2 id="2012-02-14">2012-02-14</h2>
+
+<pre>
+This release includes some package changes that require changes to client code.
+
+The flate, gzip and zlib's NewWriterXxx functions no longer return an error.
+The compiler will flag all affected code which must then be updated by hand.
+
+The os package's Exec and Time functions were removed. Callers should use the
+os/exec package and time.Now instead. The ShellExpand function was renamed to
+ExpandEnv. The NewFile function now takes a uintptr.
+
+The runtime package's Type type and its methods have been removed.
+Use the reflect package instead.
+
+Other changes:
+* 8a, 8l: add LFENCE, MFENCE, SFENCE (thanks Darren Elwood).
+* all.bat: report error code back to the gobuilder (thanks Alex Brainman).
+* archive/zip: hide Write method from *Writer type.
+* build: create the correct $GOTOOLDIR,
+	get rid of deps.bash (thanks Anthony Martin),
+	reject make.bash on Windows.
+* builder: set $GOBUILDEXIT for Windows (thanks Alex Brainman),
+* bytes: add Reader,
+	return error in WriteTo if buffer is not drained.
+* cgo: add support for returning errno with gccgo (thanks Rémy Oudompheng).
+* cmd/api: follow constant references.
+* cmd/cgo: omit //line in -godefs, -cdefs output.
+* cmd/dist: fixes (thanks Alex Brainman, Gustavo Niemeyer, Mikio Hara, Shenghou Ma).
+* cmd/fix: warn about exp, old, deleted packages.
+* cmd/gc: suspend safemode during typecheck of inlined bodies.
+* cmd/go: a raft of fixes,
+	connect os.Stdin for go run and go tool,
+	go get scheme detection (thanks Daniel Krech),
+	respect test -timeout flag.
+* cmd/vet: warn for construct 'Println(os.Stderr, ...)' (thanks Shenghou Ma).
+* compress/gzip: remove dead code (thanks Alex Brainman).
+* container/heap: add example.
+* dashboard: add gobuilder -fail mode.
+* database/sql: more tests,
+	remove Into from ScannerInto/ScanInto,
+	rename ErrTransactionFinished to ErrTxDone,
+	support ErrSkip in Tx.Exec (thanks Andrew Balholm),
+	treat pointers as nullable types as with encoding/json (thanks Andrew Pritchard).
+* debug/macho: drop terrifyingly monstrous URL from package comment.
+* dist: prevent recusive loop on windows when fatal() is called (thanks Daniel Theophanes).
+* doc: add App Engine docs to 'learn' and 'reference' pages,
+	add playground.js,
+	new document about compatibility of releases,
+	update install.html for binary distros, add install-source.html.
+* effective_go: use new map deletion syntax.
+* encoding/binary: add Size, to replace the functionality of the old TotalSize,
+	another attempt to describe the type of Read and Write's data,
+	slices are allowed; say so.
+* encoding/json: document buffering.
+* encoding/xml: add support for the omitempty flag (thanks Gustavo Niemeyer).
+* exp/norm: merged charinfo and decomposition tables.
+* exp/types: use build.FindTree in GcImporter (thanks James Whitehead).
+* flate: delete WrongValueError type.
+* fmt: diagnose invalid verb applied to pointer,
+	scan FALSE correctly.
+* gc: bug fixes, better error messages.
+* go/doc: handle recursive embedded types (thanks Gary Burd),
+	don't lose exported consts/vars with unexported type,
+	treat predeclared error interface like an exported type.
+* go/printer: implement SourcePos mode.
+* godoc: list examples in index,
+	new design,
+	regard lone examples as "whole file" examples.
+* html/template: added more words about examples and doc (thanks Bjorn Tipling).
+* log/syslog: return length of data provided by the user, not length of header.
+* make.bat: remove double quotes (thanks Alex Brainman).
+* math: fix gamma doc, link to OEIS.
+* mime: unexport some internal details.
+* misc/dist: add binary distribution packaging script for linux,
+	new hierarchy for binary distribution packaging scripts.
+* net/http: add ServeContent,
+	don't spin on temporary accept failure,
+	fix client goroutine leak with persistent connections,
+	fix reference to URL.RawPath in docs (thanks Bjorn Tipling),
+	panic on duplicate registrations,
+	use mtime < t+1s to check for unmodified (thanks Hong Ruiqi).
+* net: avoid Shutdown during Close,
+	avoid TCP self-connect,
+	disable TestDialTimeout on Windows,
+	disable multicast test on Alpha GNU/Linux,
+	disable wild use of SO_REUSEPORT on BSD variants (thanks Mikio Hara),
+	enable flags on stream for multicast listeners (thanks Mikio Hara),
+	make use of listenerBacklog (thanks Mikio Hara),
+	prefer an IPv4 listen if no address given (thanks Mikio Hara).
+* os/exec: add Cmd.Waitmsg.
+* os/signal: revive this package.
+* regexp/syntax: add package and Parse commentary.
+* regexp: allow substitutions in Replace, ReplaceString.
+* runtime, pprof: add profiling of thread creation.
+* runtime, time: accelerate tests in short mode (thanks Rémy Oudompheng).
+* runtime: exit early on OABI systems (thanks Shenghou Ma),
+	drop to 32 bit malloc if 64 bit will not work,
+	fix "SysReserve returned unaligned address" bug on 32-bit systems (thanks Shenghou Ma),
+	fix grsec support (thanks Gustavo Niemeyer),
+	on 386, fix FP control word on all threads, not just initial thread,
+	put lockorder before pollorder in Select memory block,
+	use startpanic so that only one thread handles an incoming SIGQUIT.
+* spec: add forward links from 'method set' to where it gets used,
+	clarify implementation restrictions on untyped floats,
+	disallow recursive embedded interfaces,
+	method names must be unique,
+	send on closed channel counts as "proceeding",
+	strings are more slices than arrays.
+* strconv: handle very large inputs.
+* strings: add Seek and ReadAt methods to Reader.
+* sync/atomic: disable hammer pointer tests on wrong size system.
+* testing: let runtime catch the panic.
+* text/template: refer HTML users to html/template.
+* text/template/parse: deep Copy method for nodes.
+* time: clean up MarshalJSON, add RFC3339 method,
+	use "2006-01-02 15:04:05.999999999 -0700 MST" as String format.
+</pre>
+
 <h2 id="2012-02-07">2012-02-07</h2>
 
 <pre>

変更の背景

このコミットは、Go言語プロジェクトが当時定期的に行っていた週次開発レポートの更新です。Go言語は2012年当時、まだバージョン1.0のリリース前であり、言語仕様や標準ライブラリのAPIが活発に開発・変更されていました。このような状況下で、開発チームはコミュニティに対して、最新の変更点、新機能、バグ修正、そして特に重要なAPIの破壊的変更などを透明性高く共有する必要がありました。

doc/devel/weekly.htmlファイルは、これらの週次レポートを公開するための公式な場所として機能していました。このコミットは、2012年2月14日までの開発状況を反映した新しいレポートセクションをこのHTMLファイルに追加することで、Go言語の進化を記録し、開発者やユーザーが最新の変更に追従できるようにすることを目的としています。

.hgtagsファイルからのエントリ削除は、Goプロジェクトが当時Mercurialバージョン管理システムを使用していたことを示唆しています。weeklyという汎用的なタグが、日付付きのweekly.2012-02-07のような具体的なタグに置き換えられた後、古い汎用タグが不要になったため削除された可能性があります。これは、リリースやタグ付けの管理方法の整理の一環と考えられます。

前提知識の解説

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

Go言語の初期開発フェーズ

2012年当時、Go言語はGoogleによって開発が進められており、2009年に初めて公開されてから数年が経過していました。Go 1.0の安定版リリースは2012年3月28日であり、このコミットはその直前の時期にあたります。そのため、この時期のGo言語は、現在のような安定したAPIセットを持つ以前であり、言語仕様や標準ライブラリの設計が頻繁に見直され、破壊的変更も積極的に行われていました。これは、より良い設計を追求するための健全なプロセスでした。

Goの標準ライブラリとパッケージシステム

Go言語は、豊富な標準ライブラリを特徴としています。これらは、os(オペレーティングシステムとのインタラクション)、net/http(HTTPクライアントとサーバー)、time(時刻処理)、reflect(リフレクション)、compress/flate, compress/gzip, compress/zlib(圧縮/解凍)、database/sql(データベースアクセス)など、特定の機能を提供するパッケージに分割されています。これらのパッケージは、Goプログラムの基本的な構成要素となります。

Goのツールチェイン

Go言語には、開発を強力にサポートするコマンドラインツール群が付属しています。

  • goコマンド: ビルド、テスト、依存関係の管理(go get)、コードの実行(go run)など、Go開発の主要なインターフェースです。
  • cmd/gc: Goコンパイラ。Goソースコードを機械語に変換します。
  • cmd/vet: Goソースコードの静的解析ツール。潜在的なバグや疑わしい構造を検出します。
  • godoc: Goのソースコードからドキュメントを生成し、Webサーバーとして提供するツールです。

バージョン管理システム (MercurialとGit)

Goプロジェクトは、初期にはMercurial (Hg) を主要なバージョン管理システムとして使用していました。.hgtagsファイルはMercurialのタグ情報を格納するファイルです。後にGoプロジェクトはGitに移行しましたが、このコミットの時点ではMercurialの痕跡が残っていたことがわかります。

CPUのメモリバリア命令

コミット内容にLFENCE, MFENCE, SFENCEといった命令の追加が言及されています。これらはx86アーキテクチャにおけるメモリバリア命令であり、CPUの命令実行順序やメモリ操作の可視性を制御するために使用されます。並行処理において、複数のプロセッサコアが共有メモリにアクセスする際に、データの整合性を保証するために重要です。

技術的詳細

このコミットで追加された週次レポートには、当時のGo言語の進化を象徴する多岐にわたる技術的変更が記載されています。特に注目すべきは、APIの破壊的変更と、標準ライブラリの設計思想の成熟です。

主要なAPIの破壊的変更

  1. 圧縮関連パッケージのNewWriterXxx関数の変更:

    • compress/flate, compress/gzip, compress/zlibパッケージのNewWriterXxx関数(例: flate.NewWriter)が、これまでの(*Writer, error)という戻り値から*Writerのみを返すように変更されました。
    • 背景: 初期の実装では、ライターの初期化時にエラーが発生する可能性を考慮してerrorを返していましたが、設計の見直しにより、これらの関数は常に成功するか、パニックを引き起こすような状況でのみエラーが発生すると判断された可能性があります。これにより、呼び出し側のエラーハンドリングが簡素化されます。
    • 影響: 既存のコードでこれらの関数の戻り値にerrorを受け取るように記述されていた場合、コンパイルエラーが発生し、手動での修正が必要となります。
  2. osパッケージの機能分離とリネーム:

    • os.Execおよびos.Time関数が削除されました。
    • 背景: osパッケージはオペレーティングシステムとの基本的なインタラクションを提供しますが、より特定の機能(プロセスの実行や時刻の取得)は、それぞれos/execパッケージとtimeパッケージに分離・集約されるべきという設計思想に基づいています。これにより、パッケージの責務が明確化され、コードのモジュール性が向上します。
    • 代替: os.Execの代わりにos/execパッケージを、os.Timeの代わりにtime.Now()を使用するよう促されています。
    • os.ShellExpand関数がos.ExpandEnvにリネームされました。これは、関数の機能(環境変数の展開)をより正確に反映するための変更です。
    • os.NewFile関数がuintptrを引数に取るようになりました。これは、ファイルディスクリプタの型に関する変更で、より低レベルな操作への対応を示唆しています。
  3. runtimeパッケージのType型とreflectパッケージへの移行:

    • runtimeパッケージにあったType型とその関連メソッドが削除されました。
    • 背景: Goのリフレクション機能は、reflectパッケージに集約されるべきという設計方針が明確化されました。runtimeパッケージはGoランタイムの低レベルな機能を提供し、reflectパッケージはGoの型情報をプログラム実行時に検査・操作するための高レベルなAPIを提供します。
    • 代替: リフレクションを必要とするコードは、すべてreflectパッケージを使用するように変更する必要があります。

その他の注目すべき変更点

週次レポートには、上記以外にも多数の変更点が箇条書きで列挙されています。いくつかピックアップして解説します。

  • CPU命令の追加 (8a, 8l: LFENCE, MFENCE, SFENCE):

    • Goのコンパイラ(8aはARM 32-bit、8lはx86-64アーキテクチャを指すことが多い)に、メモリバリア命令が追加されました。これらは、マルチコアプロセッサ環境での並行処理において、メモリ操作の順序を保証し、キャッシュの一貫性を維持するために不可欠です。これにより、Goの並行処理モデル(goroutineとchannel)がより堅牢に動作するための基盤が強化されます。
  • bytesパッケージへのReader追加:

    • bytes.Reader型が追加されました。これは[]byteスライスをio.Reader, io.Seeker, io.ByteReaderインターフェースとして扱うための実装です。これにより、バイトスライスをファイルやネットワークストリームのように読み込むことが可能になり、I/O操作の柔軟性が向上します。
  • cgoにおけるerrnoサポート:

    • cgo(GoとC言語の相互運用機能)において、C関数呼び出し後のerrno(システムコールエラーコード)の取得がサポートされました。これにより、Cライブラリとの連携におけるエラーハンドリングがより正確に行えるようになります。
  • cmd/goの改善:

    • go getコマンドにおけるスキーム検出の改善(https://などのURLスキームの認識)。
    • go testコマンドにおける-timeoutフラグの尊重。テストが指定時間内に完了しない場合にタイムアウトするようになり、テストの信頼性が向上します。
  • cmd/vetの警告追加:

    • Println(os.Stderr, ...)のような構造に対する警告が追加されました。これは、fmt.Fprintln(os.Stderr, ...)のように、より慣用的な方法で標準エラー出力に書き込むことを推奨するためと考えられます。静的解析によるコード品質の向上に貢献します。
  • database/sqlのAPI洗練:

    • ScannerInto/ScanIntoからIntoが削除され、ErrTransactionFinishedErrTxDoneにリネームされるなど、APIの名称や構造がより明確で一貫性のあるものに改善されました。また、ポインタ型がencoding/jsonと同様にnullable型として扱われるようになり、データベースからのNULL値の扱いが容易になりました。
  • ドキュメントの拡充:

    • Google App Engineに関するドキュメントが追加され、Goがクラウド環境での開発にも適していることが示されました。
    • リリース間の互換性に関する新しいドキュメントが追加され、API変更の多い時期における開発者の混乱を軽減しようとする意図が見られます。
  • encoding/jsonencoding/xmlにおけるomitemptyフラグのサポート:

    • 構造体のフィールドタグにomitemptyを指定することで、そのフィールドがゼロ値(数値の0、文字列の""、スライスのnilなど)の場合にJSON/XML出力から省略されるようになりました。これにより、よりコンパクトで柔軟なシリアライズが可能になります。
  • net/httpの機能強化と安定性向上:

    • ServeContent関数の追加。これは、io.ReadSeekerインターフェースを実装するコンテンツをHTTPレスポンスとして効率的に提供するためのものです。
    • 一時的なaccept失敗時のスピン回避、クライアントgoroutineリークの修正、重複登録時のパニックなど、Webサーバーとしての堅牢性と性能が向上しています。
  • runtimeの性能と安定性向上:

    • スレッド作成のプロファイリング機能が追加され、Goアプリケーションの性能ボトルネックの特定に役立ちます。
    • 32ビットシステムでのメモリ管理バグの修正、grsecサポート、SIGQUITシグナルハンドリングの改善など、ランタイムの安定性と互換性が向上しています。
  • Go言語仕様 (spec) の明確化:

    • メソッドセット、型なし浮動小数点数、再帰的な埋め込みインターフェースの禁止、メソッド名のユニーク性、クローズされたチャネルへの送信の振る舞い、文字列とスライスの関係など、Go言語の仕様に関する記述がより詳細かつ明確になりました。これは、言語設計が成熟し、曖昧さを排除しようとする動きを示しています。

これらの変更は、Go言語が実用的なシステムプログラミング言語として成長していく過程で、性能、安定性、開発体験、そして言語設計の整合性を追求していたことを明確に示しています。

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

このコミットにおけるコアとなるコードの変更は、以下の2つのファイルに集中しています。

  1. doc/devel/weekly.html:

    • このファイルに、2012年2月14日付けの週次開発レポートの新しいセクションが追加されました。具体的には、<h2 id="2012-02-14">2012-02-14</h2>という見出しと、その下に<pre>タグで囲まれた詳細な変更点のリスト(119行の追加)が含まれています。これは、Goプロジェクトの進捗を文書化する主要な変更です。
  2. .hgtags:

    • このファイルから、52ba9506bd993663a0a033c2bd68699e25d061ab weeklyという1行が削除されました。これは、Mercurialバージョン管理システムにおけるタグ定義ファイルであり、weeklyという汎用的なタグが、より具体的な日付付きのタグに置き換えられたことを示唆しています。

コアとなるコードの解説

doc/devel/weekly.htmlへの変更は、Go言語の機能そのものを変更するものではなく、その開発状況を説明するドキュメントの更新です。追加されたHTMLブロックは、その週に行われたGo言語の様々なコンポーネント(標準ライブラリ、ツールチェイン、ランタイム、言語仕様など)に対する変更点を箇条書きでまとめたものです。

このHTMLスニペットは、以下のような構造を持っています。

<h2 id="2012-02-14">2012-02-14</h2>
<pre>
This release includes some package changes that require changes to client code.

The flate, gzip and zlib's NewWriterXxx functions no longer return an error.
The compiler will flag all affected code which must then be updated by hand.

The os package's Exec and Time functions were removed. Callers should use the
os/exec package and time.Now instead. The ShellExpand function was renamed to
ExpandEnv. The NewFile function now takes a uintptr.

The runtime package's Type type and its methods have been removed.
Use the reflect package instead.

Other changes:
* 8a, 8l: add LFENCE, MFENCE, SFENCE (thanks Darren Elwood).
* all.bat: report error code back to the gobuilder (thanks Alex Brainman).
... (以下、多数の変更点が続く)
</pre>
  • <h2 id="2012-02-14">2012-02-14</h2>: 週次レポートの新しいセクションの開始を示す見出しです。id属性は、ページ内リンクのターゲットとして機能します。
  • <pre>タグ: その週の変更点の詳細なリストを整形済みテキストとして表示するために使用されています。この中には、APIの破壊的変更に関する重要なアナウンスと、その他の多数の改善点やバグ修正が箇条書きで記述されています。

このドキュメントの更新は、Go言語の透明性の高い開発プロセスと、コミュニティへの情報共有の重要性を示しています。特に、Go 1.0リリース前のAPIが不安定な時期において、このような週次レポートは開発者が自身のコードを最新のGoバージョンに適合させる上で不可欠な情報源でした。

.hgtagsからの1行削除は、Mercurialのタグ管理の変更を示唆しています。52ba9506bd993663a0a033c2bd68699e25d061ab weeklyという行は、特定のコミットハッシュ(52ba9506bd993663a0a033c2bd68699e25d061ab)にweeklyというタグを付けていたことを意味します。このタグが削除されたのは、おそらくweekly.2012-02-07のような日付付きのタグが導入され、汎用的なweeklyタグが不要になったためと考えられます。これは、バージョン管理におけるタグ付け戦略の改善の一環です。

関連リンク

  • Go言語公式サイト: https://go.dev/
  • Go言語ブログ: https://go.dev/blog/
  • Go言語ドキュメント: https://go.dev/doc/
  • Go言語のChange List (CL) システム: Goプロジェクトでは、変更は通常、GerritベースのCLシステムを通じてレビューされます。コミットメッセージにあるhttps://golang.org/cl/5675055はこのCLへのリンクです。

参考にした情報源リンク

  • Go言語の公式ドキュメントおよびアーカイブされた週次レポート(当時の情報にアクセスするため)
  • Go言語のGitHubリポジトリのコミット履歴
  • Mercurialのドキュメント(.hgtagsファイルに関する情報)
  • x86アーキテクチャのメモリバリア命令に関する情報(LFENCE, MFENCE, SFENCE)
  • Go 1.0リリースに関する情報(APIの安定性に関する背景知識のため)
  • Go言語のパッケージ設計に関する一般的な情報