[インデックス 16258] ファイルの概要
このコミットは、Go言語プロジェクトのlibmachライブラリにおけるPlan 9オペレーティングシステム上でのビルド問題を修正するものです。具体的には、src/libmach/8.cファイルにおいて、ヘッダーファイルのインクルード順序が原因で発生していたコンパイルエラーを解決します。この問題は、Plan 9における最近のrune(文字)表現の変更(21-bit runesへの移行)と、それに伴うUTFmax列挙型の定義場所の変更に起因しています。
コミット
commit c8942f021e99d1d0388bb6571fc3410de94a88d9
Author: David du Colombier <0intro@gmail.com>
Date: Wed May 1 15:48:13 2013 -0700
libmach: fix build on Plan 9
Include libc.h before bio.h in 8.c, because bio.h uses
the UTFmax enum, which is declared in libc.h, since
the recent switch to 21-bit runes in Plan 9.
The 5.c and 6.c files already includes libc.h.
R=golang-dev, r
CC=golang-dev
https://golang.org/cl/9040047
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/c8942f021e99d1d038bb6571fc3410de94a88d9
元コミット内容
libmach: fix build on Plan 9
8.cにおいてbio.hの前にlibc.hをインクルードする。これは、bio.hがUTFmax列挙型を使用しており、この型がlibc.hで宣言されているためである。この変更は、Plan 9が最近21-bit runesに切り替わったことに起因する。
5.cと6.cファイルは既にlibc.hをインクルードしている。
変更の背景
このコミットの背景には、Plan 9オペレーティングシステムにおける文字エンコーディングの変更があります。具体的には、Plan 9が従来の16-bit runesから21-bit runesへと移行したことが挙げられます。この変更により、文字を扱うための内部表現や関連するデータ型、特にUTFmax列挙型の定義場所が影響を受けました。
Go言語のlibmachライブラリは、デバッグやプロファイリングなどの目的で、ターゲットシステムのプロセスやメモリを検査するための低レベルな機能を提供します。このライブラリはC言語で書かれており、Plan 9を含む様々なアーキテクチャやOSに対応しています。
問題は、src/libmach/8.cファイルがbio.hヘッダーをインクルードする際に発生しました。bio.hは、バイナリI/O操作に関連する定義を含んでいますが、その内部でUTFmaxという列挙型を使用しています。Plan 9のrune変更に伴い、このUTFmaxの定義がlibc.h(標準Cライブラリのヘッダー)に移動しました。
したがって、8.cがbio.hをインクルードする前にlibc.hがインクルードされていないと、UTFmaxが未定義であるというコンパイルエラーが発生するようになりました。コミットメッセージによると、libmach内の他のファイル(5.cや6.c)では既にこの依存関係が考慮されており、libc.hが先にインクルードされていました。このコミットは、8.cも同様の正しいインクルード順序に従うように修正するものです。
前提知識の解説
- Plan 9 from Bell Labs: ベル研究所が開発した分散オペレーティングシステムです。Unixの概念をさらに推し進め、すべてをファイルとして扱うという思想が特徴です。Go言語の開発者の一部はPlan 9の開発にも携わっており、Go言語の設計思想にもPlan 9の影響が見られます。
- Rune (ルーン): Plan 9およびGo言語における文字の概念です。Unicodeコードポイントを表現するために使用されます。従来のUnix系システムで使われるバイト指向の文字表現とは異なり、ルーンは可変長エンコーディング(UTF-8など)における単一のUnicode文字を抽象化したものです。
- 21-bit Runes: Plan 9におけるruneの表現が、従来の16ビットから21ビットに拡張されたことを指します。これにより、より広範なUnicode文字(特にサロゲートペアを必要とする文字)を直接表現できるようになり、文字処理の正確性と互換性が向上しました。この変更は、システム全体の文字処理ロジックに影響を与え、関連するヘッダーファイルやデータ型の定義にも波及しました。
libc.h: Plan 9における標準Cライブラリのヘッダーファイルです。一般的なC言語の関数やデータ型、マクロなどが宣言されています。システムコールや基本的なI/O、メモリ管理など、OSの低レベルな機能と連携するための定義が含まれることが多いです。bio.h: Plan 9におけるバイナリI/Oライブラリのヘッダーファイルです。ファイルやデバイスからのバイナリデータの読み書きに関連する関数やデータ型が宣言されています。UTFmaxenum:UTFmaxは、UTF-8エンコーディングにおける1つのUnicode文字が占める最大バイト数を表す列挙型(enum)であると推測されます。21-bit runesへの移行に伴い、この最大バイト数が変更されたか、あるいはその定義がより基本的なヘッダーファイルであるlibc.hに集約されたと考えられます。libmach: Go言語のソースツリー内にあるライブラリで、主にデバッガやプロファイラがターゲットプロセスのメモリやレジスタ、シンボル情報などにアクセスするための低レベルなインターフェースを提供します。異なるアーキテクチャやOS(Plan 9を含む)に対応するために、それぞれの環境に特化した実装が含まれています。
技術的詳細
この問題は、C言語のコンパイルにおけるヘッダーファイルの依存関係とインクルード順序に直接関係しています。
- 依存関係の変更: Plan 9が21-bit runesに移行した結果、
UTFmaxという列挙型(enum)の定義が、以前は別の場所にあったか、あるいは暗黙的に利用可能だったものが、明示的にlibc.h内で宣言されるようになりました。 bio.hの依存性:bio.hヘッダーファイルは、その内部でUTFmax列挙型を使用しています。これは、バイナリI/O操作が文字エンコーディングの最大バイト数に関する知識を必要とするためと考えられます。8.cのインクルード順序:src/libmach/8.cファイルは、bio.hをインクルードしていましたが、その前にlibc.hをインクルードしていませんでした。- コンパイルエラー:
8.cがコンパイルされる際、bio.hがインクルードされる時点でUTFmaxの定義が見つからないため、「未定義の識別子UTFmax」のようなコンパイルエラーが発生していました。 - 解決策: この問題を解決するためには、
bio.hがUTFmaxを必要とする前に、その定義を含むlibc.hをインクルードする必要があります。これにより、コンパイラはbio.hを処理する際にUTFmaxの定義を正しく解決できるようになります。 - 既存のパターン: コミットメッセージが指摘しているように、
libmach内の他のファイル(5.cや6.c)では既にこの正しいインクルード順序が採用されていました。これは、これらのファイルが以前からUTFmaxまたはlibc.hの他の定義に依存していたか、あるいはより一般的なベストプラクティスとしてlibc.hを早期にインクルードしていたためと考えられます。このコミットは、8.cを既存の慣習と整合させるものです。
コアとなるコードの変更箇所
diff --git a/src/libmach/8.c b/src/libmach/8.c
index 07ec305057..34248e6f33 100644
--- a/src/libmach/8.c
+++ b/src/libmach/8.c
@@ -30,6 +30,7 @@
* 386 definition
*/
#include <u.h>
+#include <libc.h>
#include <bio.h>
#include <ureg_x86.h>
#include <mach.h>
コアとなるコードの解説
変更はsrc/libmach/8.cファイル内の1行の追加です。
#include <u.h>
+#include <libc.h> // この行が追加された
#include <bio.h>
#include <ureg_x86.h>
#include <mach.h>
この変更は、#include <bio.h>の直前に#include <libc.h>を追加しています。
#include <u.h>: Plan 9の基本的な型やマクロを含むヘッダーです。#include <libc.h>: この行が追加されました。これにより、bio.hがインクルードされる前に、libc.hで宣言されているUTFmax列挙型がコンパイラに認識されるようになります。#include <bio.h>: バイナリI/O関連の定義を含むヘッダーです。このヘッダーがUTFmaxに依存しているため、libc.hが先に必要となります。#include <ureg_x86.h>: x86アーキテクチャのレジスタ定義を含むヘッダーです。#include <mach.h>:libmachライブラリの主要な定義を含むヘッダーです。
このシンプルな変更により、ヘッダーファイルの依存関係が正しく解決され、Plan 9上でのlibmachのビルドが成功するようになりました。
関連リンク
- Go CL 9040047: https://golang.org/cl/9040047
参考にした情報源リンク
- Plan 9 from Bell Labs: https://9p.io/plan9/
- Go言語のソースコード(libmachディレクトリ構造など)
- C言語のヘッダーファイルインクルードに関する一般的な知識
- Plan 9のruneに関する情報(一般的なWeb検索による)```markdown
[インデックス 16258] ファイルの概要
このコミットは、Go言語プロジェクトのlibmachライブラリにおけるPlan 9オペレーティングシステム上でのビルド問題を修正するものです。具体的には、src/libmach/8.cファイルにおいて、ヘッダーファイルのインクルード順序が原因で発生していたコンパイルエラーを解決します。この問題は、Plan 9における最近のrune(文字)表現の変更(21-bit runesへの移行)と、それに伴うUTFmax列挙型の定義場所の変更に起因しています。
コミット
commit c8942f021e99d1d038bb6571fc3410de94a88d9
Author: David du Colombier <0intro@gmail.com>
Date: Wed May 1 15:48:13 2013 -0700
libmach: fix build on Plan 9
Include libc.h before bio.h in 8.c, because bio.h uses
the UTFmax enum, which is declared in libc.h, since
the recent switch to 21-bit runes in Plan 9.
The 5.c and 6.c files already includes libc.h.
R=golang-dev, r
CC=golang-dev
https://golang.org/cl/9040047
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/c8942f021e99d1d038bb6571fc3410de94a88d9
元コミット内容
libmach: fix build on Plan 9
8.cにおいてbio.hの前にlibc.hをインクルードする。これは、bio.hがUTFmax列挙型を使用しており、この型がlibc.hで宣言されているためである。この変更は、Plan 9が最近21-bit runesに切り替わったことに起因する。
5.cと6.cファイルは既にlibc.hをインクルードしている。
変更の背景
このコミットの背景には、Plan 9オペレーティングシステムにおける文字エンコーディングの変更があります。具体的には、Plan 9が従来の16-bit runesから21-bit runesへと移行したことが挙げられます。この変更により、文字を扱うための内部表現や関連するデータ型、特にUTFmax列挙型の定義場所が影響を受けました。
Go言語のlibmachライブラリは、デバッグやプロファイリングなどの目的で、ターゲットシステムのプロセスやメモリを検査するための低レベルな機能を提供します。このライブラリはC言語で書かれており、Plan 9を含む様々なアーキテクチャやOSに対応しています。
問題は、src/libmach/8.cファイルがbio.hヘッダーをインクルードする際に発生しました。bio.hは、バイナリI/O操作に関連する定義を含んでいますが、その内部でUTFmaxという列挙型を使用しています。Plan 9のrune変更に伴い、このUTFmaxの定義がlibc.h(標準Cライブラリのヘッダー)に移動しました。
したがって、8.cがbio.hをインクルードする前にlibc.hがインクルードされていないと、UTFmaxが未定義であるというコンパイルエラーが発生するようになりました。コミットメッセージによると、libmach内の他のファイル(5.cや6.c)では既にこの依存関係が考慮されており、libc.hが先にインクルードされていました。このコミットは、8.cも同様の正しいインクルード順序に従うように修正するものです。
前提知識の解説
- Plan 9 from Bell Labs: ベル研究所が開発した分散オペレーティングシステムです。Unixの概念をさらに推し進め、すべてをファイルとして扱うという思想が特徴です。Go言語の開発者の一部はPlan 9の開発にも携わっており、Go言語の設計思想にもPlan 9の影響が見られます。
- Rune (ルーン): Plan 9およびGo言語における文字の概念です。Unicodeコードポイントを表現するために使用されます。従来のUnix系システムで使われるバイト指向の文字表現とは異なり、ルーンは可変長エンコーディング(UTF-8など)における単一のUnicode文字を抽象化したものです。
- 21-bit Runes: Plan 9におけるruneの表現が、従来の16ビットから21ビットに拡張されたことを指します。これにより、より広範なUnicode文字(特にサロゲートペアを必要とする文字)を直接表現できるようになり、文字処理の正確性と互換性が向上しました。この変更は、システム全体の文字処理ロジックに影響を与え、関連するヘッダーファイルやデータ型の定義にも波及しました。
libc.h: Plan 9における標準Cライブラリのヘッダーファイルです。一般的なC言語の関数やデータ型、マクロなどが宣言されています。システムコールや基本的なI/O、メモリ管理など、OSの低レベルな機能と連携するための定義が含まれることが多いです。bio.h: Plan 9におけるバイナリI/Oライブラリのヘッダーファイルです。ファイルやデバイスからのバイナリデータの読み書きに関連する関数やデータ型が宣言されています。UTFmaxenum:UTFmaxは、UTF-8エンコーディングにおける1つのUnicode文字が占める最大バイト数を表す列挙型(enum)であると推測されます。21-bit runesへの移行に伴い、この最大バイト数が変更されたか、あるいはその定義がより基本的なヘッダーファイルであるlibc.hに集約されたと考えられます。libmach: Go言語のソースツリー内にあるライブラリで、主にデバッガやプロファイラがターゲットプロセスのメモリやレジスタ、シンボル情報などにアクセスするための低レベルなインターフェースを提供します。異なるアーキテクチャやOS(Plan 9を含む)に対応するために、それぞれの環境に特化した実装が含まれています。
技術的詳細
この問題は、C言語のコンパイルにおけるヘッダーファイルの依存関係とインクルード順序に直接関係しています。
- 依存関係の変更: Plan 9が21-bit runesに移行した結果、
UTFmaxという列挙型(enum)の定義が、以前は別の場所にあったか、あるいは暗黙的に利用可能だったものが、明示的にlibc.h内で宣言されるようになりました。 bio.hの依存性:bio.hヘッダーファイルは、その内部でUTFmax列挙型を使用しています。これは、バイナリI/O操作が文字エンコーディングの最大バイト数に関する知識を必要とするためと考えられます。8.cのインクルード順序:src/libmach/8.cファイルは、bio.hをインクルードしていましたが、その前にlibc.hをインクルードしていませんでした。- コンパイルエラー:
8.cがコンパイルされる際、bio.hがインクルードされる時点でUTFmaxの定義が見つからないため、「未定義の識別子UTFmax」のようなコンパイルエラーが発生していました。 - 解決策: この問題を解決するためには、
bio.hがUTFmaxを必要とする前に、その定義を含むlibc.hをインクルードする必要があります。これにより、コンパイラはbio.hを処理する際にUTFmaxの定義を正しく解決できるようになります。 - 既存のパターン: コミットメッセージが指摘しているように、
libmach内の他のファイル(5.cや6.c)では既にこの正しいインクルード順序が採用されていました。これは、これらのファイルが以前からUTFmaxまたはlibc.hの他の定義に依存していたか、あるいはより一般的なベストプラクティスとしてlibc.hを早期にインクルードしていたためと考えられます。このコミットは、8.cを既存の慣習と整合させるものです。
コアとなるコードの変更箇所
diff --git a/src/libmach/8.c b/src/libmach/8.c
index 07ec305057..34248e6f33 100644
--- a/src/libmach/8.c
+++ b/src/libmach/8.c
@@ -30,6 +30,7 @@
* 386 definition
*/
#include <u.h>
+#include <libc.h>
#include <bio.h>
#include <ureg_x86.h>
#include <mach.h>
コアとなるコードの解説
変更はsrc/libmach/8.cファイル内の1行の追加です。
#include <u.h>
+#include <libc.h> // この行が追加された
#include <bio.h>
#include <ureg_x86.h>
#include <mach.h>
この変更は、#include <bio.h>の直前に#include <libc.h>を追加しています。
#include <u.h>: Plan 9の基本的な型やマクロを含むヘッダーです。#include <libc.h>: この行が追加されました。これにより、bio.hがインクルードされる前に、libc.hで宣言されているUTFmax列挙型がコンパイラに認識されるようになります。#include <bio.h>: バイナリI/O関連の定義を含むヘッダーです。このヘッダーがUTFmaxに依存しているため、libc.hが先に必要となります。#include <ureg_x86.h>: x86アーキテクチャのレジスタ定義を含むヘッダーです。#include <mach.h>:libmachライブラリの主要な定義を含むヘッダーです。
このシンプルな変更により、ヘッダーファイルの依存関係が正しく解決され、Plan 9上でのlibmachのビルドが成功するようになりました。
関連リンク
- Go CL 9040047: https://golang.org/cl/9040047
参考にした情報源リンク
- Plan 9 from Bell Labs: https://9p.io/plan9/
- Go言語のソースコード(libmachディレクトリ構造など)
- C言語のヘッダーファイルインクルードに関する一般的な知識
- Plan 9のruneに関する情報(一般的なWeb検索による)