質問
1)CCLで画像を作成する適切な方法は何ですか?または次の間の正確な違いは何ですか:
(compile-file "foo.lisp")
と (progn (load "foo.lisp") (save-application "foo"))
?
2)複数の画像をロードする可能性はありますか(コマンドラインを好む)?
解決
一般的なLISPシステムのファイルコンパイラは、ある種のマシン言語(ターゲットプロセッサに応じて)または仮想マシン(CLISPなど)で元のソースの表現を作成します。このコンパイルされたファイルは、ロード関数を備えた実行中のLISPシステムにロードし、ソース(関数、クラス、変数など)の定義を作成し、ファイル内の他のコードを実行できます。
ソースファイルを直接読み込むことができます(関数負荷も使用します)。 LISPがフォームをロードするためにコンパイラを使用している場合、ファイルコンパイラの利点は次のとおりです。
- コンパイルされたコードの読み込みは、わずかに高速になるはずです
- コンパイル時にいくつかのエラーチェック
- 実行時に、より高速なコードを使用したより積極的なコンパイル
- コードは小さくなる可能性があります(依存)
画像を保存することは独立しています。画像は、実行中のリスプのメモリダンプです。しかし、一般に、すべての状態をLISPシステムに応じて投棄できるわけではありません。ファイル接続、ネットワーク接続、開いたウィンドウなど、画像に捨てられないものの候補者...したがって、これらのものは、画像の開始時に再開する必要がある場合があります。
LISPアプリケーションを開始する場合は、いくつかのオプションがあります。
- 起動時にすべてのソースコードをロードします
- 起動時にすべてのコンパイルされたコードをロードします
- すべてのコードを含む画像をロードします
後者はおそらく最速です。多くの目的で、特に開始がたまにしか発生しない場合、起動時にコンパイルされたコードをロードすることも十分に速くなります。
もう一度あなたの質問を見てみましょう。
(compile-file "foo.lisp")
上記は、単一のファイルをコンパイルされたファイル(FASLファイル「Fast Load」)にコンパイルするだけです。コンパイルの効果は、LISPシステムにいくつかの情報が記録されているが、ファイルの定義は利用できないこともあります。コンパイルされたファイルをロードする必要があります。
(progn (load "foo.lisp") (save-application "foo"))
上記の上にファイルがロードされます。インクリメンタルコンパイラを備えたLISPは、そのファイル内の一部またはすべてのステートメントをコンパイルする場合があることに注意してください(CCLとSBCLがそれを行っています)。保存アプリケーションはCCL固有の関数であり、完全なLISP状態(マイナスファイル接続など)をダンプし、その後開始できるアプリケーションを作成します。
他のアプリケーションと同様に開始するLISPアプリケーションを作成する場合は、保存適用が進む方法です。
複数の画像をロードできる場合は、システムに依存します。 CCLではできません。 LISPマシンでは、ベース画像をロードしてから、その上に複数の増分画像をロードできます。
他のヒント
compile-file
それが言っていることをします:ソースファイルをネイティブコードにコンパイルし、結果を別のファイルに保存します。コンパイルされたファイル compile-file
でロードできます load
関数。コンパイルは単なる最適化であるため、効果はソースファイルを直接ロードすることに非常に似ています。
対照的に、コア画像は保存します 完全な状態 LISPヒープ(すべてのロードされたコードとデータを含む)を含むLISP環境と実行の状態があるため、複数のコア画像を単一のLISPインスタンスにロードしようとすることは意味がありません。マニュアルで説明されているように、できます コア画像を保存します 使用して (ccl:save-application "image_name")
どこ image_name
作成する画像ファイルの名前です。コア画像は、新しいClozure CLインスタンスを起動し、画像ファイルにを提供することによってのみロードできます。 -I
コマンドラインオプション。
一般的に、複数のソースファイルで構成されるソフトウェアを作成している場合、通常、手動で物をコンパイルしてロードしたくありません。代わりに、考慮してください システム定義の作成 ソフトウェアをASDFでファイルしてロードします。