[インデックス 10681] ファイルの概要
このコミットは、Go言語の仕様書 doc/go_spec.html
における rune
型の定義を更新するものです。具体的には、rune
が int
のエイリアスから int32
のエイリアスへと変更されたことを反映しています。これにより、rune
型がUnicodeのコードポイントを表現するための32ビット整数として明確に位置づけられました。
コミット
- コミットハッシュ:
d7f050a73e2cf7d890c3711c78f60627da01ea9d
- 作者: Russ Cox rsc@golang.org
- コミット日時: Fri Dec 9 00:11:43 2011 -0500
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/d7f050a73e2cf7d890c3711c78f60627da01ea9d
元コミット内容
spec: rune is now an alias for int32
R=golang-dev, dsymonds, r
CC=golang-dev
https://golang.org/cl/5467048
変更の背景
Go言語の初期の段階では、rune
型は int
のエイリアスとして定義されていました。しかし、Go言語の設計思想として、rune
はUnicodeのコードポイント(文字)を表現するための型であり、Unicodeのコードポイントは最大でU+10FFFFまで存在し、これを表現するには32ビットが必要となります。
int
型は、Go言語の仕様上、少なくとも32ビットのサイズを持つことが保証されていますが、具体的なサイズは実装(コンパイラやアーキテクチャ)に依存する可能性がありました(例えば、64ビットシステムではint
が64ビットになる可能性)。このような曖昧さは、特に異なるアーキテクチャ間での移植性や、rune
型が実際に表現できる値の範囲に関する混乱を招く可能性がありました。
このコミットは、以前の仕様書に記載されていた「rune
は int
のエイリアスだが、将来的には int32
に変更される予定」という記述を、実際に int32
のエイリアスになったという事実に合わせて更新するものです。これにより、rune
型のサイズと目的が明確になり、Go言語の型システムの一貫性と移植性が向上しました。
前提知識の解説
Go言語の基本型
Go言語には、数値、真偽値、文字列などの基本的な型が組み込まれています。
- 整数型:
- 符号付き整数:
int8
,int16
,int32
,int64
,int
- 符号なし整数:
uint8
,uint16
,uint32
,uint64
,uint
int
とuint
は、それぞれ符号付きおよび符号なしの整数型で、そのサイズはシステムに依存します(通常は32ビットまたは64ビット)。
- 符号付き整数:
byte
型:uint8
のエイリアスです。主にバイトデータを扱う際に使用されます。rune
型: このコミットの主題となる型です。Go言語では、文字列はUTF-8でエンコードされたバイトのシーケンスとして扱われます。rune
は、そのUTF-8シーケンスからデコードされた単一のUnicodeコードポイントを表すために使用されます。
Unicodeとコードポイント
- Unicode: 世界中の様々な言語の文字を統一的に扱うための文字コード標準です。
- コードポイント: Unicodeにおいて、各文字に割り当てられた一意の数値です。例えば、'A'のコードポイントはU+0041、'あ'のコードポイントはU+3042です。Unicodeのコードポイントは0からU+10FFFF(1,114,112)までの範囲にあります。
エイリアス(型エイリアス)
Go言語における型エイリアスは、既存の型に新しい名前を付ける機能です。例えば、type MyInt int
と定義すると、MyInt
は int
と同じ基底型を持つ新しい型として扱われます。このコミットで扱われている byte
や rune
は、特定の基底型に対するエイリアスとして定義されています。エイリアスは、コードの可読性を高めたり、特定の目的のために型を区別したりするのに役立ちます。
技術的詳細
この変更の技術的な核心は、rune
型がUnicodeコードポイントを正確かつ効率的に表現するための最適な基底型として int32
が選ばれた点にあります。
-
Unicodeコードポイントの範囲: UnicodeのコードポイントはU+0000からU+10FFFFまでの範囲にあります。この範囲の最大値は1,114,111(16進数で0x10FFFF)であり、これは32ビットの符号付き整数(
int32
)で十分に表現可能です。int32
の最大値は約21億であり、Unicodeの最大コードポイントを大きく上回ります。 -
int
型の曖昧さの解消: 以前のrune
がint
のエイリアスであった場合、int
の具体的なサイズが32ビットか64ビットかによって、rune
が占めるメモリサイズや、場合によっては扱える値の範囲に曖昧さが生じる可能性がありました。Go言語の設計哲学は、明確さと予測可能性を重視します。rune
をint32
のエイリアスとすることで、rune
が常に32ビットの符号付き整数として扱われることが保証され、異なるプラットフォーム間での挙動の一貫性が保たれます。 -
移植性の向上:
int32
は、その名前が示す通り、常に32ビットの幅を持つことが保証されています。これにより、Goプログラムが32ビットシステムでコンパイルされようと、64ビットシステムでコンパイルされようと、rune
型のサイズと挙動は一貫します。これは、特に文字処理や国際化対応を行うアプリケーションにおいて、予期せぬバグや互換性の問題を避ける上で非常に重要です。 -
仕様の明確化: この変更は、Go言語の仕様書における
rune
の定義を、実際のGoコンパイラの実装と整合させるものです。これにより、開発者はGo言語の型システムについてより正確な理解を持つことができ、rune
を使用する際の混乱がなくなります。
このコミットは、Go言語が文字と文字列の扱いにおいて、Unicode標準に厳密に準拠し、かつ高い移植性を提供するための重要な一歩を示しています。
コアとなるコードの変更箇所
変更は doc/go_spec.html
ファイルに対して行われました。
--- a/doc/go_spec.html
+++ b/doc/go_spec.html
@@ -695,7 +695,7 @@ complex64 the set of all complex numbers with float32 real and imaginary parts
complex128 the set of all complex numbers with float64 real and imaginary parts
byte alias for uint8
-rune alias for int (will change to int32 in the future)
+rune alias for int32
</pre>
<p>
@@ -716,8 +716,7 @@ uintptr an unsigned integer large enough to store the uninterpreted bits of a p
<p>
To avoid portability issues all numeric types are distinct except
<code>byte</code>, which is an alias for <code>uint8</code>, and
-<code>rune</code>, which is an alias for <code>int</code> (to become
-<code>int32</code> in a later version of Go).\n+<code>rune</code>, which is an alias for <code>int32</code>.\n Conversions
are required when different numeric types are mixed in an expression
or assignment. For instance, <code>int32</code> and <code>int</code>
コアとなるコードの解説
上記の差分は、doc/go_spec.html
内の2つの箇所を変更しています。
-
行 698 の変更:
-rune alias for int (will change to int32 in the future)
+rune alias for int32
この変更は、Go言語の組み込み型のリストにおいて、rune
の定義を「int
のエイリアスであり、将来的にはint32
に変更される予定」という記述から、直接「int32
のエイリアス」へと更新しています。これは、Go言語の進化に伴い、rune
の型定義が実際に変更されたことを反映するものです。
-
行 719-720 の変更:
-<code>rune</code>, which is an alias for <code>int</code> (to become
-<code>int32</code> in a later version of Go).
+<code>rune</code>, which is an alias for <code>int32</code>.
この変更は、Go言語の型システムにおける移植性に関する説明の箇所で、byte
とrune
のエイリアスについて言及している部分を修正しています。以前はrune
がint
のエイリアスであり、将来的にint32
になると説明されていましたが、このコミットにより、その将来の変更が完了したため、直接int32
のエイリアスであると記述されています。
これらの変更は、Go言語の公式仕様書を最新の言語定義に合わせるためのドキュメント更新であり、rune
型のセマンティクスがより明確になったことを示しています。
関連リンク
- Go CL 5467048: https://golang.org/cl/5467048
参考にした情報源リンク
- Go言語の公式ドキュメントおよび仕様書(このコミットの対象ファイル自体が情報源です)
- Unicode標準に関する一般的な知識
- Go言語の型システムとデータ表現に関する内部知識