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

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

このコミットは、Go言語の仕様書 doc/go_spec.html における rune 型の定義を更新するものです。具体的には、runeint のエイリアスから 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 型が実際に表現できる値の範囲に関する混乱を招く可能性がありました。

このコミットは、以前の仕様書に記載されていた「runeint のエイリアスだが、将来的には int32 に変更される予定」という記述を、実際に int32 のエイリアスになったという事実に合わせて更新するものです。これにより、rune 型のサイズと目的が明確になり、Go言語の型システムの一貫性と移植性が向上しました。

前提知識の解説

Go言語の基本型

Go言語には、数値、真偽値、文字列などの基本的な型が組み込まれています。

  • 整数型:
    • 符号付き整数: int8, int16, int32, int64, int
    • 符号なし整数: uint8, uint16, uint32, uint64, uint
    • intuint は、それぞれ符号付きおよび符号なしの整数型で、そのサイズはシステムに依存します(通常は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 と定義すると、MyIntint と同じ基底型を持つ新しい型として扱われます。このコミットで扱われている byterune は、特定の基底型に対するエイリアスとして定義されています。エイリアスは、コードの可読性を高めたり、特定の目的のために型を区別したりするのに役立ちます。

技術的詳細

この変更の技術的な核心は、rune 型がUnicodeコードポイントを正確かつ効率的に表現するための最適な基底型として int32 が選ばれた点にあります。

  1. Unicodeコードポイントの範囲: UnicodeのコードポイントはU+0000からU+10FFFFまでの範囲にあります。この範囲の最大値は1,114,111(16進数で0x10FFFF)であり、これは32ビットの符号付き整数(int32)で十分に表現可能です。int32 の最大値は約21億であり、Unicodeの最大コードポイントを大きく上回ります。

  2. int 型の曖昧さの解消: 以前の runeint のエイリアスであった場合、int の具体的なサイズが32ビットか64ビットかによって、rune が占めるメモリサイズや、場合によっては扱える値の範囲に曖昧さが生じる可能性がありました。Go言語の設計哲学は、明確さと予測可能性を重視します。runeint32 のエイリアスとすることで、rune が常に32ビットの符号付き整数として扱われることが保証され、異なるプラットフォーム間での挙動の一貫性が保たれます。

  3. 移植性の向上: int32 は、その名前が示す通り、常に32ビットの幅を持つことが保証されています。これにより、Goプログラムが32ビットシステムでコンパイルされようと、64ビットシステムでコンパイルされようと、rune 型のサイズと挙動は一貫します。これは、特に文字処理や国際化対応を行うアプリケーションにおいて、予期せぬバグや互換性の問題を避ける上で非常に重要です。

  4. 仕様の明確化: この変更は、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つの箇所を変更しています。

  1. 行 698 の変更:

    • -rune alias for int (will change to int32 in the future)
    • +rune alias for int32 この変更は、Go言語の組み込み型のリストにおいて、rune の定義を「int のエイリアスであり、将来的には int32 に変更される予定」という記述から、直接「int32 のエイリアス」へと更新しています。これは、Go言語の進化に伴い、rune の型定義が実際に変更されたことを反映するものです。
  2. 行 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言語の型システムにおける移植性に関する説明の箇所で、byterune のエイリアスについて言及している部分を修正しています。以前は runeint のエイリアスであり、将来的に int32 になると説明されていましたが、このコミットにより、その将来の変更が完了したため、直接 int32 のエイリアスであると記述されています。

これらの変更は、Go言語の公式仕様書を最新の言語定義に合わせるためのドキュメント更新であり、rune 型のセマンティクスがより明確になったことを示しています。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメントおよび仕様書(このコミットの対象ファイル自体が情報源です)
  • Unicode標準に関する一般的な知識
  • Go言語の型システムとデータ表現に関する内部知識