[インデックス 11533] ファイルの概要
このコミットは、Go言語のビルドプロセスにおいて、Plan 9オペレーティングシステム向けの必要なヘッダーファイル群をGoのソースツリー内に追加することを目的としています。これにより、Plan 9上でのGoのビルドがより自己完結的になり、$GOROOT
外のファイルを変更する必要がなくなります。
コミット
- コミットハッシュ:
cc777490fbe5f0c6575f4e84dea31b7d745d747e
- 作者: Anthony Martin ality@pbrane.org
- 日付: Tue Jan 31 18:14:44 2012 -0800
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/cc777490fbe5f0c6575f4e84dea31b7d745d747e
元コミット内容
build: add include files for Plan 9
Previously, I had made available a tarball of
the modified system headers that were necessary
to build on Plan 9 but that was only a stopgap.
I think this method is much better since no
files outside of $GOROOT will have to be added
or modified during the build process.
Also, this is just the first step. I'll change
the build to reference these files in another CL
(that also contains a few more Makefile changes).
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5552056
変更の背景
Go言語は、その設計思想や初期開発において、Bell LabsのPlan 9オペレーティングシステムから大きな影響を受けています。Goの初期のコンパイラやツールチェインは、Plan 9のツールチェイン(8c
, 6c
, 5c
などのコンパイラや8l
, 6l
, 5l
などのリンカ)をベースにしていました。そのため、GoをPlan 9上でビルドし、実行できることは、プロジェクトにとって重要な目標の一つでした。
このコミット以前は、Plan 9上でGoをビルドするためには、Goのソースツリー外にあるシステムヘッダーファイルを修正したり、特別なtarballから取得したヘッダーファイルを追加したりする必要がありました。これは一時的な(stopgap)解決策であり、ビルドプロセスの複雑性を増し、環境構築の手間を増やしていました。
このコミットの背景にあるのは、Goのビルドプロセスをより堅牢で、移植性が高く、自己完結的なものにするという目標です。特に、$GOROOT
(Goのインストールディレクトリ)外のファイルに依存することなく、Goのソースツリー内だけでPlan 9向けのビルドを完結させることが望まれました。これにより、開発者やユーザーがPlan 9上でGoをビルドする際の障壁が大幅に低減されます。コミットメッセージにもあるように、これは「最初のステップ」であり、これらの新しいヘッダーファイルを参照するようにビルドシステム(Makefileなど)を変更する作業が後続のコミットで予定されていました。
前提知識の解説
Plan 9 from Bell Labs
Plan 9 from Bell Labsは、ベル研究所で開発された分散オペレーティングシステムです。Unixの後継として設計され、以下の特徴を持ちます。
- すべてがファイル: Plan 9では、デバイス、ネットワーク接続、プロセス間通信など、システム内のあらゆるリソースがファイルとして表現されます。これにより、シンプルなファイルシステムインターフェースを通じて複雑な操作が可能になります。
- 名前空間: 各プロセスは独自の「名前空間」を持ち、ファイルシステムツリーを自由にマウント・アンマウントできます。これにより、柔軟なリソース管理と分離が実現されます。
- ユニコード: システム全体でUnicode(UTF-8)が採用されており、多言語対応が組み込まれています。
- 分散システム: ネットワーク透過性が高く、異なるマシン上のリソースをあたかもローカルにあるかのように扱えます。
- 独自のツールチェイン: Plan 9には、独自のCコンパイラ(
8c
,6c
,5c
など、それぞれ異なるアーキテクチャ向け)、アセンブラ、リンカ、デバッガなどのツールチェインが存在します。Goの初期のツールチェインは、これらのPlan 9ツールチェインの設計思想と実装を強く継承していました。
システムヘッダーファイル
C言語やGo言語(特にCgoを使用する場合や、Goのランタイム自体をビルドする場合)のようなコンパイル言語では、オペレーティングシステムが提供する機能(システムコール、ライブラリ関数、データ構造など)を利用するために、システムヘッダーファイル(.h
ファイル)が必要です。これらのヘッダーファイルには、関数プロトタイプ、マクロ定義、構造体定義などが含まれており、コンパイラがOSのAPIを正しく理解し、コードを生成するために不可欠です。
Plan 9のような独自のOSでは、そのシステムコールやデータ構造がUnix系OSとは異なるため、GoがPlan 9上で動作するためには、Plan 9固有のヘッダーファイルが必要になります。
Goのビルドプロセスとクロスコンパイル
Goは、その設計当初からクロスコンパイルを強力にサポートしています。これは、あるOS/アーキテクチャ上で、別のOS/アーキテクチャ向けのバイナリを生成できる能力です。Goのビルドシステムは、GOOS
(ターゲットOS)とGOARCH
(ターゲットアーキテクチャ)という環境変数に基づいて、適切なソースファイルやライブラリを選択し、コンパイルを行います。
このコミットは、Plan 9 (GOOS=plan9
) 向けのビルドにおいて、必要なヘッダーファイルをGoのソースツリー内に直接含めることで、クロスコンパイルの依存関係を簡素化し、ビルドの信頼性を向上させる一環です。
技術的詳細
このコミットで追加されたヘッダーファイルは、Goのランタイムや標準ライブラリがPlan 9のシステムAPIと正しく連携するために必要な定義を提供します。
-
include/plan9/386/u.h
:- Plan 9の
u.h
ヘッダーをインクルードしています。これは、Plan 9のユーザーレベルプログラムで一般的に使用される基本的な型定義やマクロが含まれるヘッダーです。 typedef
を用いて、Plan 9のプリミティブ型(char
,uchar
,short
,ushort
,int
,uint
,vlong
,uvlong
)を、Goのランタイムが期待する固定幅整数型(int8
,uint8
,int16
,uint16
,int32
,uint32
,int64
,uint64
)にマッピングしています。これは、異なるシステム間でのデータ型のサイズや表現の違いを吸収し、Goのコードが期待するデータ型でPlan 9のAPIとやり取りできるようにするために重要です。
- Plan 9の
-
include/plan9/libc.h
:- Plan 9の標準Cライブラリ(
libc.h
)と文字型ユーティリティ(ctype.h
)のヘッダーをインクルードしています。 Runemax
という定数を定義しています。これはUnicodeの最大ルーン値(0x10FFFF
)を示しており、Plan 9がUnicodeをネイティブにサポートしていることを反映しています。Go言語もUnicodeを強力にサポートしているため、この定義は文字エンコーディングの互換性を保証します。#pragma src
と#pragma lib
ディレクティブは、Plan 9のビルドシステム(mk
)やリンカに対して、対応するソースファイルやライブラリのパスを指示するものです。これらは、GoのランタイムがPlan 9のlib9.a
ライブラリ(Plan 9の基本的なシステムコールやユーティリティ関数を提供するライブラリ)にリンクするために必要です。getgoos
,getgoarch
,getgoroot
,getgoversion
といった関数プロトタイプが宣言されています。これらは、Goのランタイムが自身の実行環境に関する情報をPlan 9システムから取得するためのインターフェースを提供するものと考えられます。
- Plan 9の標準Cライブラリ(
-
include/plan9/mach.h
:- Plan 9の
libmach
ライブラリに関連するヘッダーです。libmach
は、デバッガやプロファイラなどのツールが、実行中のプロセスのメモリやレジスタの状態を検査するために使用する低レベルのインターフェースを提供します。 #pragma src
と#pragma lib
ディレクティブは、libmach.a
ライブラリへのリンクを指示しています。#include "../mach.h"
は、Goのソースツリー内の別のmach.h
ヘッダーをインクルードしている可能性があり、これはGoの内部的な機械語レベルの操作やデバッグ関連の定義とPlan 9のlibmach
の連携を示唆しています。
- Plan 9の
-
include/plan9/ureg_amd64.h
,include/plan9/ureg_arm.h
,include/plan9/ureg_x86.h
:- これらは、特定のCPUアーキテクチャ(AMD64, ARM, x86)向けの
ureg.h
ヘッダーをインクルードしています。 ureg.h
(User Registers)は、通常、オペレーティングシステムのカーネルやデバッガが、ユーザープロセスのレジスタの状態を保存・復元したり、例外やシステムコール発生時にレジスタ情報を扱ったりするために使用する構造体や定義を含みます。Goのランタイムがシグナルハンドリングやスタックトレース、デバッグなどの低レベルな操作を行う際に、これらのアーキテクチャ固有のレジスタ定義が必要となります。
- これらは、特定のCPUアーキテクチャ(AMD64, ARM, x86)向けの
これらのヘッダーファイルは、GoのランタイムがPlan 9のシステムコールを呼び出したり、Plan 9のプロセスモデルやメモリ管理と連携したり、デバッグ情報を正しく扱ったりするために不可欠な、OS固有のインターフェースを提供します。
コアとなるコードの変更箇所
このコミットでは、以下の6つの新しいファイルがinclude/plan9/
ディレクトリ以下に追加されました。
-
include/plan9/386/u.h
// Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. #include "/386/include/u.h" typedef char int8; typedef uchar uint8; typedef short int16; typedef ushort uint16; typedef int int32; typedef uint uint32; typedef vlong int64; typedef uvlong uint64;
-
include/plan9/libc.h
// Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. #include "/sys/include/libc.h" #include "/sys/include/ctype.h" enum { Runemax = 0x10FFFF, /* maximum rune value */ }; #pragma src "/sys/src/go/src/lib9" #pragma lib "/sys/src/go/lib/$M/lib9.a" char* getgoos(void); char* getgoarch(void); char* getgoroot(void); char* getgoversion(void);
-
include/plan9/mach.h
// Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. #pragma src "/sys/src/go/src/libmach" #pragma lib "/sys/src/go/lib/$M/libmach.a" #include "../mach.h"
-
include/plan9/ureg_amd64.h
// Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. #include "/amd64/include/ureg.h"
-
include/plan9/ureg_arm.h
// Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. #include "/arm/include/ureg.h"
-
include/plan9/ureg_x86.h
// Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. #include "/386/include/ureg.h"
コアとなるコードの解説
これらのファイルは、GoのビルドシステムがPlan 9をターゲットとする際に、Plan 9のネイティブなCヘッダーファイルに相当する定義をGoのソースツリー内に提供します。
-
型定義の統一 (
u.h
):include/plan9/386/u.h
は、Plan 9の基本的な型をGoのランタイムが期待する固定幅の整数型にマッピングすることで、Goの内部コードとPlan 9のシステムAPIとの間のデータ型互換性を確保します。これは、特に低レベルのシステムプログラミングにおいて、異なるアーキテクチャやOS間でのデータ表現の違いによる問題を避けるために不可欠です。 -
標準ライブラリとシステム情報 (
libc.h
):include/plan9/libc.h
は、Plan 9の標準Cライブラリへのインターフェースを提供し、Unicodeの最大ルーン値のようなPlan 9固有の定義を含みます。また、#pragma src
や#pragma lib
ディレクティブを通じて、GoのビルドシステムがPlan 9のlib9.a
ライブラリに正しくリンクできるように指示します。getgoos
などの関数プロトタイプは、Goのランタイムが自身の実行環境(OS、アーキテクチャ、GOROOTなど)に関する情報をPlan 9システムから取得するためのメカニズムを提供します。 -
デバッグと低レベル操作 (
mach.h
,ureg_*.h
):include/plan9/mach.h
とinclude/plan9/ureg_*.h
ファイルは、GoのランタイムがPlan 9上でデバッグ、プロファイリング、シグナルハンドリング、スタックトレースなどの低レベルな操作を行うために必要な定義を提供します。これらは、Plan 9のlibmach
ライブラリや、各アーキテクチャ(x86, AMD64, ARM)固有のレジスタ情報(ureg.h
)へのアクセスを可能にし、GoのランタイムがOSの内部状態を正しく解釈・操作できるようにします。
これらのヘッダーファイルがGoのソースツリー内に直接含まれることで、Plan 9上でのGoのビルドは、外部の依存関係に煩わされることなく、より安定し、再現性が高くなります。これは、Goの移植性とビルドプロセスの簡素化に向けた重要な一歩でした。
関連リンク
- Go CL 5552056: https://golang.org/cl/5552056
参考にした情報源リンク
- Plan 9 from Bell Labs Official Site: https://9p.io/plan9/
- Go Language Blog - Go and the Modern OS: https://go.dev/blog/os (GoのOSとの関係性について一般的な情報)
- Go Language Blog - A Tour of Go's Tooling: https://go.dev/blog/go-tooling (Goのツールチェインに関する一般的な情報)
- Plan 9 C Programming: https://9p.io/sys/doc/compiler.html (Plan 9のCコンパイラとヘッダーに関する一般的な情報)
- Plan 9
u.h
documentation (example): https://9p.io/sys/man/3/u.html - Plan 9
libc.h
documentation (example): https://9p.io/sys/man/3/libc.html - Plan 9
ureg.h
documentation (example): https://9p.io/sys/man/3/ureg.html - Plan 9
mach.h
documentation (example): https://9p.io/sys/man/3/mach.html - Go's relationship with Plan 9 (general discussion): https://en.wikipedia.org/wiki/Go_(programming_language)#Design
- Go's early build process and Plan 9 tools (general discussion): https://go.dev/doc/install/source (Historical context may be found in older versions of this document or related discussions.)