8.3 モジュールとファイルシステム

本節では翻訳単位に対応するモジュールの名前と、コンパイル済みのインタフェースや実装を格納するファイルの名前の関係について述べます。

コンパイラは常にソースファイル(.ml ファイルや .mli ファイル)のベースネームの一文字目を大文字にしたものをモジュール名とします。 すなわち、ディレクトリ名が先にあればそれを取り除き、同様に拡張子 .ml.mli も取り除きます。 それから、モジュール名は大文字から始まる必要があるので、最初の文字を大文字にします。 例えば、 mylib/misc.ml をコンパイルすると、 Misc というモジュールの実装になります。 他の翻訳単位からは mylib/misc.ml で定義された要素は Misc.name という名前で参照できます。 また、 open Misc として、修飾されていない name という名前を使うこともできます。

コンパイラの生成した .cmi ファイルも .cmo ファイルもソースファイルと同じベースネームになります。 したがって、コンパイル済みのファイルは常に(最初の文字が大文字か小文字かということを除けば)、そのインタフェース(.cmi ファイル)に対応するモジュールやオブジェクトファイル(.cmo ファイル)により実装されるモジュールと同じ名前になります。

コンパイラは自由なモジュール識別子 Mod を見つけると、探索パスから Mod.cmi ないしは mod.cmi というファイルを探索し、そのファイルに格納されているコンパイル済みインタフェースを読み込みます。 そのため、 .cmi ファイルの名前を変更することは推奨されません。 .cmi ファイルの名前は常にその翻訳単位の実装の名前と対応していなければなりません。 ベースネームが変更されないのであれば、 .cmi ファイルを別のディレクトリに移動することは構いません。 コンパイラに適切な -I オプションを指定しましょう。 名前を変更した .cmi を読み込むとコンパイラはエラーを出力し、停止します。

これに対して、コンパイル済みバイトコードファイル(.cmo ファイル)の名前は、作成後自由に変更することができます。 これは、与えられた名前のモジュールを実装する .cmo ファイルをリンカが自分で探すことはなく、 .cmo ファイルは常に利用者が手作業で指定することになっているからです。