Lisp Clozure Cl中的图像处理

Lisp Clozure Cl中的图像处理,lisp,ccl,Lisp,Ccl,1) 在ccl中制作图像的正确方法是什么?或者,两者之间的确切区别是什么: (编译文件“foo.lisp”)和(progn(加载“foo.lisp”)(保存应用程序“foo”) 2) 是否有可能加载多个映像(首选命令行)?编译文件执行它所说的操作:将源文件编译为本机代码,并将结果存储在另一个文件中。使用compilefile编译的文件可以使用load功能加载。编译只是一种优化,因此效果与直接加载源文件非常相似 相反,核心映像存储Lisp环境的完整状态,包括Lisp堆(包含所有加载的代码和数据)以

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

(编译文件“foo.lisp”)
(progn(加载“foo.lisp”)(保存应用程序“foo”)


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

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

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


一般来说,如果你正在编写一个由多个源文件组成的软件,你通常真的不想手工编译和加载。取而代之的是,考虑文件和用ASDF.< /P> < P >加载软件。普通LISP系统中的文件编译器在某种机器语言中创建原始源的表示(取决于目标处理器)或某些虚拟机(例如在CLSP中)。然后,可以使用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应用程序,那么保存应用程序就是一种方法

是否可以加载多个映像取决于系统。在CCL里你不能。在Lisp机器上,可以加载一个基本映像,然后再加载多个增量映像