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

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

このコミットは、Go言語の実験的なパッケージ exp/norm を削除するものです。このパッケージはUnicode正規化機能を提供していましたが、go.text パッケージへの機能移行の一環として削除されました。

コミット

commit d07978a0f7ddfc1eb9b7434e06328987145313da
Author: Rob Pike <r@golang.org>
Date:   Wed Mar 6 14:34:03 2013 -0800

    exp/norm: delete, part of moving to go.text
    See also https://golang.org/cl/7520044
    
    R=golang-dev, rsc
    CC=golang-dev
    https://golang.org/cl/7533044

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

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

元コミット内容

このコミットは、src/pkg/exp/norm ディレクトリとその配下の全てのファイルを削除します。削除されたファイルには、Unicode正規化のアルゴリズム、データテーブル、テスト、およびテーブル生成スクリプトなどが含まれていました。

変更の背景

この変更の背景には、Go言語の標準ライブラリにおけるUnicodeサポートの進化があります。元々 exp/norm パッケージは、Unicode文字列の正規化(NFC, NFD, NFKC, NFKD形式への変換)を実験的に提供していました。しかし、Go言語のUnicode関連機能は golang.org/x/text リポジトリ(特に golang.org/x/text/unicode/norm)に集約され、より包括的でメンテナンス性の高い形で提供されることになりました。

このコミットは、実験的な exp/norm パッケージの役割が golang.org/x/text に引き継がれたため、重複するコードベースを整理し、将来的な混乱を避ける目的で削除されました。コミットメッセージにある https://golang.org/cl/7520044 は、この削除に関連する変更リスト(Change List)を示しており、go.text への移行プロセスの一部であることが示唆されています。

前提知識の解説

Unicode正規化 (Unicode Normalization)

Unicode正規化とは、異なるバイト列で表現されながらも、視覚的・意味的に同じ文字として扱われる可能性のある文字列を、一貫した形式に変換するプロセスです。これは、検索、ソート、比較などのテキスト処理において非常に重要です。

Unicodeには、以下のような複数の正規化形式があります。

  • NFC (Normalization Form Canonical Composition): 正準等価な文字を可能な限り合成した形式。例えば、a + ◌́ (結合アキュートアクセント) は á (合成済みアキュートアクセント付きa) に変換されます。
  • NFD (Normalization Form Canonical Decomposition): 正準等価な文字を可能な限り分解した形式。NFCの逆で、áa + ◌́ に分解されます。
  • NFKC (Normalization Form Compatibility Composition): 互換等価な文字も合成した形式。例えば、全角数字の は半角数字の 1 に変換され、さらに結合文字と合成されます。
  • NFKD (Normalization Form Compatibility Decomposition): 互換等価な文字も分解した形式。NFKCの逆で、1 に分解されます。

これらの正規化は、文字のプロパティ(結合クラス、分解マッピングなど)に基づいて行われます。

Go言語の exp パッケージ

Go言語の標準ライブラリには、exp (experimental) というプレフィックスを持つパッケージが存在することがあります。これらは、将来的に標準ライブラリに取り込まれる可能性のある、あるいは実験的な機能を提供するパッケージです。exp パッケージは、安定性やAPIの互換性が保証されないことが多く、開発の途上にある機能が提供されます。

golang.org/x/text

golang.org/x/text は、Go言語のUnicodeおよびテキスト処理に関する拡張パッケージ群を提供するリポジトリです。標準ライブラリには含まれないが、Goチームによって開発・メンテナンスされており、より高度なテキスト処理機能(国際化、ローカライゼーション、エンコーディング変換、Unicode正規化など)を提供します。golang.org/x/text/unicode/norm パッケージは、このリポジトリ内でUnicode正規化機能を提供しています。

技術的詳細

このコミットは、src/pkg/exp/norm パッケージの完全な削除を伴います。このパッケージは、Go言語でUnicode正規化を行うための初期の実装でした。削除されたファイル群を見ると、以下のような機能が含まれていたことがわかります。

  • composition.go, normalize.go: Unicode正規化の主要なアルゴリズム(分解と合成)の実装。
  • tables.go, forminfo.go, trie.go: Unicodeの文字プロパティ、結合クラス、分解マッピングなどのデータテーブルとそのルックアップ構造(Trie)の定義と管理。これらのデータはUnicode Consortiumから提供されるUCD (Unicode Character Database) に基づいています。
  • maketables.go, maketesttables.go, triegen.go: UCDから正規化に必要なデータ(結合クラス、分解マッピング、クイックチェック情報など)を抽出し、Goのコードとして生成するためのツール。
  • iter.go: 正規化された文字列を効率的にイテレートするためのインターフェースと実装。
  • *_test.go ファイル群: 各機能の単体テスト。

このパッケージの削除は、go.text リポジトリへの機能移行が完了し、exp/norm がその役割を終えたことを意味します。これにより、Go言語のUnicode正規化機能は、より専門的でメンテナンスされた golang.org/x/text/unicode/norm パッケージに一本化され、Goエコシステム全体の整合性が向上しました。

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

このコミットにおけるコアとなるコードの変更は、src/pkg/exp/norm ディレクトリ配下の全てのファイルの削除です。

具体的には、以下の21ファイルが削除されています。

  • src/pkg/exp/norm/Makefile
  • src/pkg/exp/norm/composition.go
  • src/pkg/exp/norm/composition_test.go
  • src/pkg/exp/norm/example_iter_test.go
  • src/pkg/exp/norm/forminfo.go
  • src/pkg/exp/norm/input.go
  • src/pkg/exp/norm/iter.go
  • src/pkg/exp/norm/iter_test.go
  • src/pkg/exp/norm/maketables.go
  • src/pkg/exp/norm/maketesttables.go
  • src/pkg/exp/norm/norm_test.go
  • src/pkg/exp/norm/normalize.go
  • src/pkg/exp/norm/normalize_test.go
  • src/pkg/exp/norm/normregtest.go
  • src/pkg/exp/norm/readwriter.go
  • src/pkg/exp/norm/readwriter_test.go
  • src/pkg/exp/norm/tables.go
  • src/pkg/exp/norm/trie.go
  • src/pkg/exp/norm/trie_test.go
  • src/pkg/exp/norm/triedata_test.go
  • src/pkg/exp/norm/triegen.go

これらのファイルは、合計で11832行のコードが削除されています。

コアとなるコードの解説

このコミットは、特定のコード行を変更するのではなく、パッケージ全体を削除するという性質を持っています。したがって、「コアとなるコードの解説」は、削除されたパッケージが提供していた機能と、その削除がGo言語のUnicode正規化に与える影響に焦点を当てます。

src/pkg/exp/norm パッケージは、Unicode正規化の複雑なロジックと大量のデータテーブルをGo言語で実装していました。これには、以下のような主要なコンポーネントが含まれていました。

  1. 正規化アルゴリズム: Unicode標準で定義されているNFC、NFD、NFKC、NFKDの各正規化形式への変換アルゴリズムが実装されていました。これには、文字の分解(Decomposition)と合成(Composition)のプロセスが含まれます。
  2. Unicodeデータテーブル: 各Unicodeコードポイントの正規化プロパティ(正準結合クラス (Canonical Combining Class, CCC)、分解マッピング、クイックチェック情報など)を格納する巨大なデータテーブルが含まれていました。これらのテーブルは、効率的なルックアップのためにTrieデータ構造などを用いて最適化されていました。
  3. データ生成ツール: Unicode Character Database (UCD) から生データを読み込み、Go言語のソースコードとして正規化データテーブルを生成するツールが含まれていました。これにより、Unicodeのバージョンアップに対応して正規化データを更新することが可能でした。

このパッケージの削除により、Go言語のコアリポジトリからはUnicode正規化の直接的な実装がなくなりました。代わりに、ユーザーは golang.org/x/text/unicode/norm パッケージをインポートして使用することが推奨されます。この移行は、Goの標準ライブラリをよりスリムに保ちつつ、Unicodeのような複雑な国際化関連の機能を専門の外部パッケージで管理するというGoチームの戦略を反映しています。これにより、Unicode標準の変更への対応や、より高度なテキスト処理機能の開発が、コアライブラリのリリースサイクルに縛られずに進められるようになります。

関連リンク

参考にした情報源リンク

  • Unicode Standard Annex #15: Unicode Normalization Forms: https://www.unicode.org/reports/tr15/
  • Go Wiki - Text: https://go.dev/wiki/Text
  • Go言語のUnicode正規化について (Qiita記事など): Web検索で「Go言語 Unicode 正規化」などで検索すると、golang.org/x/text/unicode/norm の使い方やUnicode正規化の概念について解説している記事が見つかります。