在 Clozure Cl 中处理图像



1( 在ccl中制作图像的正确方法是什么?或者两者之间的确切区别是什么:

(compile-file "foo.lisp")(progn (load "foo.lisp") (save-application "foo"))

2(是否有可能加载多个图像(首选命令行(?

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机器上,可以加载一个基础映像,然后在该映像上加载多个增量映像。

compile-file按照它所说的去做:它将源文件编译为本机代码,并将结果存储在另一个文件中。 使用 compile-file 编译的文件可以使用 load 函数加载。 编译只是一种优化,因此效果与直接加载源文件非常相似。

相反,核心映像存储 Lisp

环境的完整状态,包括 Lisp 堆(包含所有加载的代码和数据(以及执行状态,这就是为什么尝试将多个核心映像加载到单个 Lisp 实例中没有任何意义的原因。 如手册中所述,您可以使用(ccl:save-application "image_name")保存核心映像,其中image_name是要创建的映像文件的名称。 核心映像只能通过启动新的 Clozure CL 实例并使用 -I 命令行选项为映像文件提供来加载。

通常,如果您正在编写一个由多个源文件组成的软件,您通常真的不想手动编译和加载内容。 相反,请考虑创建系统定义文件并使用 ASDF 加载软件。

最新更新