[インデックス 10108] ファイルの概要
このコミットは、Go言語におけるrune
型の導入に関する週次レポートの更新です。特に、Unicodeコードポイントを扱うための新しい型としてrune
が導入されたこと、および将来的なint32
への変更に向けた互換性維持の指針が説明されています。
コミット
commit 659f1f208af02a3dd5cc13da0d4f8756a3cc5369
Author: Andrew Gerrand <adg@golang.org>
Date: Wed Oct 26 14:47:38 2011 +0900
weekly.2011-10-26 (new rune type)
R=rsc
CC=golang-dev
https://golang.org/cl/5297062
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/659f1f208af02a3dd5cc13da0d4f8756a3cc5369
元コミット内容
weekly.2011-10-26 (new rune type)
R=rsc
CC=golang-dev
https://golang.org/cl/5297062
変更の背景
このコミットは、Go言語の週次開発レポート(weekly.html
)を更新し、rune
型の導入について開発者コミュニティに通知するものです。Go言語は当初からUnicodeを意識した設計がされていましたが、文字列のイテレーションや文字の操作において、バイト単位ではなくUnicodeコードポイント単位で扱うための明確な型が必要とされていました。
従来のGo言語では、文字列はUTF-8エンコードされたバイト列として扱われ、個々の文字(コードポイント)を扱う際にはint
型が使われることが一般的でした。しかし、int
型はプラットフォームによってサイズが異なる可能性があり(32ビットまたは64ビット)、Unicodeコードポイントの最大値(U+10FFFF)を確実に表現するためには、少なくとも21ビットが必要となります。将来的な互換性や明確性を考慮し、Unicodeコードポイントを表現するための専用の型としてrune
が導入されることになりました。
この変更の主な目的は以下の通りです。
- Unicodeコードポイントの明確な表現:
rune
型を導入することで、コードの意図がより明確になり、開発者がUnicodeコードポイントを扱っていることを認識しやすくなります。 - 将来的な型サイズの変更への対応: 当初
rune
はint
のエイリアスとして導入されましたが、Go 1リリース後にはint32
のエイリアスに変更される計画がありました。この変更は、rune
が常に32ビット幅であることを保証し、Unicodeコードポイントを確実に格納できるようにするためです。開発者には、この将来の変更に備えてrune
を積極的に使用することが推奨されました。 - コードの互換性維持:
rune
を早期に導入し、開発者にその使用を促すことで、将来的にrune
がint32
に変更された際にも、既存のコードが大きな変更なしに動作するようにするための準備期間を提供しました。
前提知識の解説
Unicodeとコードポイント
- Unicode: 世界中の文字をコンピュータで扱えるようにするための文字コードの国際標準です。様々な言語の文字、記号、絵文字などを統一的に表現できます。
- コードポイント (Code Point): Unicodeにおける個々の文字や記号に割り当てられた一意の数値です。例えば、
'A'
のコードポイントはU+0041、'あ'
のコードポイントはU+3042です。コードポイントは通常、U+XXXX
の形式で表記されます。Unicodeのコードポイントの範囲はU+0000からU+10FFFFまでです。
Go言語の型システムとint
, int32
int
型: Go言語のint
型は、プラットフォームに依存する整数型です。32ビットシステムでは32ビット幅、64ビットシステムでは64ビット幅になります。この可変性が、Unicodeコードポイントを扱う上で問題となる可能性がありました。int32
型: Go言語のint32
型は、常に32ビット幅の符号付き整数型です。Unicodeコードポイントの最大値U+10FFFFは21ビットで表現できるため、32ビット幅のint32
であれば十分に格納できます。
GOEXPERIMENT
環境変数
GOEXPERIMENT
は、Go言語の実験的な機能や将来の変更を、開発者が早期に試すための環境変数です。このコミットの文脈では、GOEXPERIMENT=rune32
を設定することで、rune
型がint
ではなくint32
のエイリアスとしてコンパイルされるようになり、将来の変更がコードに与える影響を事前に検証できるようになります。
govet
ツール
govet
は、Go言語のソースコードを静的に解析し、疑わしい構成や潜在的なバグを報告するツールです。このコミットの文脈では、rune
型の導入に伴い、メソッドのシグネチャ(特に文字を扱う引数や戻り値の型)が適切に更新されているかを確認するためにgovet
の実行が推奨されています。
技術的詳細
このコミットで言及されているrune
型の導入は、Go言語がUnicodeをより堅牢に、かつ意図的に扱うための重要なステップでした。
rune
型の定義:rune
は、Go言語の組み込み型であり、Unicodeコードポイントを表すために使用されます。このコミットが作成された時点では、rune
はint
のエイリアスとして定義されていました。これは、当時のGoのコンパイラやランタイムがint
を効率的に扱えるようにするための一時的な措置でした。- 将来の変更計画: Go 1リリース後には、
rune
がint32
のエイリアスに変更されることが明確に計画されていました。この変更は、rune
が常に32ビット幅であることを保証し、Unicodeコードポイントの全範囲を確実に表現できるようにするためです。これにより、異なるプラットフォーム間でのrune
型の挙動の一貫性が保たれます。 - 互換性への配慮: 開発者に対しては、この将来の変更に備えて、Unicodeコードポイントを扱う際には
int
ではなくrune
を積極的に使用することが推奨されました。これにより、Go 1リリース後のrune
の型定義変更時にも、既存のコードが「rune safety」を保ち、再コンパイルするだけで動作するように設計されていました。 - 検証方法:
GOEXPERIMENT=rune32 ./all.bash
コマンドは、rune
がint32
として扱われるコンパイラをビルドし、コードが将来の変更に対応できるかを確認するためのメカニズムを提供しました。これにより、開発者は実際の環境でrune
がint32
になった場合の挙動をテストできました。govet
の実行は、rune
型の導入によって影響を受ける可能性のあるメソッドシグネチャの変更を特定し、適切な修正を促すための推奨事項でした。例えば、文字をint
で受け取っていた関数が、rune
で受け取るように変更する必要がある場合などです。
このアプローチにより、Go言語はUnicodeサポートを強化しつつ、既存のコードベースとの互換性を最大限に維持しようとしました。
コアとなるコードの変更箇所
このコミットにおける主要な変更は、Go言語の週次開発レポートを更新するdoc/devel/weekly.html
ファイルにあります。
-
.hgtags
の変更:--- a/.hgtags +++ b/.hgtags @@ -89,4 +89,3 @@ c1702f36df0397c19fc333571a771666029aa37e release acaddf1cea75c059d19b20dbef35b20fb3f38954 release.r58.2 6d7136d74b656ba6e1194853a9486375005227ef weekly.2011-10-18 941b8015061a0f6480954821dd589c60dfe35ed1 weekly.2011-10-25 -941b8015061a0f6480954821dd589c60dfe35ed1 weekly
この変更は、
weekly
というタグが重複していたため、古いエントリを削除したものです。これは本質的な機能変更とは関係ありません。 -
doc/devel/weekly.html
の変更:--- a/doc/devel/weekly.html +++ b/doc/devel/weekly.html @@ -14,6 +14,26 @@ hg pull hg update weekly.<i>YYYY-MM-DD</i> </pre> +<h2 id="2011-10-26">2011-10-26 (new rune type)</h2> + +<pre> +This snapshot introduces the rune type, an alias for int that +should be used for Unicode code points. + +A future release of Go (after Go 1) will change rune to be an +alias for int32 instead of int. Using rune consistently is the way +to make your code build both before and after this change. + +To test your code for rune safety, you can rebuild the Go tree with + +\tGOEXPERIMENT=rune32 ./all.bash +\n +which builds a compiler in which rune is an alias for int32 instead of int. +\n +Also, run govet on your code to identify methods that might need to have their +signatures updated. +</pre> +\n <h2 id="2011-10-25">2011-10-25</h2> <pre>
この変更がこのコミットの核心であり、
2011-10-26
の日付で新しいセクションが追加され、rune
型の導入とその詳細が説明されています。
コアとなるコードの解説
doc/devel/weekly.html
に追加されたセクションは、Go開発者にとって非常に重要な情報を提供しています。
rune
型の紹介: 「This snapshot introduces the rune type, an alias for int that should be used for Unicode code points.」と明記されており、rune
がUnicodeコードポイントのための型であり、現時点ではint
のエイリアスであることが示されています。- 将来の変更と互換性: 「A future release of Go (after Go 1) will change rune to be an alias for int32 instead of int. Using rune consistently is the way to make your code build both before and after this change.」と説明されており、Go 1リリース後に
rune
がint32
のエイリアスに変更される計画があること、そしてこの変更の前後にわたってコードの互換性を保つためにはrune
を一貫して使用することが重要であると強調されています。 rune
安全性のテスト方法: 「To test your code for rune safety, you can rebuild the Go tree withGOEXPERIMENT=rune32 ./all.bash
which builds a compiler in which rune is an alias for int32 instead of int.」とあり、GOEXPERIMENT=rune32
環境変数を使ってGoツリーを再ビルドすることで、rune
がint32
として扱われるコンパイラを生成し、コードが将来の変更に耐えうるかテストできる具体的な方法が示されています。govet
の推奨: 「Also, run govet on your code to identify methods that might need to have their signatures updated.」とあり、govet
ツールを使用して、rune
型の導入によってシグネチャの更新が必要になる可能性のあるメソッドを特定するよう促しています。これは、型変更に伴う潜在的な問題を早期に発見し、修正するためのベストプラクティスです。
このドキュメントの更新は、Go言語の進化における重要なマイルストーンであり、開発者が新しい型にスムーズに移行し、将来の変更に備えるための明確なガイドラインを提供しました。
関連リンク
- Go Change List (CL): https://golang.org/cl/5297062 このリンクは、このコミットに関連するGoの変更リスト(コードレビューとマージのプロセス)を示しており、より詳細な議論や関連するコード変更を確認できます。
参考にした情報源リンク
- Go言語の公式ドキュメントやブログ記事(特に
rune
型が導入された時期のもの) - Go言語のソースコードリポジトリ(
src/builtin/builtin.go
などでrune
の定義を確認) - Unicodeに関する一般的な情報源
GOEXPERIMENT
やgovet
に関するGoのドキュメント
(注:具体的なURLは、2011年当時の情報を見つけるのが困難な場合があるため、一般的な情報源として記載しています。)
[インデックス 10108] ファイルの概要
このコミットは、Go言語におけるrune
型の導入に関する週次レポートの更新です。特に、Unicodeコードポイントを扱うための新しい型としてrune
が導入されたこと、および将来的なint32
への変更に向けた互換性維持の指針が説明されています。
コミット
commit 659f1f208af02a3dd5cc13da0d4f8756a3cc5369
Author: Andrew Gerrand <adg@golang.org>
Date: Wed Oct 26 14:47:38 2011 +0900
weekly.2011-10-26 (new rune type)
R=rsc
CC=golang-dev
https://golang.org/cl/5297062
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/659f1f208af02a3dd5cc13da0d4f8756a3cc5369
元コミット内容
weekly.2011-10-26 (new rune type)
R=rsc
CC=golang-dev
https://golang.org/cl/5297062
変更の背景
このコミットは、Go言語の週次開発レポート(weekly.html
)を更新し、rune
型の導入について開発者コミュニティに通知するものです。Go言語は当初からUnicodeを意識した設計がされていましたが、文字列のイテレーションや文字の操作において、バイト単位ではなくUnicodeコードポイント単位で扱うための明確な型が必要とされていました。
従来のGo言語では、文字列はUTF-8エンコードされたバイト列として扱われ、個々の文字(コードポイント)を扱う際にはint
型が使われることが一般的でした。しかし、int
型はプラットフォームによってサイズが異なる可能性があり(32ビットまたは64ビット)、Unicodeコードポイントの最大値(U+10FFFF)を確実に表現するためには、少なくとも21ビットが必要となります。将来的な互換性や明確性を考慮し、Unicodeコードポイントを表現するための専用の型としてrune
が導入されることになりました。
この変更の主な目的は以下の通りです。
- Unicodeコードポイントの明確な表現:
rune
型を導入することで、コードの意図がより明確になり、開発者がUnicodeコードポイントを扱っていることを認識しやすくなります。 - 将来的な型サイズの変更への対応: 当初
rune
はint
のエイリアスとして導入されましたが、Go 1リリース後にはint32
のエイリアスに変更される計画がありました。この変更は、rune
が常に32ビット幅であることを保証し、Unicodeコードポイントを確実に格納できるようにするためです。開発者には、この将来の変更に備えてrune
を積極的に使用することが推奨されました。 - コードの互換性維持:
rune
を早期に導入し、開発者にその使用を促すことで、将来的にrune
がint32
に変更された際にも、既存のコードが大きな変更なしに動作するようにするための準備期間を提供しました。
前提知識の解説
Unicodeとコードポイント
- Unicode: 世界中の文字をコンピュータで扱えるようにするための文字コードの国際標準です。様々な言語の文字、記号、絵文字などを統一的に表現できます。
- コードポイント (Code Point): Unicodeにおける個々の文字や記号に割り当てられた一意の数値です。例えば、
'A'
のコードポイントはU+0041、'あ'
のコードポイントはU+3042です。コードポイントは通常、U+XXXX
の形式で表記されます。Unicodeのコードポイントの範囲はU+0000からU+10FFFFまでです。
Go言語の型システムとint
, int32
int
型: Go言語のint
型は、プラットフォームに依存する整数型です。32ビットシステムでは32ビット幅、64ビットシステムでは64ビット幅になります。この可変性が、Unicodeコードポイントを扱う上で問題となる可能性がありました。int32
型: Go言語のint32
型は、常に32ビット幅の符号付き整数型です。Unicodeコードポイントの最大値U+10FFFFは21ビットで表現できるため、32ビット幅のint32
であれば十分に格納できます。
GOEXPERIMENT
環境変数
GOEXPERIMENT
は、Go言語の実験的な機能や将来の変更を、開発者が早期に試すための環境変数です。このコミットの文脈では、GOEXPERIMENT=rune32
を設定することで、rune
型がint
ではなくint32
のエイリアスとしてコンパイルされるようになり、将来の変更がコードに与える影響を事前に検証できるようになります。
govet
ツール
govet
は、Go言語のソースコードを静的に解析し、疑わしい構成や潜在的なバグを報告するツールです。このコミットの文脈では、rune
型の導入に伴い、メソッドのシグネチャ(特に文字を扱う引数や戻り値の型)が適切に更新されているかを確認するためにgovet
の実行が推奨されています。
技術的詳細
このコミットで言及されているrune
型の導入は、Go言語がUnicodeをより堅牢に、かつ意図的に扱うための重要なステップでした。
rune
型の定義:rune
は、Go言語の組み込み型であり、Unicodeコードポイントを表すために使用されます。このコミットが作成された時点では、rune
はint
のエイリアスとして定義されていました。これは、当時のGoのコンパイラやランタイムがint
を効率的に扱えるようにするための一時的な措置でした。- 将来の変更計画: Go 1リリース後には、
rune
がint32
のエイリアスに変更されることが明確に計画されていました。この変更は、rune
が常に32ビット幅であることを保証し、Unicodeコードポイントの全範囲を確実に表現できるようにするためです。これにより、異なるプラットフォーム間でのrune
型の挙動の一貫性が保たれます。 - 互換性への配慮: 開発者に対しては、この将来の変更に備えて、Unicodeコードポイントを扱う際には
int
ではなくrune
を積極的に使用することが推奨されました。これにより、Go 1リリース後のrune
の型定義変更時にも、既存のコードが「rune safety」を保ち、再コンパイルするだけで動作するように設計されていました。 - 検証方法:
GOEXPERIMENT=rune32 ./all.bash
コマンドは、rune
がint32
として扱われるコンパイラをビルドし、コードが将来の変更に対応できるかを確認するためのメカニズムを提供しました。これにより、開発者は実際の環境でrune
がint32
になった場合の挙動をテストできました。govet
の実行は、rune
型の導入によって影響を受ける可能性のあるメソッドシグネチャの変更を特定し、適切な修正を促すための推奨事項でした。例えば、文字をint
で受け取っていた関数が、rune
で受け取るように変更する必要がある場合などです。
このアプローチにより、Go言語はUnicodeサポートを強化しつつ、既存のコードベースとの互換性を最大限に維持しようとしました。
コアとなるコードの変更箇所
このコミットにおける主要な変更は、Go言語の週次開発レポートを更新するdoc/devel/weekly.html
ファイルにあります。
-
.hgtags
の変更:--- a/.hgtags +++ b/.hgtags @@ -89,4 +89,3 @@ c1702f36df0397c19fc333571a771666029aa37e release acaddf1cea75c059d19b20dbef35b20fb3f38954 release.r58.2 6d7136d74b656ba6e1194853a9486375005227ef weekly.2011-10-18 941b8015061a0f6480954821dd589c60dfe35ed1 weekly.2011-10-25 -941b8015061a0f6480954821dd589c60dfe35ed1 weekly
この変更は、
weekly
というタグが重複していたため、古いエントリを削除したものです。これは本質的な機能変更とは関係ありません。 -
doc/devel/weekly.html
の変更:--- a/doc/devel/weekly.html +++ b/doc/devel/weekly.html @@ -14,6 +14,26 @@ hg pull hg update weekly.<i>YYYY-MM-DD</i> </pre> +<h2 id="2011-10-26">2011-10-26 (new rune type)</h2> + +<pre> +This snapshot introduces the rune type, an alias for int that +should be used for Unicode code points. + +A future release of Go (after Go 1) will change rune to be an +alias for int32 instead of int. Using rune consistently is the way +to make your code build both before and after this change. + +To test your code for rune safety, you can rebuild the Go tree with + +\tGOEXPERIMENT=rune32 ./all.bash +\n +which builds a compiler in which rune is an alias for int32 instead of int. +\n +Also, run govet on your code to identify methods that might need to have their +signatures updated. +</pre> +\n <h2 id="2011-10-25">2011-10-25</h2> <pre>
この変更がこのコミットの核心であり、
2011-10-26
の日付で新しいセクションが追加され、rune
型の導入とその詳細が説明されています。
コアとなるコードの解説
doc/devel/weekly.html
に追加されたセクションは、Go開発者にとって非常に重要な情報を提供しています。
rune
型の紹介: 「This snapshot introduces the rune type, an alias for int that should be used for Unicode code points.」と明記されており、rune
がUnicodeコードポイントのための型であり、現時点ではint
のエイリアスであることが示されています。- 将来の変更と互換性: 「A future release of Go (after Go 1) will change rune to be an alias for int32 instead of int. Using rune consistently is the way to make your code build both before and after this change.」と説明されており、Go 1リリース後に
rune
がint32
のエイリアスに変更される計画があること、そしてこの変更の前後にわたってコードの互換性を保つためにはrune
を一貫して使用することが重要であると強調されています。 rune
安全性のテスト方法: 「To test your code for rune safety, you can rebuild the Go tree withGOEXPERIMENT=rune32 ./all.bash
which builds a compiler in which rune is an alias for int32 instead of int.」とあり、GOEXPERIMENT=rune32
環境変数を使ってGoツリーを再ビルドすることで、rune
がint32
として扱われるコンパイラを生成し、コードが将来の変更に耐えうるかテストできる具体的な方法が示されています。govet
の推奨: 「Also, run govet on your code to identify methods that might need to have their signatures updated.」とあり、govet
ツールを使用して、rune
型の導入によってシグネチャの更新が必要になる可能性のあるメソッドを特定するよう促しています。これは、型変更に伴う潜在的な問題を早期に発見し、修正するためのベストプラクティスです。
このドキュメントの更新は、Go言語の進化における重要なマイルストーンであり、開発者が新しい型にスムーズに移行し、将来の変更に備えるための明確なガイドラインを提供しました。
関連リンク
- Go Change List (CL): https://golang.org/cl/5297062 このリンクは、このコミットに関連するGoの変更リスト(コードレビューとマージのプロセス)を示しており、より詳細な議論や関連するコード変更を確認できます。