ocamlc コマンドは、多くの C コンパイラと似たコマンドラインインタフェースを持ちます。 ocamlc はいくつかのタイプの引数を受け、それらを順番に処理します。
.mli
で終わる引数はコンパイルユニットへのインタフェースのソースファイルとして扱われます。
インタフェースはコンパイルユニットからエクスポートされる名前を指定します。
インタフェースは、値の名前とその型の宣言、パブリックなデータ型の定義、抽象データ型の宣言などを行います。
ocamlc はファイル x.mli
なら、ファイル x.cmi
を生成し、インターフェイスをコンパイルしたものを出力します。
.ml
で終わる引数はコンパイルユニットの実装のソースファイルとして認識されます。
実装はユニットが外部に公開する名前の定義を持ち、副作用のある式なども持ちます。
ocamlc はファイル x.ml
なら、ファイル x.cmo
を生成し、コンパイル済みオブジェクトバイトコードを出力します。
インターフェイスファイル x.mli
があったら、実装 x.ml
は対応するコンパイル済みインターフェイスファイル x.cmi
(これもあるはず) とチェックされます。
インターフェイスファイル x.mli
がなかったら、x.ml
のコンパイルではオブジェクトコードファイル x.cmo
だけでなくインターフェイスファイル x.cmi
もコンパイル生成されます。その場合、x.cmi
では実装 x.ml
で定義されているものすべてを公開することになります。
.cmo
で終わる引数はコンパイル済みオブジェクトバイトコードと認識されます。
これらのファイルは (もしあれば) .ml
引数をコンパイルして得られたオブジェクトファイルや Objective Caml 標準ライブラリと一緒にリンクされて、単独実行ファイルが生成されます。
コマンドラインでの .cmo
や .ml
の引数の順番には意味があります。
コンパイルユニットはランタイム時その順で初期化され、初期化前のユニットのコンポーネントを使おうとしたらリンク時にエラーとなります。
なのでファイル x.cmo
はユニット x
に参照を持つファイル .cmo
より前に置かなければなりません。
.cma
で終わる引数はオブジェクトバイトコードのライブラリと認識されます。
オブジェクトバイトコードのライブラリは複数のオブジェクトバイトコードファイル (.cmo
) を 1 つのファイルにまとめたものです。
ライブラリは ocamlc -a
で作成できます (-a
オプションの説明は下の方を見て下さい) 。
ライブラリ中のオブジェクトファイルは通常の .cmo
と同じようにリンクされます (順番は .cma
ファイル作成時に指定します) 。
ただ 1 つ異なる点として、ライブラリ中のオブジェクトファイルでプログラム中のどこからも参照されないものはリンクされません。
.c
で終わる引数は C コンパイラを通して .o
オブジェクトファイルを生成します。
このオブジェクトファイルは -custom
フラグがセットされていたらプログラムにリンクされます (-custom
の説明は下の方を見て下さい) 。
.o
や .a
(Windows では .obj
や .lib
) で終わる引数は C のオブジェクトファイルやライブラリとみなされます。
-custom
モードでリンクされているときこれらは C のリンカに通されます (-custom
の説明は下の方を見て下さい) 。
.so
(Windows では .dll
) で終わる引数は C の共有ライブラリ (DLL) とみなされます。
Caml コードから参照される外部 C 関数はリンク時にそこから検索され、その名前が生成されるバイトコードの実行ファイル中に出力されます。
するとランタイムシステム ocamlrun はプログラムスタート時にそれを動的にロードします。
リンク段階で出力されるファイルはコンパイル済みバイトコードを含み、Objective Caml バイトコードインタプリタ ocamlrun の上で実行できます。
出力されたファイル名が caml.out
だとすると、以下のコマンドで caml.out
中のコンパイル済みコードを実行できます。
ocamlrun caml.out arg1 arg2 ... argn
文字列 arg1 から argn
までが引数として実行ファイルに渡されます (詳細は 10 章を見てください) 。
多くのシステムでは出力されたファイルは以下のようにそのまま実行できます。
./caml.out arg1 arg2 ... argn
出力されたファイルは実行権限ビットがセットされていて、自力でバイトコードインタプリタを起動しようとします。