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

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

このコミットは、Go言語の初期安定版であるGo 1のリリースノート(doc/go1.htmlおよびdoc/go1.tmpl)のドキュメント更新に関するものです。具体的には、regexpパッケージの変更点について言及を追加し、ドキュメント内のセクションのアルファベット順を修正しています。

コミット

commit cc7e11c91ebb9d30b260cf92e66e94f3217b45e6
Author: Rob Pike <r@golang.org>
Date:   Mon Feb 27 14:34:16 2012 +1100

    doc/go1: mention that regexp has changed
    Also restore alphabetical order.
    
    R=golang-dev, bradfitz
    CC=golang-dev
    https://golang.org/cl/5701053

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

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

元コミット内容

doc/go1: mention that regexp has changed Also restore alphabetical order.

このコミットは、Go 1のリリースドキュメントにおいて、regexpパッケージが変更されたことを明記し、同時にドキュメント内のセクションのアルファベット順を修正するものです。

変更の背景

Go言語は、その設計思想として「シンプルさ」と「効率性」を重視しています。Go 1のリリースは、言語仕様と標準ライブラリの安定化を目的とした重要なマイルストーンでした。この安定化の過程で、既存のパッケージの機能改善や最適化が行われることがあり、その変更はユーザーに明確に伝えられる必要があります。

このコミットの背景には、主に以下の2点があります。

  1. regexpパッケージの内部実装の変更と正規表現エンジンの切り替え: Goのregexpパッケージは、初期のバージョンでは「egrep」形式の正規表現をサポートしていましたが、Go 1のリリースに向けて、Googleが開発した高性能な正規表現エンジンであるRE2に置き換えられました。RE2は、線形時間でのマッチングを保証し、バックトラッキングによる指数関数的な遅延(ReDoS攻撃の可能性)を防ぐなど、安全性とパフォーマンスに優れています。この重要な変更は、既存の正規表現パターンがRE2の仕様に準拠しているか確認する必要があるため、ユーザーに注意を促す必要がありました。
  2. ドキュメントの整理と可読性の向上: リリースドキュメントは、ユーザーがGo 1への移行をスムーズに行うための重要な情報源です。ドキュメント内のセクションがアルファベット順に並んでいることは、特定の情報を探しやすくし、全体的な可読性を向上させます。このコミットでは、os/signalパッケージのセクションが誤った位置にあったため、正しいアルファベット順に移動させることで、ドキュメントの品質を維持しています。

これらの変更は、Go 1の安定性と使いやすさを確保し、開発者が新しいバージョンに円滑に移行できるようにするための、細部にわたる配慮の一環と言えます。

前提知識の解説

このコミットを理解するためには、以下の概念について基本的な知識があると役立ちます。

  • Go言語: Googleによって開発されたオープンソースのプログラミング言語。シンプルさ、効率性、並行処理のサポートが特徴です。
  • Go 1: Go言語の最初の安定版リリース。このバージョン以降、言語仕様と標準ライブラリの互換性が保証されるようになりました。
  • 正規表現 (Regular Expression): 文字列のパターンを記述するための強力なツール。テキスト検索、置換、検証などに広く用いられます。
  • regexpパッケージ (Go言語): Goの標準ライブラリに含まれる正規表現を扱うためのパッケージ。
  • egrep形式の正規表現: Unix系のツールegrepで使われる正規表現の構文。基本的な正規表現の機能に加え、+, ?, |などの拡張正規表現演算子をサポートします。
  • RE2: Googleが開発した正規表現エンジン。DFA(決定性有限オートマトン)ベースで、線形時間でのマッチングを保証し、バックトラッキングによる性能劣化がないのが特徴です。これにより、悪意のある正規表現パターンによるサービス拒否攻撃(ReDoS)を防ぐことができます。RE2は、POSIX正規表現やPerl互換正規表現とは異なり、一部の高度な機能(例: 後方参照)をサポートしませんが、その代わりに高い安全性と予測可能なパフォーマンスを提供します。
  • os/signalパッケージ (Go言語): Goの標準ライブラリに含まれる、OSシグナルを扱うためのパッケージ。プロセスがシグナル(例: SIGINTSIGHUP)を受信した際に、プログラム内でそれらを捕捉し、適切な処理を行うために使用されます。Go 1では、シグナルハンドリングのAPIがIncoming()からNotify()に変更され、より選択的なシグナル処理が可能になりました。
  • HTML/Templateファイル:
    • doc/go1.html: Go 1のリリースノートの最終的なHTMLドキュメント。
    • doc/go1.tmpl: Go 1のリリースノートを生成するためのテンプレートファイル。Goのドキュメントは通常、テンプレートから生成されます。

技術的詳細

このコミットの技術的な変更点は、主にGo 1のリリースドキュメント(doc/go1.htmldoc/go1.tmpl)の内容更新にあります。

  1. regexpパッケージの変更点の追加:

    • Go 1では、regexpパッケージの内部実装が大幅に刷新され、正規表現エンジンが従来の「egrep」形式からGoogleのRE2エンジンに切り替わりました。
    • この変更は、正規表現の構文とセマンティクスに微妙な違いをもたらす可能性があります。例えば、RE2は後方参照(backreferences)や一部のPerl互換の拡張機能をサポートしません。これにより、既存のGoコードで使われている正規表現パターンがRE2の仕様に合致しない場合、予期せぬ動作やエラーを引き起こす可能性があります。
    • ドキュメントには、この変更が明記され、ユーザーに対して「コードが使用する正規表現を手動で確認する必要がある」という注意喚起が追加されました。これは、Go 1への移行における潜在的な互換性の問題を開発者に事前に知らせるための重要な情報です。
  2. os/signalパッケージのドキュメントセクションの移動:

    • Go 1では、os/signalパッケージのAPIも変更されました。具体的には、すべての受信シグナルを返すIncoming()関数が廃止され、特定のシグナルを選択的にチャネルに通知するNotify()関数が導入されました。
    • このコミットの差分を見ると、os/signalパッケージに関する既存のドキュメントセクションが、ファイル内で以前の位置(path/filepathパッケージの後)から、アルファベット順で正しい位置(osパッケージの後に続く)に移動されています。
    • この移動は、ドキュメントの論理的な構造と可読性を向上させるためのものであり、内容自体に大きな変更はありませんが、ユーザーが情報を探しやすくなるという点で重要です。

これらの変更は、Go 1のリリースにおける互換性に関する重要な情報を提供し、ドキュメントの品質とメンテナンス性を向上させるためのものです。

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

このコミットで変更されたファイルは以下の2つです。

  • doc/go1.html
  • doc/go1.tmpl

これらのファイルは、Go 1のリリースノートのHTML版と、その生成元となるテンプレートファイルです。変更の差分は以下の通りです。

--- a/doc/go1.html
+++ b/doc/go1.html
@@ -1702,6 +1702,39 @@ Code that uses the old POSIX error values from the <code>os</code> package
 will fail to compile and will also need to be updated by hand.
 </p>
 
+<h3 id="os_signal">The os/signal package</h3>
+
+<p>
+The <code>os/signal</code> package in Go 1 replaces the
+<code>Incoming</code> function, which returned a channel
+that received all incoming signals,
+with the selective <code>Notify</code> function, which asks
+for delivery of specific signals on an existing channel.
+</p>
+
+<p>
+<em>Updating</em>:
+Code must be updated by hand.
+A literal translation of
+</p>
+<pre>
+c := signal.Incoming()
+</pre>
+<p>
+is
+</p>
+<pre>
+c := make(chan os.Signal)
+signal.Notify(c) // ask for all signals
+</pre>
+<p>
+but most code should list the specific signals it wants to handle instead:
+</p>
+<pre>
+c := make(chan os.Signal)
+signal.Notify(c, syscall.SIGHUP, syscall.SIGQUIT)
+</pre>
+
 <h3 id="path_filepath">The path/filepath package</h3>
 
 <p>
@@ -1747,38 +1780,19 @@ will need to be updated by hand.
 The compiler will catch code using the old interface.
 </p>
 
-<h3 id="os_signal">The os/signal package</h3>
+<h3 id="regexp">The regexp package</h3>
 
 <p>
-The <code>os/signal</code> package in Go 1 replaces the
-<code>Incoming</code> function, which returned a channel
-that received all incoming signals,
-with the selective <code>Notify</code> function, which asks
-for delivery of specific signals on an existing channel.
+The <a href="/pkg/regexp/"><code>regexp</code></a> package has been rewritten.
+It has the same interface but the specification of the regular expressions 
+it supports has changed from the old "egrep" form to that of
+<a href="code.google.com/p/re2">RE2</a>.
 </p>
 
 <p>
 <em>Updating</em>:
-Code must be updated by hand.
-A literal translation of
+Code that uses the package should have its regular expressions checked by hand.
 </p>
-<pre>
-c := signal.Incoming()
-</pre>
-<p>
-is
-</p>
-<pre>
-c := make(chan os.Signal)
-signal.Notify(c) // ask for all signals
-</pre>
-<p>
-but most code should list the specific signals it wants to handle instead:
-</p>
-<pre>
-c := make(chan os.Signal)
-signal.Notify(c, syscall.SIGHUP, syscall.SIGQUIT)
-</pre>
 
 <h3 id="runtime">The runtime package</h3>
 

doc/go1.tmplも同様の変更が加えられています。

コアとなるコードの解説

このコミットの「コード」は、Go言語のソースコードではなく、Go 1のリリースドキュメントのマークアップ(HTMLとテンプレート)です。

  1. os/signalセクションの移動:

    • 差分を見ると、os/signalパッケージに関する<h3>タグで始まるセクション全体が、元の位置(約1747行目あたり)から、より早い位置(約1702行目あたり)に移動していることがわかります。
    • これは、ドキュメント内のパッケージのセクションがアルファベット順に並ぶようにするための修正です。os/signalpath/filepathよりも前に来るべきであるため、この移動が行われました。移動されたセクションの内容自体は変更されていません。
  2. regexpセクションの追加と内容:

    • 元のos/signalセクションがあった位置に、新たにregexpパッケージに関するセクションが追加されています。
    • この新しいセクションでは、以下の重要な情報が提供されています。
      • regexpパッケージが「書き直された(rewritten)」こと。
      • インターフェースは同じだが、サポートする正規表現の仕様が「古い"egrep"形式からRE2に変更された」こと。
      • RE2へのリンク(code.google.com/p/re2)が提供されていること。
      • 更新に関する注意として、「パッケージを使用するコードは、正規表現を手動で確認する必要がある」と明記されていること。

この変更は、Go 1への移行を検討している開発者にとって非常に重要です。特に、正規表現は多くのアプリケーションで利用されるため、その挙動の変更は既存コードに影響を与える可能性があります。ドキュメントでこの変更を明確に伝えることで、開発者は事前に対応を計画し、互換性の問題を回避することができます。

関連リンク

  • Go言語公式サイト: https://go.dev/
  • Go 1リリースノート: Go 1のリリースノートは、このコミットで更新されているドキュメントの最終版として公開されています。
  • RE2プロジェクトページ: https://github.com/google/re2 (元のcode.google.com/p/re2はGitHubに移行しています)
  • Goのregexpパッケージドキュメント: https://pkg.go.dev/regexp

参考にした情報源リンク

  • Go 1 Release Notes (公式ドキュメント): このコミットが変更しているドキュメントそのものが主要な情報源です。
  • RE2の公式ドキュメントや関連する技術記事: RE2の特性やegrep形式との違いを理解するために参照しました。
  • Go言語の歴史に関する情報: Go 1の重要性や、初期のGo言語の設計に関する背景知識を得るために参照しました。
  • Goのos/signalパッケージの変更に関する情報: Go 1でのAPI変更の詳細を理解するために参照しました。