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

[インデックス 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が導入されることになりました。

この変更の主な目的は以下の通りです。

  1. Unicodeコードポイントの明確な表現: rune型を導入することで、コードの意図がより明確になり、開発者がUnicodeコードポイントを扱っていることを認識しやすくなります。
  2. 将来的な型サイズの変更への対応: 当初runeintのエイリアスとして導入されましたが、Go 1リリース後にはint32のエイリアスに変更される計画がありました。この変更は、runeが常に32ビット幅であることを保証し、Unicodeコードポイントを確実に格納できるようにするためです。開発者には、この将来の変更に備えてruneを積極的に使用することが推奨されました。
  3. コードの互換性維持: runeを早期に導入し、開発者にその使用を促すことで、将来的にruneint32に変更された際にも、既存のコードが大きな変更なしに動作するようにするための準備期間を提供しました。

前提知識の解説

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コードポイントを表すために使用されます。このコミットが作成された時点では、runeintのエイリアスとして定義されていました。これは、当時のGoのコンパイラやランタイムがintを効率的に扱えるようにするための一時的な措置でした。
  • 将来の変更計画: Go 1リリース後には、runeint32のエイリアスに変更されることが明確に計画されていました。この変更は、runeが常に32ビット幅であることを保証し、Unicodeコードポイントの全範囲を確実に表現できるようにするためです。これにより、異なるプラットフォーム間でのrune型の挙動の一貫性が保たれます。
  • 互換性への配慮: 開発者に対しては、この将来の変更に備えて、Unicodeコードポイントを扱う際にはintではなくruneを積極的に使用することが推奨されました。これにより、Go 1リリース後のruneの型定義変更時にも、既存のコードが「rune safety」を保ち、再コンパイルするだけで動作するように設計されていました。
  • 検証方法:
    • GOEXPERIMENT=rune32 ./all.bashコマンドは、runeint32として扱われるコンパイラをビルドし、コードが将来の変更に対応できるかを確認するためのメカニズムを提供しました。これにより、開発者は実際の環境でruneint32になった場合の挙動をテストできました。
    • 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リリース後にruneint32のエイリアスに変更される計画があること、そしてこの変更の前後にわたってコードの互換性を保つためにはruneを一貫して使用することが重要であると強調されています。
  • rune安全性のテスト方法: 「To test your code for rune safety, you can rebuild the Go tree with GOEXPERIMENT=rune32 ./all.bash which builds a compiler in which rune is an alias for int32 instead of int.」とあり、GOEXPERIMENT=rune32環境変数を使ってGoツリーを再ビルドすることで、runeint32として扱われるコンパイラを生成し、コードが将来の変更に耐えうるかテストできる具体的な方法が示されています。
  • 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に関する一般的な情報源
  • GOEXPERIMENTgovetに関する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が導入されることになりました。

この変更の主な目的は以下の通りです。

  1. Unicodeコードポイントの明確な表現: rune型を導入することで、コードの意図がより明確になり、開発者がUnicodeコードポイントを扱っていることを認識しやすくなります。
  2. 将来的な型サイズの変更への対応: 当初runeintのエイリアスとして導入されましたが、Go 1リリース後にはint32のエイリアスに変更される計画がありました。この変更は、runeが常に32ビット幅であることを保証し、Unicodeコードポイントを確実に格納できるようにするためです。開発者には、この将来の変更に備えてruneを積極的に使用することが推奨されました。
  3. コードの互換性維持: runeを早期に導入し、開発者にその使用を促すことで、将来的にruneint32に変更された際にも、既存のコードが大きな変更なしに動作するようにするための準備期間を提供しました。

前提知識の解説

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コードポイントを表すために使用されます。このコミットが作成された時点では、runeintのエイリアスとして定義されていました。これは、当時のGoのコンパイラやランタイムがintを効率的に扱えるようにするための一時的な措置でした。
  • 将来の変更計画: Go 1リリース後には、runeint32のエイリアスに変更されることが明確に計画されていました。この変更は、runeが常に32ビット幅であることを保証し、Unicodeコードポイントの全範囲を確実に表現できるようにするためです。これにより、異なるプラットフォーム間でのrune型の挙動の一貫性が保たれます。
  • 互換性への配慮: 開発者に対しては、この将来の変更に備えて、Unicodeコードポイントを扱う際にはintではなくruneを積極的に使用することが推奨されました。これにより、Go 1リリース後のruneの型定義変更時にも、既存のコードが「rune safety」を保ち、再コンパイルするだけで動作するように設計されていました。
  • 検証方法:
    • GOEXPERIMENT=rune32 ./all.bashコマンドは、runeint32として扱われるコンパイラをビルドし、コードが将来の変更に対応できるかを確認するためのメカニズムを提供しました。これにより、開発者は実際の環境でruneint32になった場合の挙動をテストできました。
    • 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リリース後にruneint32のエイリアスに変更される計画があること、そしてこの変更の前後にわたってコードの互換性を保つためにはruneを一貫して使用することが重要であると強調されています。
  • rune安全性のテスト方法: 「To test your code for rune safety, you can rebuild the Go tree with GOEXPERIMENT=rune32 ./all.bash which builds a compiler in which rune is an alias for int32 instead of int.」とあり、GOEXPERIMENT=rune32環境変数を使ってGoツリーを再ビルドすることで、runeint32として扱われるコンパイラを生成し、コードが将来の変更に耐えうるかテストできる具体的な方法が示されています。
  • 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の変更リスト(コードレビューとマージのプロセス)を示しており、より詳細な議論や関連するコード変更を確認できます。

参考にした情報源リンク