处理Clozure Cl中的图像

时间:2011-06-14 11:46:03

标签: lisp ccl

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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

通常,如果您正在编写一个由多个源文件组成的软件,您通常不希望手动编译和加载内容。相反,请考虑creating a system definition文件并使用ASDF加载您的软件。

答案 1 :(得分:5)

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机器上,可以加载基本图像,然后在其上加载多个增量图像。