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

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

このコミットは、GoランタイムのビルドプロセスにおけるPlan 9環境でのRunemaxの特殊な定義を削除するものです。具体的には、include/plan9/libc.hファイルからRunemaxの定義を削除しています。

コミット

commit b40d98562fe11dad2309aae940dbfcd97e466a26
Author: Anthony Martin <ality@pbrane.org>
Date:   Sat Jun 1 12:03:21 2013 -0700

    build: remove special definition of Runemax on Plan 9
    
    The Bell Labs distribution now supports 21-bit runes.
    
    R=golang-dev, akumar
    CC=golang-dev
    https://golang.org/cl/9249045

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/b40d98562fe11dad2309aae940dbfcd97e466a26

元コミット内容

--- a/include/plan9/libc.h
+++ b/include/plan9/libc.h
@@ -2,16 +2,9 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-#define Runemax Plan9Runemax
 #include "/sys/include/libc.h"
-#undef Runemax
 #include "/sys/include/ctype.h"
 
-enum
-{
-	Runemax = 0x10FFFF, /* maximum rune value */
-};
-
 char*	getgoos(void);
 char*	getgoarch(void);
 char*	getgoroot(void);

変更の背景

このコミットの背景には、Plan 9オペレーティングシステムにおけるルーン(rune)の扱いに関する進化があります。以前のGoのビルドシステムでは、Plan 9環境においてRunemax(ルーンの最大値)が特別に定義されていました。これは、Plan 9のルーンがUnicodeの最大値(U+10FFFF)を完全にサポートしていなかった、あるいはそのサポートが不安定であったためと考えられます。

コミットメッセージにある「The Bell Labs distribution now supports 21-bit runes.」という記述が重要です。これは、Plan 9の公式ディストリビューション(Bell Labs版)が、Unicodeの全範囲を表現できる21ビットのルーンを完全にサポートするようになったことを示しています。これにより、GoのビルドシステムがPlan 9環境でRunemaxを特別に定義する必要がなくなり、標準のUnicode定義に依存できるようになりました。この変更は、Goのコードベースをよりシンプルにし、異なるプラットフォーム間での一貫性を高めることを目的としています。

前提知識の解説

Plan 9

Plan 9 from Bell Labsは、ベル研究所で開発された分散オペレーティングシステムです。Unixの設計思想をさらに推し進め、すべてのリソースをファイルとして表現し、ネットワーク透過性を重視しています。Go言語の開発者の一部はPlan 9の開発にも携わっており、Go言語の設計思想にもPlan 9の影響が見られます。

ルーン (Rune)

Go言語において、「ルーン (rune)」はUnicodeコードポイントを表すために使用される組み込み型です。Goの文字列はUTF-8でエンコードされたバイトのシーケンスですが、個々のUnicode文字を扱う際にはrune型が用いられます。runeは実際にはint32のエイリアスであり、UnicodeのU+0000からU+10FFFFまでの範囲のコードポイントを表現できます。

UnicodeとUTF-8

  • Unicode: 世界中の文字を統一的に扱うための文字コード標準です。各文字に一意のコードポイント(数値)を割り当てます。
  • UTF-8: Unicodeのコードポイントをバイト列にエンコードするための可変長エンコーディング方式です。ASCII文字は1バイトで表現され、それ以外の文字は2バイト以上で表現されます。UTF-8はWeb上で最も広く使用されている文字エンコーディングです。

Runemax

Runemaxは、Unicodeで定義されているルーンの最大値、すなわちU+10FFFFを指します。これは、UTF-8でエンコード可能な最大のコードポイントであり、Go言語のrune型が表現できる最大値でもあります。

Goのビルドシステム

Goのビルドシステムは、異なるオペレーティングシステム(GOOS)とアーキテクチャ(GOARCH)に対応するために、条件付きコンパイルやプラットフォーム固有のヘッダーファイルを使用します。このコミットは、Plan 9という特定のGOOSにおけるビルドの特殊性を解消するものです。

技術的詳細

このコミットの技術的な核心は、GoのビルドプロセスがPlan 9環境でRunemaxの定義を外部のシステムヘッダーに依存するように変更した点にあります。

変更前のinclude/plan9/libc.hでは、以下のコードがありました。

#define Runemax Plan9Runemax
#include "/sys/include/libc.h"
#undef Runemax
#include "/sys/include/ctype.h"

enum
{
	Runemax = 0x10FFFF, /* maximum rune value */
};

このコードは、/sys/include/libc.hをインクルードする前にRunemaxPlan9Runemaxに一時的にリマップし、インクルード後にそのリマップを解除し、さらに独自のRunemax定義(0x10FFFF)を提供していました。これは、Plan 9のシステムヘッダーが提供するRunemaxの定義が、Goが期待するUnicodeの最大値(U+10FFFF)と異なるか、あるいは存在しない場合に備えての措置でした。

コミットメッセージが示唆するように、Bell Labs版のPlan 9が21ビットルーン(つまりUnicodeの全範囲)をサポートするようになったため、Goのビルドシステムはもはやこの特別な定義を必要としなくなりました。Plan 9のシステムヘッダー(/sys/include/libc.h/sys/include/ctype.hなど)が、Goが期待するRunemaxの正しい値を提供するか、あるいはGoが内部的に使用するRunemaxの定義と矛盾しなくなったため、Go側での特別な対応が不要になったのです。

この変更により、include/plan9/libc.hはよりシンプルになり、Plan 9環境でのGoのビルドが他のプラットフォームと同様に標準的なUnicodeの定義に依存できるようになりました。これは、Goのクロスプラットフォーム対応とコードベースの保守性を向上させる一歩と言えます。

コアとなるコードの変更箇所

変更はinclude/plan9/libc.hファイルのみで行われています。

--- a/include/plan9/libc.h
+++ b/include/plan9/libc.h
@@ -2,16 +2,9 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-#define Runemax Plan9Runemax
 #include "/sys/include/libc.h"
-#undef Runemax
 #include "/sys/include/ctype.h"
 
-enum
-{
-	Runemax = 0x10FFFF, /* maximum rune value */
-};
-
 char*	getgoos(void);
 char*	getgoarch(void);
 char*	getgoroot(void);

具体的には、以下の行が削除されました。

  1. #define Runemax Plan9Runemax
  2. #undef Runemax
  3. enum { Runemax = 0x10FFFF, /* maximum rune value */ };

コアとなるコードの解説

削除されたコードは、Plan 9環境におけるRunemaxの定義をGoのビルドシステムが制御するためのものでした。

  • #define Runemax Plan9Runemax#undef Runemax: これらは、/sys/include/libc.hをインクルードする際に、Goが使用するRunemaxというシンボルがPlan 9のシステムヘッダー内で定義されている可能性のあるPlan9Runemaxと衝突しないように、一時的にマクロを定義・解除するものです。これは、GoのビルドがPlan 9の既存のCライブラリヘッダーと連携する際の互換性レイヤーとして機能していました。

  • enum { Runemax = 0x10FFFF, /* maximum rune value */ };: このenumブロックは、Goが内部的に使用するRunemaxの値を明示的に0x10FFFF(Unicodeの最大コードポイント)として定義していました。これは、Plan 9のシステムヘッダーが提供するRunemaxの値がGoの期待する値と異なる場合、または全く定義されていない場合に備えて、Goが正しいRunemaxの値を持つことを保証するためのフォールバックメカニズムでした。

これらのコードが削除されたということは、Plan 9のシステムヘッダーがGoの期待するRunemaxの値(0x10FFFF)を直接提供するようになったか、あるいはGoのビルドシステムがPlan 9のシステムヘッダーに依存せずにRunemaxの値を適切に処理できるようになったことを意味します。コミットメッセージの「The Bell Labs distribution now supports 21-bit runes.」という記述から、前者の可能性が高いと考えられます。つまり、Plan 9自体がUnicodeの全範囲をサポートするようになり、Goがその恩恵を受けられるようになったということです。

この変更により、GoのビルドシステムはPlan 9環境においても、他のプラットフォームと同様に標準的なUnicodeの定義に依存できるようになり、コードの複雑性が軽減されました。

関連リンク

参考にした情報源リンク

  • コミットメッセージと差分 (commit_data/16459.txt)
  • Go言語の公式ドキュメント (rune, string, build systemに関する一般的な知識)
  • Plan 9に関する一般的な情報
  • UnicodeおよびUTF-8に関する一般的な情報
  • GitHubのコミットページ: https://github.com/golang/go/commit/b40d98562fe11dad2309aae940dbfcd97e466a26
  • Goのコードレビューシステム (Gerrit) の変更リスト: https://golang.org/cl/9249045 (現在はGitHubにリダイレクトされる)
  • Runemaxの定義に関するGoのソースコード(一般的な知識として)
  • Plan 9のルーンに関する情報(Web検索で「Plan 9 runes 21-bit」などで検索)
  • 例: https://9p.io/magic/man2html/5/utf (Plan 9のUTFに関するmanページ)
  • 例: https://9p.io/magic/man2html/2/rune (Plan 9のruneに関するmanページ)
  • これらの情報源から、Plan 9が元々16ビットルーン(U+FFFFまで)をサポートし、後に21ビットルーン(U+10FFFFまで)をサポートするようになった経緯が確認できます。