プログラミング言語SML#解説 4.1.0版
6 SML#プログラミング環境の準備

6.2 SML#コンパイラの構造とブートストラップ

この節の内容は,SML#コンパイラをインストールし使用する上で 理解する必要はありませんが,やや時間がかかるSML#コンパイラのインス トール処理の理解や,さらにコンパイラの一般的な構造を理解する上で有用と思 います.

SML#4.1.0版コンパイラは,SML#言語で書かれた ファイルを分割コンパイルし,ネイティブコードを生成します. 対話型モードも,このコンパイラを使い, (1) 現在の環境下で分割コンパイル, (2) システムとのリンク, (3) オブジェクトファイルの動的ロード を繰り返すことによって実現しています. SML#コンパイラはSML#言語,C言語,およびC++言語 で書かれており,さらに自分自身のコンパイル時に以下のツールを使用していま す.

  • ml-lex,ml-yacc.字句解析および構文解析ツール.

  • SMLFormat.プリンタ自動生成ツール

  • 基本ライブラリ

これらもSML#言語で書かれています.

SML#コンパイラは,各SML#ファイル(Standard MLファ イルを含む)をシステム標準のオブジェクトファイルにコンパイルします. コンパイルしたファイルは,システム標準のリンカによって 実行形式ファイルに結合できます. 従って,SML#コンパイラは,C/C++コンパイラとSML# コンパイラがあれば構築できます. しかし,もちろん,SML#コンパイラを初めてインストールする 時には,SML#コンパイラはまだ存在しません. SML#4.1.0版では,以下の手順でこのブートストラップの 問題を解決し,SML#をビルドしインストールしています.

  1. 1.

    C/C++で書かれたランタイムライブラリをコンパイルし静的リンク ライブラリを生成します.

  2. 2.

    SML#コンパイラのソースコードをコンパイルするのに十分な大きさの SML#コンパイラ(minismlsharp)を,古いSML#コンパイラで 事前にコンパイルしておき, SML#のソースツリーにコンパイル済みのLLVM IRファイルを用意しています.

  3. 3.

    インストール先のシステムの下で, minismlsharpのLLVM IRファイルをLLVMを用いてコンパイルし, ランタイムライブラリとリンクし, minismlsharpコマンドを生成します.

  4. 4.

    minismlsharpコマンドを用いて,SML#をコンパイルするための 各種ツールとライブラリ,およびSML#コンパイラをコンパイルします. このコンパイルは,ツールとライブラリの依存関係から,おおよそ 以下の順番で行われます.

    1. (a)

      基本ライブラリ(Basis Library)のコンパイル.

    2. (b)

      smllexコマンドのコンパイルとリンク.

    3. (c)

      ML-yaccライブラリとsmlyaccコマンドのコンパイルとリンク.

    4. (d)

      smllexおよびsmlyaccコマンドによるパーザの生成.

    5. (e)

      smlformatコマンドのコンパイルとリンク.

    6. (f)

      smlformatコマンドによるプリンタの生成.

    7. (g)

      すべてのライブラリのコンパイル.

    8. (h)

      smlsharpコマンドのコンパイルとリンク.

  5. 5.

    以下のファイルを所定の位置にインストールします.

    • ランタイムライブラリのライブラリファイル.

    • ライブラリのインターフェースファイル,オブジェクトファイル,および シグネチャファイル.

    • smllexsmlyaccsmlformatsmlsharpの 各コマンド.

これらは以上のステップが示す様に,各ソースファイルやコマンド間に は複雑な依存関係があります. さらに,いくつかのソースファイルの処理は,OSの環境に依存しています. これらは,大規模なシステムの典型です. これら依存関係を制御する一つの手法は,GNU Autoconfによるconfigureスクリプトとmakeコマンドの使用です. SML#コンパイラは,インターフェイスファイルに従って各ファイ ルをコンパイルします. 個別のファイルが必要とするファイルは,このインターフェイスファイル に記述されています. SML#コンパイラは,この依存関係をmakeコマンドが読み 込めるフォーマットで出力する機能を持っています.

  1. 1.

    smlsharp -MM smlFile. ソースファイルsmlFileを読み,このソースファイルを コンパイルするために必要なファイルのリストをMakefile形式で出力 します.

  2. 2.

    smlsharp -MMl smiFile. インターフェイスファイルsmiFileをトップレベルの ファイルとみなし,このトップレベルから生成されるべき実行形式コマンドの リンクに必要なオブジェクトファイルのリストをMakefile形式で出力します.

  3. 3.

    smlsharp -MMm smiFile. インターフェイスファイルsmiFileをトップレベルの ファイルとみなし,このトップレベルから生成されるべき実行形式ファイルを ビルドするためのMakefileを生成します.

SML#システムは,この機能を利用して,上記の手順を実行する Makefileを生成しています. このMakefileによって,通常の大規模システムの開発と同様,再 コンパイルが必要なファイルのみmakeコマンドによってコンパイル,リン クが実行されます.