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