Ch.2 SML#プログラミング環境の準備

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

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

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

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

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

  • 基本ライブラリ

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

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

  1. SML#コンパイラのソースコードをコンパイルするのに十分なコマ ンド(minismlsharp)を作るためのアセンブリファイルを用意.

  2. インストールするシステムの下で,minismlsharpのアセンブリファイルを アセンブル・リンクしminismlsharpコマンドを作成.

  3. ML-lex,ML-yaccコマンドを生成.

    1. minismlsharpによってml-lex,ml-yaccが使用するライブラリソースをコンパイル

    2. minismlsharpによってml-lexとml-yaccのソースをコンパイル

    3. システムリンカーによってml-lexとml-yaccのコマンドを生成.

  4. SMLFormatコマンドを生成

    1. minismlsharpによってSMLFormatが使用するライブラリソースをコンパイル

    2. ml-yaccによってSMLFormatが使用するパーザーのSML#ソースを生成

    3. minismlsharpによってSMLFormatのソースをコンパイル

    4. システムリンカーによってSMLFormatを生成.

  5. SML#コマンドの生成

    1. minismlsharpによって基本ライブラリ他すべてのライブラリソースをコンパイル

    2. ml-yaccによってSML#が使用するパーザーのSML#ソースを生成

    3. SMLFormatによって,SML#が使用するプリンタのSML#ソースを生成

    4. minismlsharpによってSML#のソースをコンパイル

    5. SML#の実行時処理系が使用するCファイルをコンパイル

    6. システムリンカーによってすべてのオブジェクトファイルをリンクしSML#を生成.

  6. システムインストーラによって,以下のファイルをインストール

    • ライブラリのオブジェクトファイル.分割コンパイルされたユーザプログ ラムのインクに使用.

    • ライブラリのインターフェイスファイル. ユーザプログラムのコンパイルに使用.

    • ライブラリのシグネチャファイル.ユーザプログラムのコンパイルに使用.

    • ml-lex,ml-yacc,SMLFormat,SML#の各コマンド.

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

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

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

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