ocamlc コマンドは、多くの C コンパイラと似たコマンドラインインタフェースを持ちます。 ocamlc はいくつかの種類の引数を受け取り、それらを順番に処理します。
.mli
で終わる引数は翻訳単位のインタフェースソースファイルとして扱われます。
インタフェースには翻訳単位の公開する名前を指定し、値の名前とその型の宣言、public なデータ型の定義、抽象データ型の宣言などを行ないます。
ocamlc は
からコンパイル済みインタフェースファイル x
.mli
を生成します。
x
.cmi
.ml
で終わる引数は翻訳単位の実装ソースファイルとして扱われます。
実装には翻訳単位の公開する名前の定義や、副作用目的で評価する式を含めます。
ocamlc コンパイラは
からコンパイル済みオブジェクトバイトコード x
.ml
を生成します。
x
.cmo
インタフェースファイル
が存在する場合、対応するコンパイル済みインタフェース x
.mli
が存在するものと仮定し、これと実装 x
.cmi
が適合するか検査します。
インタフェース x
.ml
が存在しない場合には、 x
.mli
をコンパイルしたときに、オブジェクトコード x
.ml
に加えて x
.cmo
も生成します。
生成された x
.cmi
は x
.cmi
で定義されものをすべて公開するインタフェースになります。
x
.ml
.cmo
で終わる引数はコンパイル済みオブジェクトバイトコードとして扱われます。
これらのファイルを、 .ml
ファイル引数(あれば)をコンパイルして得られたオブジェクトファイルに Objective Caml の標準ライブラリを加えたものとリンクし、スタンドアロン実行プログラムを生成します。
コマンドラインでの .cmo
引数と .ml
引数の順番には意味があります。
各翻訳単位はコマンドラインで指定された順番で実行時に初期化され、未初期化の要素を使用しようとするとリンク時にエラーになります。
したがって、
は翻訳単位 x
.cmox
を参照する .cmo
ファイルよりも先に指定しなければなりません。
.cma
で終わる引数はオブジェクトバイトコードのライブラリとして扱われます。
オブジェクトバイトコードのライブラリは複数のオブジェクトバイトコードファイル(.cmo
)をひとつのファイルにまとめたものです。
ライブラリは ocamlc -a
で作成できます(下の -a
オプションの説明を参照してください)。
ライブラリ中のオブジェクトファイルは通常の .cmo
と同じように、 .cma
ファイルを作成した時に指定した順番でリンクされます(上記参照)。
ただひとつ異なる点として、ライブラリ中のオブジェクトファイルでプログラム中のどこからも参照されないものはリンクされません。
.c
で終わる引数は C コンパイラに渡して .o
(Windows では .obj
)オブジェクトファイルを生成します。
このオブジェクトファイルは -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
中のコンパイル済みコードに引数として文字列 arg1
から arg
を渡して実行します(詳しくは 10 章「ランタイムシステム(ocamlrun)」 を参照してください)。
n
ocamlrun caml.out arg1 arg2 ... argn
多くのシステムでは出力されたファイルは以下のようにそのまま実行できます。
./caml.out arg1 arg2 ... argn
生成されたファイルは実行権限ビットがセットされていて、自力でバイトコードインタプリタを起動しようとします。