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

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

このコミットは、Go言語のビルドシステムにおいて、Plan 9オペレーティングシステムのARMアーキテクチャ向けにu.hヘッダーファイルを追加するものです。これにより、GoがPlan 9上のARM環境で適切に動作するための基盤が強化されます。

コミット

commit 1e4515a3239666b043751cdd20bc8abf61d75ef3
Author: Lucio De Re <lucio.dere@gmail.com>
Date:   Sun Oct 21 17:04:07 2012 -0400

    build: u.h for plan9 arm
    
    R=golang-dev, minux.ma, ality
    CC=golang-dev
    https://golang.org/cl/6743052
---
 include/plan9/arm/u.h | 14 ++++++++++++++\n 1 file changed, 14 insertions(+)\n
diff --git a/include/plan9/arm/u.h b/include/plan9/arm/u.h
new file mode 100644
index 0000000000..c387ae7b18
--- /dev/null
+++ b/include/plan9/arm/u.h
@@ -0,0 +1,14 @@
+// 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/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;

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

https://github.com/golang/go/commit/1e4515a3239666b043751cdd20bc8abf61d75ef3

元コミット内容

build: u.h for plan9 arm

このコミットは、Go言語のビルドプロセスにおいて、Plan 9オペレーティングシステムのARMアーキテクチャ向けにu.hヘッダーファイルを追加するものです。

変更の背景

Go言語は、その設計思想や初期開発者の経緯から、Plan 9オペレーティングシステムと深い関係があります。Goの主要な設計者であるRob PikeとKen Thompsonは、Bell LabsでPlan 9の開発に携わっていました。そのため、GoはPlan 9の多くの概念(例えば、ファイルシステム中心のアプローチやUTF-8のネイティブサポートなど)から影響を受けています。

Goはクロスコンパイルを強力にサポートしており、様々なオペレーティングシステムとアーキテクチャの組み合わせで動作するように設計されています。このコミットが行われた2012年当時、GoはPlan 9のサポートを強化しており、特にARMアーキテクチャ上での動作を可能にするための作業が進められていました。

u.hファイルは、Plan 9システムにおける基本的な型定義やマクロを含む重要なヘッダーファイルです。特定のアーキテクチャ(この場合はARM)上でGoが正しくコンパイルされ、Plan 9のシステムコールやデータ構造と連携するためには、そのアーキテクチャに特化したu.hの定義が必要となります。このコミットは、Plan 9 ARM環境でのGoのビルドを可能にするための、この重要なヘッダーファイルの追加を目的としています。

前提知識の解説

Plan 9オペレーティングシステム

Plan 9 from Bell Labsは、1980年代半ばにBell LabsのComputing Science Research Center (CSRC) で開発された分散オペレーティングシステムです。UNIXの概念を基盤としつつ、「すべてはファイルである」というUNIXの哲学をさらに推し進め、ネットワーク上のリソース(CPU、ストレージ、デバイスなど)もすべてファイルとして表現し、標準的なファイル操作でアクセスできるように設計されています。

主な特徴は以下の通りです。

  • 「すべてはファイル」の原則: デバイス、ネットワーク接続、プロセスなども含め、システム内のあらゆるリソースがファイルとして表現されます。
  • 分散システム: 複数のコンピュータがネットワークを通じて連携し、あたかも単一のシステムであるかのように機能します。
  • 9Pプロトコル: ファイルアクセスに特化したシンプルで強力なネットワークプロトコルであり、Plan 9の分散システムの基盤となっています。
  • プロセスごとの名前空間: 各プロセスが独立した名前空間を持ち、リソースの参照方法を柔軟にカスタマイズできます。
  • UTF-8のネイティブサポート: UTF-8をシステム全体で完全にサポートした最初のOSの一つです。

Plan 9は、その革新的なアイデアの多くが、Linuxの/procファイルシステム、コンテナ技術、ユニオンファイルシステムなど、現代の他のOSに影響を与えています。

ARMアーキテクチャ

ARM (Advanced RISC Machine) は、Arm Holdingsが設計・ライセンス供与しているRISC (Reduced Instruction Set Computing) 命令セットアーキテクチャのファミリーです。x86のようなCISCアーキテクチャとは異なり、ARMはよりシンプルで効率的な命令セットを持ち、特に低消費電力と高性能のバランスに優れています。

主な特徴は以下の通りです。

  • RISC設計: 命令セットが簡素化されており、各命令が高速に実行されます。
  • 高いエネルギー効率: 消費電力が低いため、スマートフォン、タブレット、組み込みシステムなど、バッテリー駆動のデバイスで広く採用されています。
  • 幅広い採用: モバイルデバイス市場を席巻しているだけでなく、近年ではサーバーや高性能コンピューティング分野でも採用が拡大しています。
  • ライセンスモデル: Arm HoldingsはISA(命令セットアーキテクチャ)を設計し、それを他の企業(Apple, Qualcomm, Samsungなど)にライセンス供与することで、各企業が独自のARMベースのプロセッサを開発・製造できるようにしています。

u.hヘッダーファイル

Plan 9システムにおけるu.h(おそらく "universal" または "utilities" の略)は、システム全体で共通して使用される基本的な型定義やマクロを含む重要なヘッダーファイルです。これは、C言語で書かれたPlan 9のプログラムが、異なるアーキテクチャ間で移植性を保ちつつ、システム固有のデータ型を適切に扱うために不可欠です。

u.hの主な役割は以下の通りです。

  • 基本データ型の定義: int8, uint8, int16, uint16, int32, uint32, int64, uint64といった、固定幅の整数型を定義します。これらは、異なるアーキテクチャ間でのデータサイズの差異を吸収し、プログラムの移植性を高めるために重要です。
  • アーキテクチャ依存性: u.hは、Plan 9のヘッダーファイルの中でも数少ないアーキテクチャ依存のファイルの一つです。これは、特定のCPUアーキテクチャ(例: x86, ARM)に合わせて、データ型のサイズやアライメント、その他の低レベルな定義が調整される必要があるためです。
  • 広範なインクルード: Plan 9のほとんどの他のヘッダーファイルやCプログラムは、u.hをインクルードしており、システム開発における基本的なビルディングブロックとなっています。

Go言語がPlan 9上で動作する場合、Goのランタイムや標準ライブラリがPlan 9のシステムコールやデータ構造と正しく連携するためには、これらの基本的な型定義がGoのビルドプロセスに認識される必要があります。このコミットは、そのためのu.hファイルをARMアーキテクチャ向けに提供するものです。

技術的詳細

Go言語は、そのビルドプロセスにおいて、ターゲットとなるオペレーティングシステム (GOOS) とアーキテクチャ (GOARCH) に応じて、異なるソースファイルやヘッダーファイルを選択的にコンパイルする仕組みを持っています。これは、Goの強力なクロスコンパイル機能の基盤となっています。

このコミットでは、include/plan9/arm/u.hという新しいファイルが追加されています。このパスは、GoのビルドシステムがPlan 9 (plan9) オペレーティングシステム上でARM (arm) アーキテクチャ向けにコンパイルする際に、このヘッダーファイルを自動的に選択するように構成されていることを示唆しています。

ファイルの内容は、主にC言語のtypedefを用いて、固定幅の整数型を定義しています。

  • char -> int8
  • uchar -> uint8
  • short -> int16
  • ushort -> uint16
  • int -> int32
  • uint -> uint32
  • vlong -> int64
  • uvlong -> uint64

これらの定義は、Plan 9のC言語環境における標準的な型エイリアスをGoのビルドシステムに提供するものです。Goのコンパイラやランタイムは、Cgo(GoとCの相互運用機能)を通じてC言語のコードと連携する際に、これらの型定義を参照します。特に、システムコールや低レベルな操作を行う際には、正確なデータ型サイズと表現が不可欠です。

また、#include "/arm/include/u.h"という行は、このファイル自体が、より一般的なARMアーキテクチャ向けのu.hファイル(おそらくPlan 9のシステムに含まれるもの)をインクルードしていることを示しています。これは、Plan 9のヘッダーファイルの階層構造を反映しており、特定のOS-アーキテクチャの組み合わせに特化した定義が、より汎用的な定義の上に構築されることを意味します。

この変更により、Goのツールチェインは、Plan 9 ARM環境でGoプログラムをコンパイルする際に、これらの正確な型定義を利用できるようになり、結果としてGoプログラムがPlan 9のARMシステム上で安定して動作するための互換性が向上します。

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

diff --git a/include/plan9/arm/u.h b/include/plan9/arm/u.h
new file mode 100644
index 0000000000..c387ae7b18
--- /dev/null
+++ b/include/plan9/arm/u.h
@@ -0,0 +1,14 @@
+// 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/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/arm/u.hファイルは、以下の要素で構成されています。

  1. 著作権表示:

    // 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.
    

    これは、Goプロジェクトの標準的な著作権表示であり、BSDスタイルのライセンスに従ってこのコードが使用されることを示しています。

  2. インクルード:

    #include "/arm/include/u.h"
    

    この行は、Plan 9システム内の/arm/include/u.hファイルをインクルードしています。これは、ARMアーキテクチャに特化した、より基本的なu.hの定義を取り込むことを意味します。これにより、このファイルで定義される型が、Plan 9の標準的なARM環境の型定義と整合性が保たれるようになります。

  3. 型定義 (typedef):

    typedef char   int8;
    typedef uchar  uint8;
    typedef short  int16;
    typedef ushort uint16;
    typedef int    int32;
    typedef uint   uint32;
    typedef vlong  int64;
    typedef uvlong uint64;
    

    これらのtypedefは、C言語の基本的な型(char, short, intなど)を、特定のビット幅を持つ型(int8, uint8, int16, uint16, int32, uint32, int64, uint64)にエイリアスしています。

    • charucharは通常8ビット。
    • shortushortは通常16ビット。
    • intuintは通常32ビット。
    • vlonguvlongはPlan 9で導入された型で、通常64ビットの符号付き/符号なし整数を表します。

これらの型定義は、GoのビルドシステムがPlan 9のARM環境でCgoを介してC言語のコードと連携する際に、データ型のサイズと表現を正確にマッピングするために不可欠です。これにより、GoのランタイムがPlan 9のシステムコールやデータ構造を正しく解釈し、メモリレイアウトの不一致によるバグを防ぐことができます。

関連リンク

参考にした情報源リンク