| MINERVAのパッケージ機構は、大規模なプログラムの構築の際に
開発者が余分な努力をすることなく、以下を達成できる
メカニズムを提供しています。
- 大規模なプログラムをファイルを単位として増分的にコンパイルする。
- 独立したプログラム部分を異なるネームスペースで開発する。
- プログラム部分を自動的あるいは要求に応じてロードする。
- プログラムのライブラリを構築する
- 足りない述語を静的にチェックする。
動機
プログラムの大規模化、複数のプログラマによる共同開発、メンテナンスの必要性
及びソフトウェアエンジニアリング手法により、
プログラムを管理可能な独立性の高いモジュールに分けることが望まれています。
MINERVAは、複数の異なるネームスペースの提供および知的なロードスキーマにより
これを可能にしています。MINERVAでは、動的にロード可能なモジュールを
実装し、かつコンパイラによる厳格で静的なチェックを行なっています。
これにより、小さく、迅速にロードされ、かつ、頑健性の高いプログラムの作成が
可能になりました。
原則
MINERVAコンパイラminervacは、各*.minのMINERVAソースファイルに対して、
モジュールインタフェース仕様を持つ *.mpk MINERVAパッケージファイルと、
*.mbc MINERVAバイナリコードファイルの二つのファイルを生成します。
プログラムは、指令packageにより他のパッケージにアクセス
することができます。
そのプログラムで定義されていず、packageの指令によりアクセス
可能ではない述語が明確に呼び出された場合、
コンパイラは、エラーメッセージを出します。
デフォルトでは、プログラムはすべての述語をエクスポートします。
アンダスコア('_')によって始まる述語は、*.mpkファイルには
エクスポートされません。このため、他のパッケージからは
アクセスできません。
同じ名前/アリティを有する述語がいくつかのパッケージから
エクスポートされると、最初にロードされたパッケージの述語のみが呼び出され、
他のパッケージの述語は隠されます。
パッケージは、ディレクトリの中で探索され、それから
minervaの-spパラメータで与えられたシーケンスに応じて
探索されます。
複数回関連付けられたパッケージも、一度しかロードされません。
別れているパッケージのネームスペースは別々になっています。
例
"aaa"のパッケージはaaa/1、aaa1/1, aaa2/1をエクスポートしますが、
_aaa3/3はエクスポートしません。
% file: aaa.min
aaa(C) :-
aaa1(A),
aaa2(B),
'_aaa3'(A,B,C).
aaa1(1).
aaa2(2).
'_aaa3'(A,B,C) :- C is A + B.
"bbb"のパッケージは、"aaa"からエクスポートされたすべての述語と
bbb/1をエクスポートしますが、 _aaa3/3はエクスポートしません。
bbb/1の定義は、"bbb"の_aaa3/3を使用しています。"aaa"の_aaa3/3は
"bbb"にはアクセス可能ではありません。
% file: bbb.min
:- package(aaa).
bbb(C) :-
aaa1(A),
aaa2(B),
'_aaa3'(A,B,C).
'_aaa3'(_,_,ccc).
"ccc"は、"bbb"と"bbb"から再帰的に"aaa"をアクセスすることが
できます。"ccc"は、aaa/1をエクスポートします。
もし、"ccc"がまずロードされる場合、?- ccc(X)の結果はX=1です。
これは、"aaa"のaaa/1の定義は、"ccc"にはアクセス可能ですが、
"ccc"のaaa/1の定義によって、隠されてしまうためです。
% file: ccc.min
:- package(bbb).
ccc(C) :-
aaa(C).
aaa(1).
プログラミングの際のお勧め
プログラミングの場合には、以下をお勧めします。
- 各パッケージに対して説明的な名前を選ぶこと。
もし可能であれば、パッケージによって定義された中で最も
重要な述語と同じ名前を選ぶ。
これによりプログラムのライブラリを理解しやすくなります。
- 内部の述語であれば、トップレベルでないものとして
'_'をつけること。これにより *.mpk ファイルはコンパクトに
なり、publicな述語は外向けの使用のためのものとして
はっきりします。
- パッケージ指令を、ファイルの最初に記述する。
これによりファイルの依存関係がはっきりします。
- minervacによるコンパイルの用と、minerva
による実行の際あるいはMINERVAスタートアッププロパティ
ファイル*.msp によりネットワークを介して実行する用に、
同じパッケージ探索パスを使用する。
- 独立したライブラリを別のディレクトリにグループ分けし、
これらのディレクトリを、必要に応じてminervaとminervacの
'-sp'の探索パスオプションへ加える。
- minervaの'-v'オプションを使って、ロードシーケンスおよび
パッケージのタイミングをチェックする。
- 希望する場合、minervaの'-l'オプションを使って、
起動時に強制的にロードする。
- 希望する場合、'load/1'の述語を使用して、走らせる時に
強制的にロードする。
- 自動ロードを使用するために、デフォルトでMINERVAの
「オンデマンド」メカニズムを使用する。
|