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

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

このコミットは、Go言語のAPI互換性チェック機構において、unicodeパッケージのVersion定数への変更をホワイトリストに追加するものです。これにより、ビルドが中断される問題が解消されました。

コミット

commit ac40fb44701c7a920310e18d22777196bdf8e581
Author: Brad Fitzpatrick <bradfitz@golang.org>
Date:   Tue Feb 18 13:38:47 2014 -0800

    api: whitelist change to unicode.Version
    
    Unbreaks the build.
    
    LGTM=r
    R=r
    CC=golang-codereviews
    https://golang.org/cl/65650043

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

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

元コミット内容

このコミットの目的は、api/except.txtファイルにpkg unicode, const Version = "6.2.0"という行を追加することです。これは、unicodeパッケージ内のVersion定数の値が"6.2.0"に変更されたことを、GoのAPI互換性チェック機構が許容するようにするためのものです。コミットメッセージには「Unbreaks the build.」とあり、この変更がビルドの失敗を解消したことが示されています。

変更の背景

Go言語の標準ライブラリは、後方互換性を非常に重視しています。新しいGoのバージョンがリリースされる際、既存のコードが引き続き動作するように、APIの変更は厳しく管理されます。Goプロジェクトでは、APIの変更を検出するためのツール(go tool apiなど)が存在し、これらはapi/go.txtというファイルに記録されたAPIシグネチャと比較されます。

unicodeパッケージは、Unicode標準のバージョンに依存しています。Unicode標準は定期的に更新され、それに伴いGoのunicodeパッケージも内部的に更新されることがあります。このコミットが行われた2014年2月時点では、Unicodeのバージョンが6.2.0に更新された可能性があります。

通常、定数の値の変更はAPIの破壊的変更とはみなされませんが、GoのAPI互換性チェックツールは、このような変更も検出することがあります。特に、api/go.txtに記録されているAPIシグネチャと実際のコードの間に不一致が生じた場合、ビルドが失敗する可能性があります。

このコミットの背景には、unicode.Version定数の値が"6.2.0"に更新されたことによって、Goのビルドプロセスが中断されたという問題があります。このビルド中断は、API互換性チェックツールがこの変更を「予期せぬ変更」としてフラグを立てたためと考えられます。

前提知識の解説

GoのAPI互換性

Go言語は、バージョン間の後方互換性を非常に重視しています。これは、Goのプログラムが新しいバージョンのGoコンパイラで再コンパイルされた場合でも、既存のAPIを使用している限り、変更なしで動作し続けることを意味します。この互換性を維持するために、GoプロジェクトではAPIの変更を厳密に管理しています。

GoのAPI互換性チェックは、主に以下のファイルとツールによって行われます。

  • api/go.txt: このファイルには、Goの標準ライブラリの公開APIの「スナップショット」が記録されています。これは、Goの各リリースにおけるAPIの基準となります。
  • go tool api: このツールは、現在のGoソースコードの公開APIを抽出し、api/go.txtの内容と比較します。もし、現在のAPIがapi/go.txtに記録されているAPIと互換性がない場合(例えば、公開関数のシグネチャが変更された、公開フィールドが削除されたなど)、エラーが報告されます。
  • api/except.txt: このファイルは、go tool apiによる互換性チェックにおいて、特定のAPI変更を「例外」として扱うためのホワイトリストです。通常、api/go.txtに記録されていないAPI変更はエラーとなりますが、api/except.txtに記述された変更は許容されます。これは、APIの破壊的変更ではないが、go tool apiが誤って破壊的変更と判断してしまうようなケースや、特定の理由で許容されるべき変更(例えば、内部的な定数の値の変更など)に対して使用されます。

Unicode標準とGoのunicodeパッケージ

Unicodeは、世界中の文字を統一的に扱うための文字コード標準です。Go言語の標準ライブラリには、Unicodeのプロパティや操作を扱うためのunicodeパッケージが含まれています。このパッケージは、特定のバージョンのUnicode標準に準拠しており、そのバージョン情報はunicode.Versionという公開定数で提供されています。

Unicode標準は定期的に新しいバージョンがリリースされ、新しい文字やプロパティが追加されます。Goのunicodeパッケージも、これらの更新に合わせて内部的にデータを更新することがあります。unicode.Version定数の値は、unicodeパッケージがサポートするUnicode標準のバージョンを示すため、Unicode標準の更新に伴ってこの定数の値も変更されることがあります。

技術的詳細

このコミットは、GoのビルドシステムにおけるAPI互換性チェックの挙動と、api/except.txtファイルの役割を明確に示しています。

Goのビルドプロセスでは、go tool apiコマンドが実行され、現在のGoソースコードの公開APIが、api/go.txtに記録されているAPIと比較されます。この比較は、Goのリリース間でAPIの破壊的変更がないことを保証するために行われます。

unicode.Versionconst(定数)であり、その値が変更されたとしても、通常はAPIの破壊的変更とはみなされません。しかし、go tool apiツールは、api/go.txtに記録されたAPIシグネチャと現在のコードの間に不一致がある場合、それをエラーとして報告するように設計されています。この場合、unicode.Versionの文字列値が"6.2.0"に更新されたことで、api/go.txtに記録されていた古い値との間に不一致が生じ、go tool apiがエラーを発生させ、結果としてビルドが中断されたと考えられます。

この問題を解決するために、開発者はapi/except.txtファイルに例外ルールを追加しました。api/except.txtは、go tool apiが特定のAPI変更を無視し、エラーとして報告しないようにするためのホワイトリストとして機能します。

追加された行 pkg unicode, const Version = "6.2.0" は、unicodeパッケージ内のVersionという名前の定数が"6.2.0"という値を持つことを、API互換性チェックの例外として明示的に許可しています。これにより、go tool apiはこの特定の変更をエラーとして扱わず、ビルドが正常に完了するようになります。

このアプローチは、APIの破壊的変更ではないが、ツールが誤ってフラグを立ててしまうようなケースにおいて、ビルドを「アンブレイク」するための標準的な手順です。これは、GoのAPI互換性保証の厳格さを維持しつつ、必要な内部変更を可能にするためのバランスの取れた方法と言えます。

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

変更はapi/except.txtファイルに対して行われました。

--- a/api/except.txt
+++ b/api/except.txt
@@ -318,3 +318,4 @@ pkg syscall (openbsd-amd64-cgo), type Statfs_t struct, F_spare [3]uint32
 pkg syscall (openbsd-amd64-cgo), type Statfs_t struct, Pad_cgo_1 [4]uint8
 pkg syscall (openbsd-amd64-cgo), type Timespec struct, Pad_cgo_0 [4]uint8
 pkg syscall (openbsd-amd64-cgo), type Timespec struct, Sec int32
+pkg unicode, const Version = "6.2.0"

コアとなるコードの解説

追加された行 pkg unicode, const Version = "6.2.0" は、api/except.txtの構文に従っています。

  • pkg unicode: このルールがunicodeパッケージに適用されることを示します。
  • const Version: unicodeパッケージ内のVersionという名前の定数に関するルールであることを示します。
  • = "6.2.0": Version定数の期待される値が"6.2.0"であることを示します。

この行がapi/except.txtに追加されることで、go tool apiは、unicode.Version定数の値が"6.2.0"である場合、それをAPI互換性違反とはみなさなくなります。これにより、unicodeパッケージがUnicode 6.2.0に更新されたことによるビルドエラーが解消され、Goのビルドが再び成功するようになりました。

この変更は、GoのAPI互換性チェックシステムが、厳密なAPIシグネチャの比較だけでなく、特定の許容される変更をホワイトリスト化する柔軟性を持っていることを示しています。

関連リンク

  • Go言語のAPI互換性に関する公式ドキュメントやブログ記事(当時のものがあれば)
  • go tool apiコマンドに関する情報
  • Goのunicodeパッケージに関するドキュメント

参考にした情報源リンク

  • Go言語の公式ドキュメント (特にAPI互換性に関するセクション)
  • Goのソースコードリポジトリ内のapi/except.txtおよびapi/go.txtファイル
  • Goのコミット履歴と関連するコードレビュー(https://golang.org/cl/65650043
  • Unicode Consortiumのウェブサイト (Unicode標準のバージョン情報)
  • Go言語のビルドシステムに関する一般的な知識