[インデックス 11940] ファイルの概要
このコミットは、Go言語のランタイムがPlan 9オペレーティングシステム上でビルドされる際の問題を修正するものです。具体的には、NSIG
というシンボルが未定義であったために発生していたビルドエラーを解消するため、src/pkg/runtime/os_plan9.h
ファイルに#define NSIG 1
を追加しています。これにより、Plan 9環境でのGoランタイムのコンパイルが可能になります。
コミット
commit 1064f3a97bf44b2737f48545f7955efaa7ff4f6b
Author: David du Colombier <0intro@gmail.com>
Date: Wed Feb 15 14:36:20 2012 -0500
runtime: define NSIG to fix plan 9 build
R=rsc
CC=golang-dev
https://golang.org/cl/5677053
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/1064f3a97bf44b2737f48545f7955efaa7ff4f6b
元コミット内容
runtime: define NSIG to fix plan 9 build
R=rsc
CC=golang-dev
https://golang.org/cl/5677053
変更の背景
このコミットの背景には、Go言語のランタイムがPlan 9オペレーティングシステム上で正しくビルドできないという問題がありました。Goランタイムは、様々なオペレーティングシステムに対応するために、OS固有のヘッダーファイルや定義を利用しています。Unix系システムでは、シグナル(プロセス間通信やイベント通知のメカニズム)の総数を表すNSIG
というマクロが一般的に定義されています。
しかし、Plan 9はUnixとは異なる設計思想を持つOSであり、シグナル処理のメカニズムも異なります。そのため、GoランタイムがPlan 9向けにコンパイルされる際、内部的にNSIG
を参照する箇所があったにもかかわらず、Plan 9のシステムヘッダーにはNSIG
の定義が存在しなかったため、コンパイルエラーが発生していました。このコミットは、このビルドエラーを解消し、GoランタイムがPlan 9環境でも問題なくコンパイル・実行できるようにするために行われました。
前提知識の解説
Plan 9 from Bell Labs
Plan 9は、ベル研究所で開発された分散オペレーティングシステムです。Unixの設計者の一部が関与しており、Unixの概念をさらに推し進めたものとして知られています。Plan 9の最大の特徴は、「すべてがファイルである」という哲学です。デバイス、ネットワーク接続、プロセスなど、システム内のあらゆるリソースがファイルとして表現され、標準的なファイルシステムインターフェースを通じてアクセスされます。これにより、システム管理やプログラミングが簡素化され、分散環境での透過性が高まります。
Plan 9は、Unixとは異なるカーネルアーキテクチャとシステムコールインターフェースを持っています。そのため、Unix系OS向けに書かれたソフトウェアをPlan 9に移植する際には、OS固有の低レベルな部分(例えば、シグナル処理、プロセス管理、ファイルI/Oなど)をPlan 9の流儀に合わせて調整する必要があります。
シグナル (Signals)
Unix系オペレーティングシステムにおけるシグナルは、プロセスに対して非同期的にイベントを通知するためのメカニズムです。例えば、Ctrl+Cを押すとSIGINT
シグナルがプロセスに送られ、プロセスを終了させることができます。シグナルにはそれぞれ固有の番号が割り当てられており、NSIG
は通常、システムがサポートするシグナルの総数を定義するマクロまたは定数です。Goランタイムのような低レベルのシステムプログラミングを行う際には、OSのシグナル処理メカニズムと連携する必要があるため、NSIG
のような定義が重要になることがあります。
Goランタイム (Go Runtime)
Goランタイムは、Goプログラムの実行を管理する非常に重要なコンポーネントです。これには、ゴルーチン(軽量スレッド)のスケジューリング、ガベージコレクション、メモリ割り当て、そしてオペレーティングシステムとの低レベルな相互作用(システムコール、シグナル処理など)が含まれます。Go言語がクロスプラットフォームであるためには、ランタイムが各OSの特性に合わせて適切に動作するように設計されている必要があります。OS固有の機能や定義に依存する部分は、runtime
パッケージ内のOS固有のファイル(例: os_plan9.h
, os_linux.h
, os_darwin.h
など)で処理されます。
技術的詳細
Goランタイムは、内部的にシグナル関連の処理を行う際に、NSIG
というシンボルを参照するコードパスが存在していたと考えられます。これは、Goランタイムが様々なOSに対応するために、共通のインターフェースやデータ構造を維持しつつ、OS固有の差異を吸収する設計になっているためです。
Plan 9はUnixとはシグナルモデルが根本的に異なるため、Plan 9の標準的なヘッダーファイルにはNSIG
のようなUnix特有のシグナル総数を定義するマクロは存在しません。このNSIG
の欠如が、Goランタイムのコンパイル時に「未定義のシンボル」エラーを引き起こしていました。
このコミットでは、#define NSIG 1
という行をsrc/pkg/runtime/os_plan9.h
に追加することで、このコンパイルエラーを回避しています。NSIG
を1
と定義することは、Plan 9がUnixのような多数のシグナルをサポートしていることを意味するわけではありません。むしろ、Goランタイムが内部的にNSIG
の定義を必要とするが、Plan 9のコンテキストではその値が1
(つまり、最小限の、あるいは形式的なシグナル関連の考慮で十分)で問題ないことを示唆しています。これは、GoランタイムがPlan 9のシグナル処理を完全にエミュレートするのではなく、ビルド要件を満たすための実用的なワークアラウンドである可能性が高いです。
コアとなるコードの変更箇所
--- a/src/pkg/runtime/os_plan9.h
+++ b/src/pkg/runtime/os_plan9.h
@@ -66,3 +66,4 @@ struct Tos {
/* top of stack is here */
};
+#define NSIG 1
コアとなるコードの解説
変更はsrc/pkg/runtime/os_plan9.h
ファイルに対して行われています。このファイルは、GoランタイムがPlan 9オペレーティングシステムと連携するために必要な、OS固有の定義や構造体を含むヘッダーファイルです。
追加された行は以下の通りです。
#define NSIG 1
この行は、プリプロセッサディレクティブ#define
を使用して、NSIG
というマクロを1
という値で定義しています。これにより、Goランタイムのソースコード内でNSIG
が参照された際に、コンパイラがその定義を見つけることができるようになります。
NSIG
を1
と定義することは、Plan 9がUnixのような多数のシグナルをサポートしているわけではないことを考慮した上での、Goランタイムのビルド要件を満たすための最小限の対応です。Goランタイムの内部ロジックが、例えばシグナルハンドラの配列のサイズを決定するためにNSIG
を参照していた場合、この定義によって配列のサイズが1
となり、コンパイルが通るようになります。これは、Plan 9のシグナルモデルがGoランタイムの期待する複雑なシグナル処理を必要としない、あるいはGoランタイムがPlan 9上でシグナルを限定的にしか利用しないことを示唆しています。
この変更は、GoランタイムのPlan 9への移植性を高め、特定のOS環境でのビルド問題を解決するための、ターゲットOSの特性を考慮した具体的な修正例と言えます。
関連リンク
- Go CL 5677053: https://golang.org/cl/5677053
参考にした情報源リンク
- (本解説の生成にあたり、特定の外部情報源へのリンクは使用していません。Go言語のランタイム、Plan 9オペレーティングシステム、およびUnix系OSにおけるシグナルに関する一般的な知識に基づいています。)