我刚开始学习 Smalltalk,了解它的语法,但还没有用它进行任何真正的编码。在阅读一些介绍性文章和一些 SO 问题时,例如:
一个问题总在我脑海中浮现:Smalltalk 镜像是如何处理 IO 的?
smalltalk 程序可以使用存储在映像中的信息从它退出的地方恢复。假设我有一些打开的 TCP 连接(更不用说各种缓冲区),它们如何恢复?除了重新打开它们之外,似乎别无他法(此答案已证实)。如果 Smalltalk 确实重新打开了这些连接,这是否与“稍后从您停止的地方恢复执行程序”的想法背道而驰?或者背后有什么魔力?
Pharo 说,我不介意答案是否特定于某些方言。
也有兴趣了解一些资源以了解有关此主题的更多信息。
添加一个小历史课可能会很有用:Smalltalk 是在 20 世纪 70 年代由 Xerox 帕洛阿尔托研究中心 (PARC) 创建的。在同一时间、同一地点,个人计算被发明。同样在同一时间、同一地点,以太网被发明。
Smalltalk是一个单一的集成系统,它同时是IDE、GUI、shell、内核、操作系统,甚至CPU的微代码也是Smalltalk系统的一部分。Smalltalk 不必处理来自图像外部的非 Smalltalk 资源,因为无论出于何种意图和目的,都不存在“外部”。重新创建精确的机器状态是可能的,因为虚拟机和机器之间实际上没有任何边界。(几乎所有的系统都是在 Smalltalk 中实现的。只有少量的微代码、汇编和 Mesa。甚至我们现在认为的设备驱动程序也是用 Smalltalk 编写的。)
没有必要与其他计算机保持网络连接,因为除了少数实验室之外没有人拥有网络。哎呀,几乎没有组织拥有超过一台计算机。无需与主机操作系统交互,因为 Smalltalk 机器没有操作系统;Smalltalk是操作系统。(您可能知道Dan Ingalls 的《Smalltalk 背后的设计原则》中的一句名言:“操作系统是不适合某种语言的事物的集合。不应该有一个。”)因为 Smalltalk 是操作系统,所以有不需要文件系统,所有数据只是对象。
Smalltalk 无法控制 Smalltalk 之外的内容。这是一个通用属性,并非 Smalltalk 所独有。您可以通过编辑编译的字节码来打破 Java 中的封装。您可以通过编辑编译的机器代码来破坏 Haskell 中的类型安全。您可以通过编辑编译的机器代码在 Rust 中造成内存泄漏。
因此,Smalltalk 的所有保证、功能和属性只有在您不离开 Smalltalk 时才可用。
这是一个更简单的示例,不涉及网络或将映像移动到不同的计算机:打开主机文件系统中的文件。暂停图像。删除文件。恢复图像。无法将图像恢复到相同状态。
Smalltalk 所能做的就是尽可能地近似外部资源的状态。它可以尝试重新打开该文件。如果该文件消失了,它可能会尝试创建一个具有相同名称的文件。它可以尝试恢复网络连接。如果失败,它可以尝试重新建立连接,创建到同一地址的新连接。
但最终,图像之外的一切都超出了 Smalltalk 的控制范围,Smalltalk 对此无能为力。
请注意,图像内部和“外部世界”之间的阻抗不匹配是 Smalltalk 经常受到的主要批评之一。如果你看看试图与外界深度整合的 Smalltalk 系统,你会发现它们常常不得不做出妥协。例如GNU Smalltalk,它是专门为了深度集成到Unix系统中而设计的,实际上放弃了镜像和持久性。
正如您所指出的,某些资源不是内存堆的一部分,因此仅通过将图像加载回内存将无法恢复。这尤其适用于由操作系统管理的各种资源,以及跨平台 Smalltalks,您可以在其中将映像从一个操作系统复制到另一个操作系统并重新启动映像,甚至必须以与以前不同的方式恢复这些资源。
我看到的 Smalltalks 中的技巧是所有类在图像恢复后立即收到一条消息。通过为该消息实现一种方法,他们可以恢复其实例可能需要的任何瞬态资源(套接字、连接、外部句柄等)。要查找所有实例,一些 Smalltalks 提供诸如 的消息allInstances,或者您必须自己维护相关对象的注册表。
如果 Smalltalk 确实重新打开了这些连接,这是否与“稍后从您停止的地方恢复执行程序”的想法背道而驰?
从用户的角度来看,在重新初始化和重新分配资源之后,即使某些技术细节在幕后发生了变化,但一切看起来仍然像“您停止的地方”。当然,如果无法恢复资源(例如,没有网络),情况就不会如此。Smalltalk 魔法无法克服某些限制。
Smalltalk 映像如何处理 IO?
为了使上述恢复成为可能,所有外部资源都被包装并表示为某种 Smalltalk 对象。尽管当 Smalltalk 关闭时,包装对象将与外部世界断开连接,但包装对象将保留在映像中。然后,包装器可以在映像再次启动后恢复外部资源。
| 归档时间: |
|
| 查看次数: |
213 次 |
| 最近记录: |