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
生成されたファイルは実行権限ビットがセットされていて、自力でバイトコードインタプリタを起動しようとします。