[インデックス 1827] ファイルの概要
このコミットは、Go言語の初期開発段階において、InfernoオペレーティングシステムのツールチェインからARMアーキテクチャ向けのアセンブラ (5a
)、Cコンパイラ (5c
)、およびリンカ (5l
) のコードをインポートしたものです。これにより、Go言語がARMプラットフォームをターゲットとするための基盤が築かれました。
コミット
- コミットハッシュ:
db3a21d7c68bad988b5238ef48ae491c782fb105
- Author: Kai Backman kaib@golang.org
- Date: Fri Mar 13 15:03:07 2009 -0700
- DELTA: 19042 (19042 added, 0 deleted, 0 changed)
- OCL: 26268
- CL: 26270
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/db3a21d7c68bad988b5238ef48ae491c782fb105
元コミット内容
5a 5c 5l from inferno distribution
R=rsc
APPROVED=rsc
DELTA=19042 (19042 added, 0 deleted, 0 changed)
OCL=26268
CL=26270
変更の背景
Go言語は、その設計思想において、Plan 9やInfernoといったベル研究所のオペレーティングシステムから大きな影響を受けています。特に、Go言語の初期のツールチェインは、これらのシステムで培われた技術を基盤として構築されました。
このコミットが行われた2009年3月は、Go言語がまだ一般に公開される前の初期開発段階にあたります。Go言語は当初から移植性を重視しており、様々なアーキテクチャをサポートする計画がありました。ARMアーキテクチャは、当時からモバイルデバイスや組み込みシステムで広く利用されており、将来的なGo言語の普及を考えると、ARMサポートは不可欠でした。
Inferno OSのツールチェインは、Plan 9の哲学を受け継ぎ、シンプルでモジュール化された設計が特徴です。5a
(ARMアセンブラ)、5c
(ARM Cコンパイラ)、5l
(ARMリンカ) は、Inferno環境でARMプロセッサをターゲットとするために開発された既存の成熟したツールでした。これらのツールをGoプロジェクトにインポートすることで、Go言語のARMサポートを迅速に確立し、コンパイラやリンカの基本的な機能をゼロから開発する手間を省くことができました。これは、Go言語の初期開発における効率的なアプローチと言えます。
前提知識の解説
Inferno OSとPlan 9
- Inferno OS: ベル研究所で開発されたポータブルな分散オペレーティングシステムです。全てのシステムリソースをファイルとして表現する「全てがファイル」というユニークな設計思想を持ち、Styx (9P) という標準通信プロトコルを使用してリソースにアクセスします。アプリケーションは主にLimboプログラミング言語で書かれ、仮想マシン上で実行されるアーキテクチャ非依存のDisバイトコードにコンパイルされます。
- Plan 9 from Bell Labs: Unixの後継としてベル研究所で開発された分散オペレーティングシステムです。Inferno OSと同様に「全てがファイル」の原則を徹底し、シンプルで単一目的のツールを組み合わせて複雑なタスクを解決する「配管 (plumbing)」の概念を重視しています。Go言語の設計とツールチェインは、Plan 9の哲学と開発者たちから大きな影響を受けています。
Plan 9/Infernoのツールチェイン命名規則
Plan 9およびInfernoのツールチェインでは、特定のアーキテクチャをターゲットとするコンパイラ、アセンブラ、リンカに特徴的な命名規則が用いられます。これは X
に数字、c
, a
, l
のいずれかの文字を組み合わせる形式です。
Xc
: 特定のアーキテクチャ向けのCコンパイラ。Xa
: 特定のアーキテクチャ向けのアセンブラ。Xl
: 特定のアーキテクチャ向けのリンカ。
このコミットにおける 5a
, 5c
, 5l
は、それぞれARMアーキテクチャ (5
はARMを指す慣例) 向けのアセンブラ、Cコンパイラ、リンカを意味します。
ARMアーキテクチャ
ARM (Advanced RISC Machine) は、RISC (Reduced Instruction Set Computer) アーキテクチャに基づくプロセッサファミリです。低消費電力と高性能を両立できるため、スマートフォン、タブレット、組み込みシステム、IoTデバイスなど、幅広い分野で広く採用されています。Go言語がARMをサポートすることは、これらのデバイスでGoアプリケーションを実行可能にする上で非常に重要でした。
技術的詳細
このコミットは、Inferno OSのソースコードからARMアーキテクチャ向けのコンパイラ、アセンブラ、リンカのコードをGoプロジェクトに直接取り込むものです。これにより、Go言語はARMバイナリを生成するための基本的なツールセットを手に入れました。
5a
(ARMアセンブラ): アセンブリ言語で書かれたソースコードを機械語に変換する役割を担います。Go言語のコンパイラが生成するアセンブリコードを、最終的な実行可能バイナリに含めるためのオブジェクトファイルに変換します。5c
(ARM Cコンパイラ): C言語で書かれたソースコードをARMアーキテクチャ向けの機械語に変換します。Go言語のランタイムや標準ライブラリの一部はC言語で書かれているため、これらのコンパイルに必要となります。また、Goコンパイラ自体もC言語で書かれていたため、そのビルドにも利用されました。5l
(ARMリンカ): コンパイルされたオブジェクトファイルやライブラリを結合し、最終的な実行可能バイナリを生成します。異なるモジュールやライブラリが連携して動作するために不可欠なツールです。
これらのツールは、Go言語のクロスコンパイル能力の基盤となります。開発者は、例えばx86アーキテクチャのマシン上でGoコードを書き、それをARMアーキテクチャ向けにコンパイルして、Raspberry PiなどのARMデバイス上で実行できるようになります。
コミットの DELTA=19042
は、このコミットで19042行のコードが追加されたことを示しており、これは既存のInfernoツールチェインのコードベースがほぼそのまま取り込まれたことを意味します。
コアとなるコードの変更箇所
このコミットでは、以下のディレクトリとファイルが新規に追加されています。
src/cmd/5a/
: ARMアセンブラ (5a
) のソースコードsrc/cmd/5a/a.h
: アセンブラのヘッダファイルsrc/cmd/5a/a.y
: Yacc/Bisonで記述されたアセンブラの文法定義ファイルsrc/cmd/5a/lex.c
: アセンブラの字句解析器のC言語ソースファイル
src/cmd/5c/
: ARM Cコンパイラ (5c
) のソースコードsrc/cmd/5c/5.out.h
: コンパイラの出力形式に関するヘッダファイルsrc/cmd/5c/cgen.c
: コード生成に関するC言語ソースファイルsrc/cmd/5c/gc.h
: ガベージコレクションに関するヘッダファイル (コンパイラ内部で使用)src/cmd/5c/list.c
: リスト処理に関するC言語ソースファイルsrc/cmd/5c/mkenam
: 列挙型生成スクリプトsrc/cmd/5c/mul.c
: 乗算処理に関するC言語ソースファイルsrc/cmd/5c/peep.c
: ピーフホール最適化に関するC言語ソースファイルsrc/cmd/5c/reg.c
: レジスタ割り当てに関するC言語ソースファイルsrc/cmd/5c/sgen.c
: スタックフレーム生成に関するC言語ソースファイルsrc/cmd/5c/swt.c
: switch文の処理に関するC言語ソースファイルsrc/cmd/5c/txt.c
: テキスト処理に関するC言語ソースファイル
src/cmd/5l/
: ARMリンカ (5l
) のソースコードsrc/cmd/5l/asm.c
: アセンブリコード処理に関するC言語ソースファイルsrc/cmd/5l/l.h
: リンカのヘッダファイルsrc/cmd/5l/list.c
: リスト処理に関するC言語ソースファイルsrc/cmd/5l/noop.c
: NOP命令処理に関するC言語ソースファイルsrc/cmd/5l/obj.c
: オブジェクトファイル処理に関するC言語ソースファイルsrc/cmd/5l/optab.c
: オペレーションテーブルに関するC言語ソースファイルsrc/cmd/5l/pass.c
: リンカのパス処理に関するC言語ソースファイルsrc/cmd/5l/span.c
: コードスパン処理に関するC言語ソースファイルsrc/cmd/5l/thumb.c
: ARM Thumb命令セットに関するC言語ソースファイル
コアとなるコードの解説
このコミットで追加されたファイル群は、ARMアーキテクチャ向けのコンパイラ、アセンブラ、リンカの完全なセットを構成しています。
- ヘッダファイル (
.h
): データ構造の定義、マクロ、関数プロトタイプなど、他のソースファイルから参照される共通の定義が含まれます。例えばa.h
はアセンブラの内部構造を定義し、5.out.h
はコンパイラやリンカが生成するオブジェクトファイルのフォーマットや命令コードの定義を含みます。 - Yacc/Bison文法ファイル (
.y
):a.y
はアセンブリ言語の文法を定義しており、Yacc (Yet Another Compiler Compiler) またはBisonによってC言語のパーサコードが生成されます。これにより、アセンブラは入力されたアセンブリコードを正しく解釈できます。 - 字句解析器ファイル (
lex.c
):lex.c
は、アセンブリ言語のソースコードをトークン(キーワード、識別子、数値など)に分割する字句解析器の実装を含みます。これはコンパイラのフロントエンドの一部であり、パーサが文法解析を行う前の段階で必要です。 - C言語ソースファイル (
.c
): 各.c
ファイルは、コンパイラ、アセンブラ、リンカの特定の機能の実装を含みます。cgen.c
: コンパイラの主要な部分で、高レベルのコードからターゲットアーキテクチャ(ARM)の機械語に近い中間表現を生成する役割を担います。peep.c
: ピーフホール最適化は、生成された機械語コードを局所的に見て、より効率的な命令シーケンスに置き換える最適化手法です。reg.c
: レジスタ割り当ては、プログラムの変数をプロセッサのレジスタに効率的に割り当てることで、メモリアクセスを減らし、実行速度を向上させる重要な最適化ステップです。asm.c
,obj.c
,pass.c
: リンカの主要なコンポーネントで、オブジェクトファイルの読み込み、シンボル解決、アドレスの再配置、最終的な実行可能バイナリの生成を行います。thumb.c
: ARMプロセッサには、よりコンパクトな16ビット命令セットであるThumbモードがあります。このファイルはThumb命令セットのサポートに関連するコードを含んでいる可能性があります。
これらのファイルは、Inferno OSのツールチェインから直接移植されたものであり、Go言語がARMプラットフォームで動作するための基盤となる低レベルのコンパイルおよびリンク機能を提供します。
関連リンク
参考にした情報源リンク
- Inferno operating system - Wikipedia
- Go language ARM architecture support history - go.dev (Go 1.5 release notes, which mentions ARM support)
- Plan 9 from Bell Labs toolchain philosophy - 9p.io
- The Go Programming Language and The Go Project - go.dev
- Inferno OS - inferno-os.org
- Go and the Plan 9 from Bell Labs - YouTube
- Go on ARM - github.com/golang/go