Smalltalk的“image”是什么?

30

Smalltalk中的“image”是什么?它是否类似于序列化Smalltalk运行时?

8个回答

25

大多数流行的编程系统将程序代码(以类定义、函数或过程的形式)与程序状态(例如对象或其他形式的应用程序数据)分开。它们在应用程序启动时加载程序代码,并且必须从配置文件或其他数据源显式重新创建任何先前的应用程序状态。如果应用程序员没有明确保存任何设置,那么每次重新启动时都需要重新设置。

然而,许多 Smalltalk 系统不区分应用程序数据(对象)和代码(类)。事实上,类本身就是对象。因此,大多数 Smalltalk 系统将整个应用程序状态(包括类和非类对象)存储在图像文件中。然后,Smalltalk 虚拟机可以加载该图像文件以将类似 Smalltalk 的系统恢复到先前的状态。

http://en.wikipedia.org/wiki/Smalltalk#基于图像的持久化


11
另一种看待它的方式是,这就像是操作系统虚拟化软件(如VirtualBox或VMWare)中所获取的系统镜像。不同之处在于图像中的操作系统是Smalltalk系统,且其组织方式不像文件系统那样,而是以对象为基础。 - Damien Pollet

24

Smalltalk镜像是一种非常有趣的存在。可以将其视为一种不朽之物。许多当前的Smalltalk系统,包括Pharo、Squak和VisualWorks等,都有一个共同的祖先,即来自Xerox PARC的Smalltalk镜像。然而,这个共同的祖先并不是什么遥远的东西,而在那些现代系统中仍然存活着。通过向该镜像中的对象发送消息来生成现代变体。其中一些消息实际上会改变当前对象。类是完整的对象,创建新类是通过向类对象发送消息来完成的。Smalltalk镜像中的一些对象可能可以追溯到1972年,当时第一个Smalltalk镜像被引导!Smalltalk镜像永远不会死亡,只会消失成为可能根本不同的东西。您应该将应用程序构建视为与创建新的Smalltalk版本没有本质区别。


9
当Smalltalk虚拟机启动时,它会从“镜像”中加载对象的保存状态(包括打开的文件流、窗口、线程等等)到内存中,并在上次保存镜像时停止执行的地方恢复执行。您可以在任何时间“保存一个镜像”(也称当前整体状态的快照)到镜像文件中,可以在磁盘上保存多个镜像,这对于处理不同的项目非常有用。
通常情况下,镜像(但并非所有Smalltalk系统都是)可以在体系结构之间移植;例如,squeak的镜像可以加载到Windows和Mac(甚至Android)的squeak虚拟机中。然而,在方言之间以及有时在同一方言的不同版本之间,镜像是不可移植的。
镜像通常包含完整的内容-包括调试器、编译器、编辑器、浏览器等等。但是,在部署时,“剥离”(即删除未使用的内容)镜像有时很有用-无论是为了隐藏秘密还是使其更小(用于嵌入式或移动设备)。除了Smalltalk/X和(我想是)S#-Smalltalk(但我在这里踩了薄冰外),大多数Smalltalk系统不能没有镜像。
要保存和传输源代码,镜像没有用-请使用标准格式的fileout或xml或任何其他传输格式(有很多)。镜像也不适用于编组/取消编组;请使用xml、二进制存储、数据库、glorb或任何其他序列化方法。

1
一个小的精度:文件流不保留在保存的图像中。一些类可以注册以在保存或重新加载图像时进行清理/重新初始化。文件描述符、套接字、屏幕位图...都指向图像外部的状态,因此如果在停止图像时删除文件,或将图像移动到不同的主机,则它们将无效。线程完全在图像内部实现(就像Java的绿色线程一样),因此它们不映射到系统线程,并且可以按原样保存,具有调试器等等。 - Damien Pollet
1
你说得没错,但实际上:Smalltalk/X甚至会尝试重新打开并重新定位文件,如果它是一个普通文件。当然,这不是由虚拟机而是由类的可选reinitialize方法(实际上是returnFromSnapshot)完成的。此外,在st/x中,没有屏幕位图,而是一些win32或x topWindows需要重新创建。好吧,实际上,添加这样的returnFromSnapshot方法以及在所谓的“snapin”之后决定重构什么以及如何重构,这完全取决于程序员。 - blabla999
1
当然,您也是正确的,状态是图像外部的;但是,如果您保留(某些)状态的副本,则可以重新创建窗口,替换旧的窗口句柄,重新映射和重绘新窗口。这就是在returnFromSnapshot方法中所做的。 - blabla999

6
它将整个系统中的所有开发工作和所有用户数据进行序列化,除了运行时环境的内核外,一切都包括在内。
Smalltalk与Java一样,在运行符号字节码的虚拟机上运行,并且包含像垃圾回收器之类的低级内容。这使得Smalltalk非常便携,也非常易于编写一次,随处运行。
毫不奇怪,这是Java的灵感来源。因此,Smalltalk VM(StVM)相当于Java Runtime Environment。
在Smalltalk中,其他所有内容都存储在RAM中。代码库会动态地即时编译为StVM。您通过运行垂直和水平终端用户应用程序建立的所有对象数据。您对窗口环境及其外观所做的所有自定义。您编写的所有新代码。您在VM中加载的歌曲以在音乐播放器中播放。您使用或已加载的任何其他数据、代码或对象。
它全部都在PC的内存中。
定期地,您可能希望将当前状态保存到磁盘中。当您这样做时,会暂时冻结Smalltalk VM,并将everything复制到单个磁盘文件中。该磁盘文件称为映像文件,默认情况下,在大多数PC发行版(无论它们运行Linux、MacOS、Windows还是RiscOS)中,它将具有.image后缀。
这就像您在典型PC上的文字处理器或电子表格中保存正在进行的工作一样。除了此保存包括电子表格应用程序本身由最新版本的电子表格代码组成。
Smalltalk系统确实有其他保护数据的方法。如果您开发任何软件或更改Smalltalk系统编写的任何代码库,则会实时记录每个更改到磁盘中。
您可以选择编写代码或加载应用程序,以将源代码及其关联的数据结构保存到分布式源代码存储库或本地磁盘上的存储库。或关系数据库。或对象数据库或最近流行的NoSQL数据库。
大多数预先编写的应用程序会即时将数据备份到磁盘或数据库中。
该映像是整个Smalltalk系统的保存(除了虚拟机。虚拟机相当于Java Runtime Environment。其他所有内容都存储在映像中。
编写一个新的文件系统以访问底层操作系统的磁盘?那也在图像中。(并且所有更改也已被Smalltalk系统自动记录到磁盘中)。
输入大量数据到基于图像的Smalltalk对象数据库中?那也在图像中。

想要对Smalltalk系统进行出厂设置吗?只需回到您第一次安装Smalltalk时收到的镜像文件。想要每小时保存图像,并在四小时前恢复吗?只需加载四个小时前的图像文件。

该图像是Smalltalk系统在内存中拷贝的所有内容,除了虚拟机这一小部分不变且至关重要的系统。


2
我建议你阅读Pharo By Example。引用它第一章的话说:
“当前的系统镜像是一个运行中的Pharo系统的快照,被冻结在时间上。它由两个文件组成:一个.image文件,其中包含系统中所有对象的状态(包括类和方法,因为它们也是对象),以及一个.changes文件,其中包含系统源代码的所有更改日志。在图1.1中,这些文件被称为pharo.image和pharo.changes。”
希望对你有帮助。

1
简单来说,Smalltalk镜像是在某个时间点保存的Smalltalk环境的图像。当这个图像重新加载到Smalltalk运行时系统中时,一切都与保存图像时的状态相同。
由一个Smalltalk系统保存的图像通常不能被另一个Smalltalk系统加载。
我发现基于图像的开发非常有力量。如果我被打断了,我可以保存图像,当我回来时,我就回到了原来的地方。打开的调试器仍然打开,等待继续。几乎没有“必须弄清楚如何回到原来的位置” - 更多的是“好的,让我们继续...”。
分享和享受。

1

0
在几乎所有其他语言中(除了据一些高级SAP开发人员告诉我,ABAP语言之外),你都有一个明确的分离:
  • 定义逻辑的正在工作的代码
  • 你正在运行的程序状态
  • 通常是数据库、你所需要的东西做为输入给你的代码

在Smalltalk中,所有这些 - 注意可以 - 都可以在影像中完成。 理论上,你可以在已加载的影像中部署Smalltalk应用程序,该影像将带来所有数据和逻辑,并在启动时运行应用程序。 实际上,根据我的经验,出于某些原因,你倾向于不这样做。

如果你留在影像中,你可以随心所欲地使用所有可用资源,好的或坏的。 类是对象,方法是对象,所以你实际上可以做添加

self halt

在一个方法中,运行一些调用该方法的代码,当其正在执行时更改该方法,重新编译并使代码继续执行。 您还可以像将方法名称作为字符串传递给方法一样做出奇妙的事情,然后执行参数,而无需在任何地方查看此内容。 这两件事都非常适合学习和尝试。不适合生产代码或维护生产代码。
我最初遇到的困难是,例如对于UI创建,您会在Smalltalk映像中创建一个窗口,然后由操作系统“第二次”创建该窗口,包括窗口句柄等。 当然,您可以将窗口保存在Smalltalk映像中,它也会再次打开(通常),但内部发生的情况是有一个窗口列表(即所有UI组件),其中已将它们的Smalltalk状态与图像一起保存。 在图像启动期间,有一个过程会遍历此列表并要求操作系统重新创建所有这些窗口。 理论上,您可以对操作系统提供的所有内容都这样做:文件句柄、资源句柄、端口等。 实际上,您可能不想这样做。 我曾经工作的公司有很好的入门教程,介绍在保存图像之前要运行的代码,以便在第二天重新启动时不会遇到问题。
理想情况下,你可以将 Smalltalk 的图像概念与持久性结合起来,并将所有对象存储在真实的数据库中。 但我不确定是否有任何 Smalltalk 方言已经这样做了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接