11.1 Overview of the compiler
ocamlopt コマンドは、ocamlc と非常によく似たコマンドラインインターフェイスになっています。引数にはいくつか型があります。
- .mli で終わる引数はコンパイルユニットのインターフェイスのソースファイルと認識されます。インターフェイスはコンパイルユニットが外部に公開する名前を指定します。値の名前とその型を宣言し、公開データ型を定義し、抽象データ型を宣言します。ocamlopt はファイル x.mli なら、ファイル x.cmi を生成し、インターフェイスをコンパイルしたものを出力します。生成されるインターフェイスはバイトコードコンパイラ ocamlc が生成するものと同一です。
- .ml で終わる引数はコンパイルユニットの実装のソースファイルとして認識されます。実装はユニットが外部に公開する名前の定義を持ち、副作用のある式なども持ちます。ocamlopt はファイル x.ml なら、ファイル x.o と x.cmx を生成します。前者はネイティブオブジェクトコードで、後者はユニットを使う側にリンクや最適化の追加情報を伝えるファイルです。コンパイル済みの実装は常に x.cmx の名前で参照されます (.o で参照すると、ocamlopt は Caml をコンパイルしたコードではなく、C をコンパイルしたコードが入っていると認識します) 。実装は (あればですが) インターフェイスファイル x.mli を元にチェックされます。このあたりのことは ocamlc のマニュアルで解説されています (8 章) 。
- .cmx で終わる引数はコンパイル済みオブジェクトコードと認識されます。これらのファイルは (もしあれば) .ml 引数をコンパイルして得られたオブジェクトファイルや Objective Caml 標準ライブラリと一緒にリンクされて、ネイティブコード実行ファイルが生成されます。コマンドラインでの .cmx や .ml の引数の順番には意味があります。コンパイルユニットはランタイム時その順で初期化され、初期化前のユニットのコンポーネントを使おうとしたらリンク時にエラーとなります。なのでファイル x.cmx はユニット x に参照を持つファイル .cmx より前に置かなければなりません。
- .cmxa で終わる引数はオブジェクトコードのライブラリと認識されます。ライブラリは 2 つのファイル (lib.cmxa と lib.a) にまとめられています (それぞれ .cmx/.o のオブジェクトファイルの集合です)。ライブラリは ocamlopt -a で作成できます (-a オプションの説明は下の方を見て下さい) 。ライブラリ中のオブジェクトファイルは通常の .cmx と同じようにリンクされます (順番はライブラリ作成時に指定します) 。ただ 1 つ異なる点として、ライブラリ中のオブジェクトファイルでプログラム中のどこからも参照されないものはリンクされません。
- .c で終わる引数は C コンパイラを通して .o オブジェクトファイルを生成します。このオブジェクトファイルはプログラムにリンクされます。
- .o 、.a 、.so (Windows では.obj 、.lib 、.dll) で終わる引数は C のオブジェクトファイルやライブラリとみなされます。これもプログラムにリンクされます。
リンク段階で出力されるファイルは通常の UnixやWindowsの実行ファイルです。実行に ocamlrun は必要ありません。