本節では翻訳単位に対応するモジュールの名前と、コンパイル済みのインタフェースや実装を格納するファイルの名前の関係について述べます。
コンパイラは常にソースファイル(.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
ファイルは常に利用者が手作業で指定することになっているからです。