[インデックス 13919] ファイルの概要
このコミットは、Go言語の実験的なロケール照合パッケージ (exp/locale/collate
) の開発を支援するために、照合(Collation)の実装を比較・ベンチマークするための新しいコマンドラインツール colcmp
を導入します。このツールは、Go言語自身の照合器、ICU (International Components for Unicode)、およびmacOSのCoreFoundationフレームワークを使用した照合器の性能と正確性を評価するために設計されています。
コミット
commit 5e47b779905ce87faac1bea3b0774b50ddf1ceba
Author: Marcel van Lohuizen <mpvl@golang.org>
Date: Mon Sep 24 13:22:03 2012 +0900
exp/locale/collate/tools/colcmp: implementation of colcmp tool used for comparing
various implementation of collation. The tool provides commands for soring,
regressing one implementation against another, and benchmarking.
Currently it includes collation implementations for the Go collator, ICU,
and one using Darwin's CoreFoundation framework.
To avoid building this tool in the default build, the colcmp tag has been
added to all files. This allows other tools/colcmp in this directory (e.g. it may make
sense to move maketables here) to be put in this directory as well.
R=r, rsc, mpvl
CC=golang-dev
https://golang.org/cl/6496118
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/5e47b779905ce87faac1bea3b0774b50ddf1ceba
元コミット内容
exp/locale/collate/tools/colcmp: implementation of colcmp tool used for comparing
various implementation of collation. The tool provides commands for soring,
regressing one implementation against another, and benchmarking.
Currently it includes collation implementations for the Go collator, ICU,
and one using Darwin's CoreFoundation framework.
To avoid building this tool in the default build, the colcmp tag has been
added to all files. This allows other tools/colcmp in this directory (e.g. it may make
sense to move maketables here) to be put in this directory as well.
R=r, rsc, mpvl
CC=golang-dev
https://golang.org/cl/6496118
変更の背景
このコミットが行われた2012年当時、Go言語は国際化対応(i18n)の一環として、独自の照合(Collation)ライブラリである exp/locale/collate
パッケージの開発を進めていました。照合は、異なる言語やロケールにおいて文字列を正しい順序で並べ替えるための複雑なプロセスであり、その正確性と性能は非常に重要です。
Go言語の照合器が、既存の成熟した照合ライブラリ(例えば、Unicode標準に準拠し、多くのプラットフォームで利用されているICUライブラリや、macOSに組み込まれているCoreFoundationフレームワークの照合機能)と比較して、どの程度の性能を持ち、どれだけ正確に動作するかを検証する必要がありました。
colcmp
ツールは、この検証プロセスを自動化し、Go言語の照合器の品質を保証するための重要な手段として導入されました。具体的には、以下の目的がありました。
- 正確性の検証: 異なる照合器間で同じ文字列リストを照合し、結果が一致するかどうかを比較することで、Go言語の照合器がUnicode Collation Algorithm (UCA) やロケール固有のルールに正しく従っているかを確認する。
- 性能の評価: 大量の文字列を照合する際のGo言語の照合器の速度を、他の実装と比較してベンチマークする。これにより、性能ボトルネックを特定し、最適化の機会を見つける。
- 回帰テスト: 照合ロジックの変更が既存の動作に悪影響を与えないことを確認するため、定期的に回帰テストを実行する。
このツールは、Go言語の標準ライブラリに国際化機能を組み込む上で不可欠な品質保証メカニズムとして機能します。また、colcmp
ビルドタグを使用することで、この開発・テストツールが通常のGoアプリケーションビルドに含まれないように配慮されています。
前提知識の解説
照合 (Collation)
照合とは、特定の言語やロケールの規則に従って文字列を比較し、順序付けるプロセスです。これは単に文字のUnicodeコードポイントの数値順に並べることとは異なります。例えば、英語では大文字と小文字が同じ文字として扱われたり(case-insensitive)、アクセント記号付きの文字がアクセントなしの文字の後に来たり、特定の文字の組み合わせ(例: ドイツ語の "ß" と "ss")が等価と見なされたりします。日本語では、ひらがな、カタカナ、漢字の読み順や、濁点・半濁点の扱いなど、さらに複雑なルールが存在します。
照合は、データベースのソート、ファイルシステムの並べ替え、検索結果の表示など、多くのアプリケーションで正確な文字列順序が必要とされる場面で不可欠です。
Unicode Collation Algorithm (UCA)
UCAは、Unicode Consortiumによって定義された、多言語環境で文字列を正しく照合するための標準アルゴリズムです。UCAは、言語固有の照合ルールをカスタマイズするためのフレームワークを提供し、異なるプラットフォームやアプリケーション間で一貫した照合結果を保証することを目指しています。UCAは、文字列を比較可能な「照合キー(collation key)」に変換し、そのキーをバイナリ比較することで順序を決定します。
International Components for Unicode (ICU)
ICUは、Unicodeおよび国際化対応のためのC/C++およびJavaライブラリの成熟したセットです。IBMによって開発され、オープンソースとして提供されています。ICUは、Unicodeのテキスト処理、フォーマット、解析、そして特に照合において業界標準と見なされており、多くのオペレーティングシステム、ブラウザ、アプリケーションで利用されています。その照合機能はUCAに完全に準拠しており、非常に広範なロケールとカスタマイズオプションをサポートしています。
CoreFoundation Framework (Darwin/macOS)
CoreFoundationは、macOSおよびiOSの基盤となるC言語ベースのフレームワークです。データ管理、バンドル管理、ネットワーク、そして国際化機能など、多くの低レベルサービスを提供します。文字列の照合機能も含まれており、macOSアプリケーションは通常、このフレームワークの機能を利用して文字列のソートを行います。これはプラットフォーム固有の最適化が施されているため、性能面で優れている場合があります。
Go Build Tags
Go言語のビルドタグ(+build
ディレクティブ)は、ソースファイルが特定の条件を満たす場合にのみコンパイルされるように指定するためのメカニズムです。ファイルの先頭に // +build tagname
の形式で記述します。例えば、+build darwin
はmacOSでのみコンパイルされることを意味し、+build icu
はICUライブラリが利用可能な環境でのみコンパイルされることを意味します。
このコミットでは、+build colcmp
というカスタムタグが導入されています。これは、colcmp
ツールがGoの通常のビルドプロセスに含まれないようにするためのものです。このツールをビルドするには、go build -tags colcmp
のように明示的にタグを指定する必要があります。これにより、開発・テスト用のツールが本番環境のバイナリに誤って含まれることを防ぎ、また、特定の外部ライブラリ(ICUなど)への依存関係を分離することができます。
ベンチマークと回帰テスト
- ベンチマーク: ソフトウェアの性能を測定し、異なる実装やバージョン間で比較するプロセスです。
colcmp
ツールでは、照合キーの生成時間やソート時間を測定することで、各照合器の性能を評価します。 - 回帰テスト: ソフトウェアの変更(新機能の追加、バグ修正など)が、既存の機能に予期せぬ不具合(回帰バグ)を引き起こしていないことを確認するためのテストです。
colcmp
ツールでは、既知の正しい照合結果("gold standard")と比較することで、Go言語の照合器が変更後も正しく動作し続けることを保証します。特に、ランダムに生成された文字列ペアを比較する「モンキーテスト」は、予期せぬエッジケースを発見するのに有効です。
技術的詳細
colcmp
ツールは、Go言語で書かれたコマンドラインユーティリティであり、照合器の比較、ベンチマーク、回帰テストを行うための複数のサブコマンドを提供します。
ツールアーキテクチャ
colcmp
は、以下の主要なコンポーネントで構成されています。
-
Collator
インターフェース (col.go
):Key(s Input) []byte
: 与えられた入力文字列s
の照合キーを生成します。照合キーは、文字列の順序を決定するためにバイナリ比較可能なバイト列です。一部の照合器は照合キーをサポートしない場合があり、その場合はnil
を返します。Compare(a, b Input) int
: 2つの入力文字列a
とb
を比較し、a < b
なら-1
、a > b
なら1
、a == b
なら0
を返します。 このインターフェースにより、異なる照合実装を統一的に扱うことができます。
-
CollatorFactory
(col.go
):name
: 照合器の名前(例: "go", "icu", "osx")。makeFn
: 指定されたロケールに対してCollator
インスタンスを作成する関数。description
: 照合器の説明。 この構造体とAddFactory
関数を通じて、新しい照合実装をツールに登録するプラグインメカニズムが提供されます。
-
Input
構造体 (col.go
):index int
: 元のランダムな順序を復元するために使用されます。UTF8 []byte
: UTF-8エンコードされた入力文字列。UTF16 []uint16
: UTF-16エンコードされた入力文字列。key []byte
: 照合キー(ソートに使用)。 文字列データを複数のエンコーディング形式で保持することで、異なる照合器が要求する入力形式に対応します。
-
Test
構造体 (colcmp.go
):- 特定のロケールと照合器の組み合わせに対するテスト実行を管理します。
- 入力文字列の生成、照合キーの生成、ソート、および実行時間の計測を行います。
Sort()
メソッドは、照合キーを使用するか、直接比較関数を使用するかに応じてソートロジックを切り替えます。
-
Context
構造体 (colcmp.go
):- 複数の
Test
インスタンスとコマンドラインオプションから変換された設定を保持します。 - テスト間の入力文字列の再利用を管理し、効率的なテスト実行を可能にします。
- 複数の
-
phraseGenerator
(gen.go
):exemplarCharacters
(CLDRデータから生成された文字セット) を基に、テスト用の入力文字列を生成します。- ロケール固有の文字セット、文字の組み合わせ、Unicode正規化形式 (NFC)、および大文字・小文字のバリエーションを考慮して、現実的なテストデータを生成します。
- 生成された文字列はランダムに並べ替えられ、テストの網羅性を高めます。
コマンド
colcmp
ツールは、以下のサブコマンドを提供します。
sort <string>*
:- 与えられた文字列リストを、指定された照合器とロケールでソートし、結果を出力します。
- デバッグや特定の文字列の照合順序を確認するのに役立ちます。
bench
:- 指定された照合器の性能をベンチマークします。
- 照合キーの生成時間、ソート時間、および生成された照合キーの平均長を測定し、出力します。
cpuprofile
オプションでCPUプロファイルを生成することも可能です。
regress -gold=<col> -test=<col> [string]*
:- ランダムに生成された(または指定された)文字列セットを使用して、2つの照合器(テスト対象とゴールドスタンダード)の照合結果を比較し、不一致を報告します。
- Go言語の照合器がICUなどの確立された実装と一貫した結果を生成するかどうかを検証する「モンキーテスト」として機能します。
実装の詳細
chars.go
:exemplarCharacters
というマップが含まれており、これはUnicode CLDR (Common Locale Data Repository) から生成された、各ロケールにおける代表的な文字セットを定義しています。phraseGenerator
はこのデータを利用して、ロケールに特化したテスト文字列を生成します。これにより、単なるランダムな文字列ではなく、実際の言語で使われる文字や文字の組み合わせをテストできます。
col.go
:Collator
インターフェースの定義と、Go言語自身の照合器 (goCollator
) の実装が含まれます。goCollator
はexp/locale/collate.Collator
をラップし、Key
とCompare
メソッドを提供します。
colcmp.go
:colcmp
ツールのメインエントリポイント、コマンドライン引数のパース、コマンドのディスパッチロジックが含まれます。Test
構造体とContext
構造体は、テストのライフサイクル管理と結果の集計を担当します。- ソートアルゴリズムはGo標準ライブラリの
sort.Sort
を利用し、Test
構造体がsort.Interface
を実装することで、カスタムソートロジックを提供します。
darwin.go
:- macOS (Darwin) 環境でのみビルドされるCgoコードが含まれます (
+build darwin
タグ)。 - CoreFoundationフレームワークの
CFStringCompareWithOptionsAndLocale
関数を呼び出すことで、macOSネイティブの照合機能を利用します。 - UTF-8とUTF-16の両方の文字列形式に対応するラッパー (
osx8Collator
,osx16Collator
) を提供します。 - CoreFoundationは照合キーの概念を直接サポートしないため、
Key
メソッドはnil
を返します。
- macOS (Darwin) 環境でのみビルドされるCgoコードが含まれます (
icu.go
:- ICUライブラリが利用可能な環境でのみビルドされるCgoコードが含まれます (
+build icu
タグ)。 - ICUの
ucol_open
,ucol_getSortKey
,ucol_strcoll
などの関数を呼び出すことで、ICUの照合機能を利用します。 - UTF-8入力からUTF-16に変換してICUに渡す方法 (
icu16
) や、ICUのUTF-8イテレータを直接使用する方法 (icu8
) など、複数のICU利用パターンをテストできます。 - ICUは照合キーをサポートするため、
Key
メソッドはICUのucol_getSortKey
を呼び出して照合キーを生成します。
- ICUライブラリが利用可能な環境でのみビルドされるCgoコードが含まれます (
gen.go
:- テスト入力文字列の生成ロジックを実装しています。
parent
関数はロケールの階層構造を辿り、親ロケールの文字セットを継承するロジックを提供します。rewriter
は、生成された文字列の重複排除と、大文字・小文字のバリエーション生成を担当します。generate
関数は、exemplarCharacters
から取得した文字を組み合わせて、テスト用のフレーズを生成します。これにより、単一の文字だけでなく、複数の文字からなる単語やフレーズの照合もテストできます。
性能とデバッグ
colcmp.go
では、runtime/pprof
パッケージを使用してCPUプロファイリングをサポートしており、性能ボトルネックの特定に役立ちます。debug
およびverbose
フラグは、詳細な実行ログや中間結果の出力を制御し、デバッグを容易にします。
コアとなるコードの変更箇所
このコミットでは、src/pkg/exp/locale/collate/tools/colcmp/
ディレクトリ以下に以下の7つの新しいファイルが追加されました。これらはすべて colcmp
ツールの初期実装を構成するものです。
src/pkg/exp/locale/collate/tools/colcmp/Makefile
:chars.go
ファイルを生成するためのMakefile。src/pkg/exp/locale/collate/tools/colcmp/chars.go
: 各ロケールの代表的な文字セット(exemplar characters)のデータを含むGoソースファイル。これはmaketables
ツールによって生成されます。src/pkg/exp/locale/collate/tools/colcmp/col.go
: 照合器のインターフェース (Collator
) と、Go言語自身の照合器の実装 (goCollator
) を定義。src/pkg/exp/locale/collate/tools/colcmp/colcmp.go
:colcmp
ツールのメインロジック、コマンドライン引数処理、テスト実行フレームワーク、およびsort
,bench
,regress
コマンドの実装。src/pkg/exp/locale/collate/tools/colcmp/darwin.go
: macOSのCoreFoundationフレームワークを利用した照合器の実装(Cgoを使用)。+build darwin
タグによりmacOSでのみビルドされます。src/pkg/exp/locale/collate/tools/colcmp/gen.go
: テスト入力文字列を生成するためのロジック。ロケール固有の文字セットやUnicode正規化を考慮します。src/pkg/exp/locale/collate/tools/colcmp/icu.go
: ICUライブラリを利用した照合器の実装(Cgoを使用)。+build icu
タグによりICUが利用可能な環境でのみビルドされます。
コアとなるコードの解説
src/pkg/exp/locale/collate/tools/colcmp/col.go
このファイルは、照合器の抽象化とGo言語自身の照合器の実装を提供します。
// Collator is an interface for architecture-specific implementations of collation.
type Collator interface {
// Key generates a sort key for the given input. Implemenations
// may return nil if a collator does not support sort keys.
Key(s Input) []byte
// Compare returns -1 if a < b, 1 if a > b and 0 if a == b.
Compare(a, b Input) int
}
// Input holds an input string in both UTF-8 and UTF-16 format.
type Input struct {
index int // used for restoring to original random order
UTF8 []byte
UTF16 []uint16
key []byte // used for sorting
}
// goCollator is an implemention of Collator using go's own collator.
type goCollator struct {
c *collate.Collator
buf collate.Buffer
}
func newGoCollator(locale string) (Collator, error) {
c := &goCollator{c: collate.New(locale)}
return c, nil
}
func (c *goCollator) Key(b Input) []byte {
return c.c.Key(&c.buf, b.UTF8)
}
func (c *goCollator) Compare(a, b Input) int {
return c.c.Compare(&c.buf, a.UTF8, b.UTF8)
}
Collator
インターフェースは、照合器が提供すべき2つの主要な操作 (Key
とCompare
) を定義します。これにより、異なる照合実装(Go、ICU、CoreFoundation)が同じインターフェースを通じて利用可能になります。Input
構造体は、テスト対象の文字列をUTF-8とUTF-16の両方の形式で保持します。これは、一部の照合器(例: CoreFoundation)がUTF-16入力を好むためです。key
フィールドは、照合キーを格納するために使用されます。goCollator
は、Go言語のexp/locale/collate
パッケージの照合器をラップし、Collator
インターフェースを実装します。Key
メソッドとCompare
メソッドは、内部のGo照合器の対応するメソッドを呼び出します。
src/pkg/exp/locale/collate/tools/colcmp/colcmp.go
このファイルはツールのメインロジックを含みます。
// Test holds test data for testing a locale-collator pair.
type Test struct {
ctxt *Context
Name string
Locale string
ColName string
Col Collator
UseCompare bool
Input []Input
Duration time.Duration
start time.Time
msg string
count int
}
// Sort sorts the inputs. It generates sort keys if this is required by the
// chosen sort method.
func (t *Test) Sort() (tkey, tsort time.Duration, nkey, nsort int) {
// ... CPUプロファイリングの開始 ...
if t.UseCompare || t.Col.Key(t.Input[0]) == nil {
// 照合キーがサポートされていないか、比較モードが選択されている場合
t.Start(msgSorting)
sort.Sort(&testCompare{*t}) // Compareメソッドを使用
tsort, nsort = t.Stop()
} else {
// 照合キーがサポートされている場合
t.Start(msgGeneratingKeys)
t.generateKeys() // 照合キーを生成
t.count = len(t.Input)
tkey, nkey = t.Stop()
t.Start(msgSorting)
sort.Sort(t) // 照合キーでソート
tsort, nsort = t.Stop()
}
return
}
func (t *Test) Less(a, b int) bool {
t.count++
return bytes.Compare(t.Input[a].key, t.Input[b].key) == -1
}
type testCompare struct {
Test
}
func (t *testCompare) Less(a, b int) bool {
t.count++
return t.Col.Compare(t.Input[a], t.Input[b]) == -1
}
// runRegress function (simplified)
func runRegress(ctxt *Context, args []string) {
// ... 入力生成 ...
for i := 0; i < ctxt.Len(); i++ {
t := ctxt.Test(i)
// ... 入力生成またはパース ...
t.Sort() // テスト対象の照合器でソート
gold := getCollator(*gold, t.Locale) // ゴールドスタンダードの照合器を取得
for i := 1; i < len(t.Input); i++ {
ia := t.Input[i-1]
ib := t.Input[i]
// ... 除外文字のチェック ...
goldCmp := gold.Compare(ia, ib) // ゴールドスタンダードで比較
if cmp := bytes.Compare(ia.key, ib.key); cmp != goldCmp {
// 照合キーの比較結果がゴールドスタンダードと異なる場合
// ... エラー報告 ...
} else if cmp := t.Col.Compare(ia, ib); cmp != goldCmp {
// 直接比較の結果がゴールドスタンダードと異なる場合
// ... エラー報告 ...
}
}
// ... 不一致の報告 ...
}
}
Test
構造体は、個々のテスト実行の状態を管理します。Sort
メソッドは、照合キーの有無や設定に応じて、キーベースのソートと直接比較ベースのソートを切り替えます。Less
メソッドはsort.Interface
の一部であり、照合キーのバイナリ比較、またはCollator
インターフェースのCompare
メソッドを使用して文字列の順序を決定します。runRegress
関数は、回帰テストの核心部分です。テスト対象の照合器でソートされた文字列リストを、ゴールドスタンダードの照合器の比較結果と照合します。不一致が見つかった場合、詳細なエラーメッセージを出力します。これは、Go言語の照合器が期待通りに動作しているかを検証する上で非常に重要です。
src/pkg/exp/locale/collate/tools/colcmp/gen.go
このファイルはテスト入力文字列の生成を担当します。
// phraseGenerator generates inputs by combining all pairs of examplar strings.
type phraseGenerator struct {
sets [exN]exemplarySet
n int
}
func (g *phraseGenerator) init(locale string) {
// ... exemplarCharactersからロケールに応じた文字セットをロード ...
// ... rewriterを使って重複排除と大文字・小文字バリエーションの追加 ...
}
// generate generates inputs by combining all pairs of examplar strings.
func (g *phraseGenerator) generate(doNorm bool) []Input {
// ... 入力文字列のバッファ初期化 ...
addInput := func(str string) {
// ... 文字列をUTF-8とUTF-16形式でInputに追加 ...
if doNorm {
buf8 = norm.NFC.AppendString(buf8, str) // NFC正規化
} else {
buf8 = append(buf8, str...)
}
// ... UTF-16変換 ...
}
for i := 0; i < g.n; i++ {
p1 := g.phrase(i)
addInput(p1) // 単一のフレーズを追加
for j := 0; j < g.n; j++ {
p2 := g.phrase(j)
addInput(p1 + p2) // 2つのフレーズの組み合わせを追加
}
}
// ... ランダムな順序に並べ替え ...
return a
}
phraseGenerator
は、chars.go
で定義されたexemplarCharacters
を利用して、ロケールに特化したテスト文字列を生成します。init
メソッドでは、指定されたロケールとその親ロケールから文字セットをロードし、rewriter
を使って大文字・小文字のバリエーションを追加したり、重複を排除したりします。generate
メソッドは、これらの文字セットから単一のフレーズや、2つのフレーズを組み合わせた文字列を生成します。doNorm
フラグがtrue
の場合、Unicode正規化形式NFCに変換されます。これにより、正規化の有無による照合結果の違いもテストできます。生成された文字列はランダムに並べ替えられ、テストの網羅性を高めます。
src/pkg/exp/locale/collate/tools/colcmp/darwin.go
macOSネイティブの照合機能を利用するためのCgoバインディングです。
// +build darwin
package main
/*
#cgo LDFLAGS: -framework CoreFoundation
#include <CoreFoundation/CFBase.h>
#include <CoreFoundation/CoreFoundation.h>
*/
import "C"
import (
"unsafe"
)
// osxCollator implements an Collator based on OS X's CoreFoundation.
type osxCollator struct {
loc C.CFLocaleRef
opt C.CFStringCompareFlags
}
func (c osx16Collator) Compare(a, b Input) int {
// C.CFStringCreateWithCharactersNoCopy でUTF-16文字列からCFStringを作成
// C.CFStringCompareWithOptionsAndLocale で比較
}
func (c osx8Collator) Compare(a, b Input) int {
// C.CFStringCreateWithBytesNoCopy でUTF-8文字列からCFStringを作成
// C.CFStringCompareWithOptionsAndLocale で比較
}
func (c osxCollator) Key(s Input) []byte {
return nil // sort keys not supported by OS X CoreFoundation
}
+build darwin
ディレクティブにより、このファイルはmacOS環境でのみコンパイルされます。- Cgoを使用してCoreFoundationフレームワークの関数を呼び出します。特に
CFStringCompareWithOptionsAndLocale
は、ロケールとオプションを指定して文字列を比較するCoreFoundationの主要な照合関数です。 osx16Collator
とosx8Collator
は、それぞれUTF-16とUTF-8の入力文字列をCoreFoundationのAPIに渡すためのラッパーを提供します。- CoreFoundationは照合キーの概念を直接サポートしないため、
Key
メソッドはnil
を返します。
src/pkg/exp/locale/collate/tools/colcmp/icu.go
ICUライブラリの照合機能を利用するためのCgoバインディングです。
// +build icu
package main
/*
#cgo LDFLAGS: -licui18n -licuuc
#include <stdlib.h>
#include <unicode/ucol.h>
#include <unicode/uiter.h>
#include <unicode/utypes.h>
*/
import "C"
import (
"fmt"
"log"
"unicode/utf16"
"unicode/utf8"
"unsafe"
)
// icuCollator implements a Collator based on ICU.
type icuCollator struct {
loc *C.char
col *C.UCollator
keyBuf []byte
}
func (c *icuCollator) init(locale string) error {
// C.ucol_open でUCollatorインスタンスを開く
}
func (c *icuCollator) Key(s Input) []byte {
// C.ucol_getSortKey で照合キーを生成
}
func (c *icuCollator) Compare(a, b Input) int {
// C.ucol_strcoll で文字列を比較
}
+build icu
ディレクティブにより、このファイルはICUライブラリが利用可能な環境でのみコンパイルされます。- Cgoを使用してICUライブラリの関数を呼び出します。
ucol_open
で照合器インスタンスを開き、ucol_getSortKey
で照合キーを生成し、ucol_strcoll
で文字列を比較します。 - ICUは照合キーをサポートするため、
Key
メソッドはICUのAPIを呼び出して照合キーを生成します。これにより、ICUの照合キー生成性能もベンチマークできます。
これらのファイル群が連携することで、Go言語の照合器の性能と正確性を、業界標準のICUやプラットフォームネイティブなCoreFoundationと比較し、検証するための包括的なツールが実現されています。
関連リンク
- Go言語の
exp/locale/collate
パッケージ (当時の実験的なパッケージ): https://pkg.go.dev/exp/locale/collate (現在はgolang.org/x/text/collate
に移行) - Unicode Collation Algorithm (UCA): https://unicode.org/reports/tr10/
- International Components for Unicode (ICU) プロジェクト: https://icu.unicode.org/
- Apple Core Foundation Framework Reference: https://developer.apple.com/documentation/corefoundation
参考にした情報源リンク
- GitHub上のコミットページ: https://github.com/golang/go/commit/5e47b779905ce87faac1bea3b0774b50ddf1ceba
- Go Code Review (Gerrit) の変更リスト: https://golang.org/cl/6496118 (コミットメッセージに記載)