什么是Smalltalk“图像”?是否像序列化Smalltalk运行时一样?
答案 0 :(得分:23)
大多数流行的编程系统将程序代码(以类定义,函数或过程的形式)与程序状态(例如对象或其他形式的应用程序数据)分开。它们在应用程序启动时加载程序代码,并且必须从配置文件或其他数据源显式重新创建任何先前的应用程序状态。应用程序员没有明确保存的任何设置,您必须在重新启动时进行设置。
然而,许多Smalltalk系统不区分应用程序数据(对象)和代码(类)。实际上,类本身就是对象。因此,大多数Smalltalk系统将整个应用程序状态(包括Class和非Class对象)存储在映像文件中。然后,Smalltalk虚拟机可以加载映像,将类似Smalltalk的系统恢复到以前的状态。
http://en.wikipedia.org/wiki/Smalltalk#Image-based_persistence
答案 1 :(得分:18)
Smalltalk图像是一个非常有趣的野兽。把它看作是一种不朽。许多当前的Smalltalk系统,其中包括Pharo,Squeak,VisualWorks,共享一个共同的祖先,即来自Xerox PARC的Smalltalk图像。然而,这个共同的祖先不是一些遥远的东西,但实际上仍然存在于那些现代系统中。通过向该图像中的对象发送消息来生成现代变体。其中一些消息实际上变形了当前对象。类是完整的对象,通过向类对象发送消息来创建新类。 Smalltalk图像中的一些对象可以追溯到1972年,当时第一个Smalltalk图像被引导! Smalltalk图像永远不会消亡,它们只会淡化为可能根本不同的东西。您应该查看您的应用程序构建与创建新的Smalltalk版本没有根本区别。
答案 2 :(得分:7)
当smalltalk VM启动时,它会将保存的对象状态(是的:包括打开的文件流,窗口,线程等)从“图像”加载到其内存中,并在保存图像时从它离开时继续执行。 在工作期间的任何时候,您都可以“保存图像”(也就是:当前整体状态的快照)到图像文件中。您可以在磁盘上保留多个图像。如果你从事不同的项目,这很有用。 图像通常(但不是在所有的小型系统中)可以跨架构移植;例如,一个吱吱声的图像可以加载到机器人的Windows和Mac(甚至是一个Android)吱吱作响的VM。图像不能跨越方言移植,有时也不能跨越方言中的版本。
图像通常包含所有内容 - 甚至包括调试器,编译器,编辑器,浏览器等。但是,对于部署,从图像中“剥离”(即删除未使用的东西)有时很有用 - 要么隐藏秘密(;-)或使其更小(适用于嵌入式或移动设备)。 大多数Smalltalks都不能没有图像,除了Smalltalk / X和(我认为)S#-Smalltalk(但我在这里很薄......)
要保存和传输源代码,图像无用 - 使用标准格式的文件输出或xml或任何其他传输格式(有很多)。 图像对于编组/解组也没有用;使用xml,binarystorage,数据库,glorb或任何其他序列化方法。
答案 3 :(得分:2)
http://book.seaside.st/book/getting-started/pharo-squeak/what-is-image
所有Smalltalk对象都存在 一种叫做图像的东西。图像是 包含所有内存的快照 在给定时间点的物体。
谷歌的第二次打击。
答案 4 :(得分:2)
我建议你阅读http://pharobyexample.org/ 第一章说:
“当前系统映像是正在运行的Pharo系统的快照, 及时冻结。它由两个文件组成:.image文件,其中包含 系统中所有对象的状态(包括类和方法, 因为它们也是对象)和.changes文件,其中包含所有的日志 对系统源代码的更改。在图1.1中,这些文件 被称为pharo.image和pharo.changes。“
HTH
答案 5 :(得分:1)
它序列化整个系统中的所有内容,包括所有开发工作和所有用户数据。除了运行时环境的内核之外的所有内容。
像Java一样,Smalltalk在运行符号字节码的虚拟机上运行,它包含垃圾收集器等低级内容。这使得Smalltalk非常便携,而且在任何地方都可以一次写入。不出所料,这是Java的灵感来源。因此Smalltalk VM(StVM)相当于Java Runtime Environment。
在Smalltalk中,其他所有内容都存储在RAM中。代码库,为StVM动态编译。您通过运行垂直和水平最终用户应用程序构建的所有对象数据。您对窗口环境及其外观所做的所有自定义。您编写的所有新代码。您加载到VM上以在音乐播放器中播放的歌曲。您正在使用或已加载的任何其他数据,代码或对象。
它们都存在于PC的记忆中。
您可能希望将当前状态播放保存到磁盘。执行此操作时,会暂时冻结Smalltalk VM,并将所有内容复制到单个磁盘文件中。该磁盘文件称为映像文件,默认情况下,它在PC上的大多数发行版中都有.image后缀(无论它们是运行Linux,MacOS,Windows还是RiscOS)。
当您使用典型PC上的文字处理程序或电子表格时,它就像您保存正在进行的工作的方式一样。除此之外,此保存包括电子表格应用程序本身由电子表格代码组成的最新版本的电子表格代码。
Smalltalk系统确实有其他保护数据的方法。如果您开发任何软件,或者更改编写Smalltalk系统的任何代码库,它会将每个更改实时记录到磁盘上。
您可以选择编写代码或加载应用程序,以便将源代码及其相关数据结构保存到分布式源代码存储库或本地光盘上的存储库。或者关系数据库。或者对象数据库或新时尚的NoSQL数据库。
大多数预先编写的应用程序会即时将数据备份到磁盘或数据库。
图像是整个Smalltalk系统的保存(除了虚拟机。虚拟机相当于Java运行时环境。其他所有内容都存储在图像中。
编写新的文件系统以访问底层操作系统的光盘?这就是图片中的内容。 (所有更改也已由Smalltalk系统自动记录到磁盘上。)
在Smalltalk基于图像的对象数据库中输入一大堆数据?这就是图片中的内容。
想要对Smalltalk系统进行出厂重置吗?只需返回使用第一次安装Smalltalk时收到的图像文件。想要每小时保存一次图像,然后恢复到4小时前?只需从四小时前加载图像文件。
该图像是Smalltalk系统在内存中的所有的副本。除了虚拟机系统的小而不变,重要的比例。
答案 6 :(得分:0)
简单地说,Smalltalk图像是Smalltalk环境的图像,它已在给定的时间点保存。将此图像重新加载到Smalltalk运行时系统时,所有内容都与保存图像时一样。
一个Smalltalk系统保存的图像通常不能由不同的Smalltalk系统加载。
我发现基于图像的开发非常强大。如果我被打断了,我可以保存图像,当我回到它时,我就会回到原来的位置。打开的调试器仍处于打开状态,等待继续。几乎没有“弄清楚如何回到原来的位置” - 它更“好吧,让我们继续......”。
分享并享受。
答案 7 :(得分:0)
在几乎所有其他语言中(除了ABAP,据一些高级SAP开发人员告诉我的),您之间都有明显的区别:
在Smalltalk中,所有这些可以-在图像中-可以。 从理论上讲,您可以在加载的映像中部署Smalltalk应用程序,该映像将带来所有数据和逻辑并在启动时运行该应用程序。 实际上,就我的经验来看,出于某些原因,您倾向于不这样做。
如果您留在图像中,则无论患病与否,都可以使用所有可用的东西。 类是对象,方法是对象,因此您实际上可以执行诸如添加
self halt
在一个方法中,运行一些调用此方法的代码,在执行该方法时更改该方法,重新编译它并使代码继续。 您还可以做一些很棒的事情,例如将方法名称作为字符串传递给方法,然后执行参数,而无需在代码中的任何位置看到它。 这两件事对于学习和尝试都是非常好的。不太适合生产代码或维护生产代码。
我在一开始就遇到的困难是,例如,要创建UI,您需要在Smalltalk映像中创建一个窗口,然后由操作系统“第二次”创建该窗口,其中包含窗口句柄和所有内容。 当然,您可以将窗口与Smalltalk图像一起保存,它也会再次打开(正常情况下),但是内部发生的事情是有一个窗口列表(即所有UI组件)已与图像一起保存在他们的Smalltalk状态。 在映像启动期间,有一个过程会遍历此列表,并要求操作系统重新创建所有列表。 从理论上讲,您可以为操作系统提供的所有功能执行此操作: 文件句柄,资源句柄,端口等 实际上,您可能不想这样做。 我工作过的公司在保存图像之前会运行好的初学者代码教程,以免在第二天重启时遇到麻烦。
理想地,您可以将Smalltalk图像概念与持久性相结合,并将所有对象存储在真实的数据库中。 但是,我不了解是否有任何Smalltalk方言做到了这一点。