【发布时间】:2023-03-22 12:36:01
【问题描述】:
基本上,我想知道 Lisp 图像是什么?它是包含 Lisp 解释器和一个或多个程序的内存片还是什么?
【问题讨论】:
-
这张图可以帮助你理解:speakerdeck.com/juanitofatas/…
-
@juanitofatas 死链接
标签: lisp common-lisp
基本上,我想知道 Lisp 图像是什么?它是包含 Lisp 解释器和一个或多个程序的内存片还是什么?
【问题讨论】:
标签: lisp common-lisp
作为转储内存的 Lisp 映像
图像通常是一个文件。它是 Lisp 系统内存的转储。它包含 Lisp 系统的所有函数(通常编译为机器码)、变量值、符号等。它是一个正在运行的 Lisp 的快照。
要创建图像,需要启动 Lisp,使用一段时间,然后转储图像(执行此操作的函数名称取决于实现)。
使用 Lisp 图像
下次重新启动 Lisp 时,可以使用转储的图像并大致恢复之前的状态。转储图像时,还可以告诉 Lisp 在转储图像启动时应该做什么。这样就可以重新连接到服务器,再次打开文件等等。
要启动这样一个 Lisp 系统,需要一个内核和一个映像。有时 Lisp 可以将两者放在一个文件中,这样一个可执行文件既包含内核(具有一些运行时功能)又包含图像数据。
在 Lisp 机器(运行 Lisp 操作系统的计算机)上,一种引导加载程序(FEP,前端处理器)可以将映像(称为“世界”)加载到内存中,然后启动该映像。在这种情况下,没有内核,计算机上运行的只是这个 Lisp 映像,它包含所有功能(解释器、编译器、内存管理、GC、网络堆栈、驱动程序......)。基本上它是单个文件中的操作系统。
一些 Lisp 系统会在转储图像之前优化内存。他们可能会进行垃圾收集、对内存中的对象进行排序等。
为什么要使用图片?
为什么要使用图片?它节省了加载内容的时间,并且可以为用户提供带有应用程序代码和数据的预配置 Lisp 系统。使用保存的图像启动 Common Lisp 实现通常很快 - 在当前计算机上只需几毫秒。
由于 Lisp 映像可能包含很多功能(编译器,甚至是开发环境,大量调试信息,...),它的大小通常为几兆字节。
在 Lisp 中使用图像与 Smalltalk 系统的做法非常相似。例如,Squeak 还使用 Smalltalk 代码和数据的映像以及运行时可执行文件。有一个实际的区别:大多数当前的 Lisp 系统使用编译的机器代码。因此,映像不能在不同的处理器架构(x86、x86-64、SPARC、POWER、ARM 等)甚至操作系统之间移植。
历史
这种 Lisp 图像已经使用了很长时间。例如,1967 年 BBN Lisp 中的 SYSOUT 函数创建了这样的图像。 SYSIN 会在开始时读取这样的图像。
图像保存功能示例
有关示例,请参见 LispWorks 的函数 save-image 或阅读 saving core images 上的 SBCL 手册。
【讨论】:
几种语言实现使用“图像”来存储“所有内容” 在当前情况下。这个图像可能有几个抽象层的编译(即 中间解析级别、中间字节码、本机操作码)。加载这个 image 将比编译所有源文件快得多。这很像 休眠功能,在程序级别。
例如,如果您的 lisp 实现使用图像,那么首先您(或编译器 供应商将)引导图像并保存它。
那么您有两个选择:(1)每次调用 lisp 时加载您的 lisp 文件或(2)加载所有 lisp,并保存图像,然后使用此图像
希望有帮助
【讨论】:
一般来说,它是 lisp 进程的存储部分(即所有“lisp”函数和数据),但不是底层 lisp 二进制文件的部分。从好的方面来说,这提供了快速启动,因为(基本上)在加载图像时不需要进行簿记,一切都在那里。另一方面,这意味着任何打开的文件、套接字和你所拥有的东西都丢失了,因此将图像保存为某种检查点需要一些实现才能使其工作。
【讨论】: