我是Smalltalk的新手。我已经阅读了一些关于它的文章和文档,我对其概念的完整性感到惊讶。它提供了某种实时调试。
无论如何,对于程序错误,错误意味着程序逻辑错误,程序的所有累积突变都是无效的。为了保证完整性,应该从某个点重新启动整个程序,整个程序状态应该回滚。
Smalltalk如何处理这个问题? (也许这个问题可以应用于所有动态REPL语言......)
答案 0 :(得分:6)
Smalltalk使用Exception对象。我建议您阅读有关https://gforge.inria.fr/frs/download.php/26600/PBE2-Exceptions-2010-03-02.pdf
的章节它是Pharo By Example书的一部分:http://pharobyexample.org/
关于变异,调试等,请注意Smalltalk在语言中有很多东西。例如,MethodContext类。这些对象代表VM正在执行的方法上下文。因此,您可以检查它们,并像常规对象一样使用它们。与CompiledMethod相同。只是为了好玩,检查“伪”变量'thisContext':)
如果您想自己回答答案,请查看Debugger类。那么,您想知道在调试器中间重新启动方法时会发生什么吗?然后在Debugger中浏览方法#restart并按照:))
答案 1 :(得分:3)
您实际上是在问“这个整个计算机如何回滚到已知状态?”,因为Smalltalk图像与VMWare和VirtualBox具有相同意义上的虚拟机。
我们最接近撤消任意副作用的能力(排除明显的不可能性,如回滚I / O)可能是Alessandro Warth的 Worlds ,正如他的博士论文所述{{3} }。至少在一般意义上:当然可以使用Memento和Command模式之类的东西来实现可撤销操作。
答案 2 :(得分:1)
我猜你指的是图像中的很多对象在开发和调试时可能会进入不一致状态。通常的程序是将代码存储在像(Monticello for squeak / pharo)这样的软件包中。当您想要重置时,您将从分发中获得一个干净的图像,并从包中重新加载代码。对于已部署的应用程序以及程序包中的代码,您通常需要重新创建以某种外部形式存储的数据对象所需的信息,例如存储在文件中的序列化表单,或者存储在dql或noSql数据库中。因此,您的重置过程将采用新的映像,从包中加载代码,从外部存储加载数据模型对象。
答案 3 :(得分:1)
没有!
我知道他们都没有支持这种交易。设置执行期间累积的所有副作用。没有支持的自动回滚。有研究正在研究如何支持这一点,但没有尝试AFAIK。您必须知道,如果您正在调试并返回堆栈跟踪,那么对象不处于执行时的状态。你只看到最新状态的物体。
虽然以通用方式支持这一点并不容易,但有一些方法可以通过程序设计来解决这个问题。最突出的方法是: