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