6.2 SML#コンパイラの構造とブートストラップ
この節の内容は,SML#コンパイラをインストールし使用する上で 理解する必要はありませんが,やや時間がかかるSML#コンパイラのインス トール処理の理解や,さらにコンパイラの一般的な構造を理解する上で有用と思 います.
SML#4.0.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.0.0版では,以下の手順でこのブートストラップの 問題を解決し,SML#をビルドしインストールしています.
-
1.
C/C++で書かれたランタイムライブラリをコンパイルし静的リンク ライブラリを生成します.
-
2.
SML#コンパイラのソースコードをコンパイルするのに十分な大きさの SML#コンパイラ(minismlsharp)を,古いSML#コンパイラで 事前にコンパイルしておき, SML#のソースツリーにコンパイル済みのLLVM IRファイルを用意しています.
-
3.
インストール先のシステムの下で, minismlsharpのLLVM IRファイルをLLVMを用いてコンパイルし, ランタイムライブラリとリンクし, minismlsharpコマンドを生成します.
-
4.
minismlsharpコマンドを用いて,SML#をコンパイルするための 各種ツールとライブラリ,およびSML#コンパイラをコンパイルします. このコンパイルは,ツールとライブラリの依存関係から,おおよそ 以下の順番で行われます.
-
(a)
基本ライブラリ(Basis Library)のコンパイル.
-
(b)
smllexコマンドのコンパイルとリンク.
-
(c)
ML-yaccライブラリとsmlyaccコマンドのコンパイルとリンク.
-
(d)
smllexおよびsmlyaccコマンドによるパーザの生成.
-
(e)
smlformatコマンドのコンパイルとリンク.
-
(f)
smlformatコマンドによるプリンタの生成.
-
(g)
すべてのライブラリのコンパイル.
-
(h)
smlsharpコマンドのコンパイルとリンク.
-
(a)
-
5.
以下のファイルを所定の位置にインストールします.
-
•
ランタイムライブラリのライブラリファイル.
-
•
ライブラリのインターフェースファイル,オブジェクトファイル,および シグネチャファイル.
-
•
smllex,smlyacc,smlformat,smlsharpの 各コマンド.
-
•
これらは以上のステップが示す様に,各ソースファイルやコマンド間に は複雑な依存関係があります. さらに,いくつかのソースファイルの処理は,OSの環境に依存しています. これらは,大規模なシステムの典型です. これら依存関係を制御する一つの手法は,GNU Autoconfによるconfigureスクリプトとmakeコマンドの使用です. SML#コンパイラは,インターフェイスファイルに従って各ファイ ルをコンパイルします. 個別のファイルが必要とするファイルは,このインターフェイスファイル に記述されています. SML#コンパイラは,この依存関係をmakeコマンドが読み 込めるフォーマットで出力する機能を持っています.
-
1.
smlsharp -MM . ソースファイルを読み,このソースファイルを コンパイルするために必要なファイルのリストをMakefile形式で出力 します.
-
2.
smlsharp -MMl . インターフェイスファイルをトップレベルの ファイルとみなし,このトップレベルから生成されるべき実行形式コマンドの リンクに必要なオブジェクトファイルのリストをMakefile形式で出力します.
-
3.
smlsharp -MMm . インターフェイスファイルをトップレベルの ファイルとみなし,このトップレベルから生成されるべき実行形式ファイルを ビルドするためのMakefileを生成します.
SML#システムは,この機能を利用して,上記の手順を実行する Makefileを生成しています. このMakefileによって,通常の大規模システムの開発と同様,再 コンパイルが必要なファイルのみmakeコマンドによってコンパイル,リン クが実行されます.