Ch.11 SML#分割コンパイルシステム

§ 11.1. 分割コンパイルの概要

分割コンパイルシステムは以下の手順で使用します.

  1. システムを構成するソースをコンパイル単位に分割する. この分割は,どのような大きさでもよく,分割された各々の機能は, SML#で記述可能な宣言で実現できるものであれば,特に制約はありませ ん. ここでは,システムをpart1part2に分割したとします.

  2. 分割した各要素のインターフェイスを定義する. このインターフェイスは,第11.3節で 説明するインターフェイス言語で記述します. システムをpart1part2に分割するシナリオでは,まず, インターフェイスファイルpart1.smipart2.smiを用意します.

  3. 各インターフェイスファイルに対して,それを実現するソースファイルを 開発し,それぞれのソースファイルをコンパイルしオブジェクトファイルを作成 する.

    上記シナリオの場合,part1.smipart2.smiを実現するソー スファイルpart1.smlpart2.smlを開発し,コンパイルし オブジェクトファイルpart1.opart2.oを作成します.

    この開発は,それぞれ完全に独立に行うことができます. ML系言語の場合,ソースファイルの開発では,コンパイラによる型推論 が威力を発揮します. 分割コンパイルシステムは,その名のとおりそれぞれ独立にコンパイル できます. 例えば,part2part1の関数などを使用する場合でも, part1.smlを開発する以前に,part2.smlをコンパイルできます. この機能により,システムのどの部分でも,MLの型推論の機能をフルに 活用し,開発を行うことができます.

  4. オブジェクトファイル集合を必要なライブラリと共にリンクし,実行形式 ファイルを作成する.

    例えば,part1part2以外に,それらから参照されるC関 数のファイルやC言語で書いた独自のライブラリを使用する場合,それらの場所 をコンパイラに指示することによって,それらとともにをリンクしOS標準の実行 形式ファイルを生成できます. なお,SML#コンパイラは,SML#ランタイムの実行に必要 なC言語の標準ライブラリを常にリンクするため,標準ライブラリは指定なしに 使用することができます.

より本格的かつ高度なシナリオは以下のようなものが考えられます.

  1. システムをC言語で書く部分とSML#言語で書く部分に分割する.

  2. C言語の部分は,ヘッダファイル(.hファイル)とソースファイル(.cファイル)を開発する.

  3. SML#言語の部分は,インターフェイスファイル(.smiファイル) とソースファイル(.smlファイル)を開発する.

  4. SML#コンパイラの依存性出力機能を利用し,Makefileを作成する.

  5. システムをmakeコマンドを用いて,コンパイルとリンクを行う.

SML#コンパイラ自身,C言語とSML#で書かれていて,こ の手順で種々のツールを含むシステムがコンパイルリンクされ,SML#コ ンパイラが作成されます.