Common Lisp/实现问题
Common Lisp 是一种规范,它有许多实现。这些实现中的每一个都以不同的方式满足了 CL 规范。这意味着,几乎可以肯定,Lisp 实现执行某些任务(启动、关闭、调试、交付、脚本等)的方式将不同。此外,某些实现通常具有某些特殊功能,这些功能尚未被整个 CL 社区采用,但在它们本身却非常有用。本章将提供使用流行的 Common Lisp 实现和常见用法的简短/选择性示例。
开源社区在 Common Lisp 世界中非常活跃(就像在“黑客”语言中一样)。因此,分发 Common Lisp 软件最常见的方式是通过源代码存档。这些源代码存档通常使用 ASDF 包管理器。这有一个小缺点,即用户必须足够熟练才能安装 Lisp 实现并构建包。此外,有些人希望将他们的程序闭源。出于这些目的,还有其他分发程序的方法。
交付 Lisp 应用程序的一种方法是提供 Lisp 镜像的转储。传统上,这是向用户提供“完成”程序的途径。这基本上与提供程序的可执行文件相同。通常,您只会看到一个不透明的单片文件,其中包含您的程序(几乎普遍存在整个 Lisp 系统)。虽然这允许开发人员向用户隐藏应用程序源代码,但它也解决了用户必须查找和安装 Lisp 实现的问题。由于应用程序只是一个可执行文件,用户只需运行该程序即可。然而,Lisp 镜像不可移植,需要为要支持的每个系统类型构建。
要在 SBCL 中生成 Lisp 镜像,请使用 SAVE-LISP-AND-DIE。
;; Make a Lisp image. Execute with sbcl --core lisp-image.core
(save-lisp-and-die #p"lisp-image.core")
;; Make an executable Lisp image. Execute with ./lisp-image
(save-lisp-and-die #p"lisp-image" :executable t)
在构建镜像时,您可以使用许多其他选项。请参阅用户手册以了解它们的作用。
要加载 Lisp 镜像,在 Lisp 启动时使用运行时选项
--core corefilename
因此在控制台中
/usr/local/bin/sbcl—core lisp-image.core
(saveinitmem "/home/you/yourLispDir/lispImage.mem")
之后,如果您要使用它,请像这样加载它(在控制台中)
clisp -M lispImage.mem
一些 Lisp,例如 CLISP,会生成可移植字节码。这意味着您可以在一个系统上构建程序,并将其发送给用户,用户然后可以在他们的 CLISP 实现上运行它。这解决了向用户隐藏源代码的问题。当然,用户仍然需要安装 CLISP,但幸运的是,它是安装最简单的 Lisp 实现之一。
人们经常希望像 Perl、Python 和 Bash 一样编写 Common Lisp “脚本”。对于这样的应用程序,您经常需要担心 Common Lisp 用户通常不会担心的某些因素,例如
- 启动时间需要非常快。脚本通常在简单的问题上运行小型输入,因此启动 Lisp 镜像必须很快,否则它将成为瓶颈。
- 内存使用量需要非常低。用户通常会一次运行数十到数百个脚本。
这两个因素在生成 Lisp 系统时通常会被忽略。毕竟,Lisp 系统通常是长时间运行的(因此启动速度无关紧要)并且形成他们自己的计算环境(因此一次只需要运行一个实例,使内存使用无关紧要)。但是,有一些实现可以充当脚本平台。经过适当配置,SBCL、CCL 和 CLISP 都具有相对较快的启动时间。CLISP 和 ECL 的内存占用率相当低。
这个问题在某些新闻组中时不时地出现:“我如何通过调用 Lisp 服务器而不是启动新进程来规避 Lisp 过度的启动时间和/或内存使用量?”通常,用户没有充分利用 Lisp 实现的功能,这导致他们想到这个解决方案。通常,创建 Common Lisp 服务器实际上并不必要,因为“脚本”或“转储 Lisp 镜像”部分中演示的技术足以解决这些问题。但是,有些时候这实际上会对您有益。Common Lisp 系统非常庞大;仅仅加载这样一个庞大的东西可能会被证明对某些应用程序来说是一个瓶颈。
ECL 是一个完整的独立 CL 实现,它还具有可以嵌入到任何可以进行 C 函数调用的项目中的附加功能。它最初被设想为一种在 C 应用程序中获取一些 Lisp 而不会留下巨大占用的方法,但它迅速发展成为一个完整的功能齐全的实现。
很少有 Common Lisp 在虚拟机之上运行。那些能够使用其他语言的库,这些库也使用该 VM。ABCL 是一个在 Java VM 上运行的 Common Lisp。ABCL 能够访问 Java 的任何部分,这意味着您可以使用大量的流行库。