“Continuation”(在Smalltalk中)和“interrupt”(在汇编语言中)有何区别?

3

我很难理解Continuations的概念(在Smalltalk中与Seaside一起使用)。维基百科上的一段摘录如下:

"……指的是一级续体,这是一种构造,使编程语言能够在任何时候保存执行状态并在程序的稍后时间返回到该点……"

这不仅仅是另一种表达汇编程序员在编写中断时所做的事情的方式吗?还是我完全误解了这个概念!


Translated:

我很难理解Continuations的概念(在Smalltalk中与Seaside一起使用)。维基百科上的一段摘录如下:

"……指的是一级续体,这是一种构造,使编程语言能够在任何时候保存执行状态并在程序的稍后时间返回到该点……"

这是否就是另一种表达汇编程序员在编写中断时所做的事情的方式呢?或者是我完全误解了这个概念!

3个回答

12

续延(Continuation)可以被视为运行进程的快照副本。捕获一个续延意味着当前进程被复制并放置在一边。之后,代码继续正常执行。评估一个续延意味着当前进程被终止,并且复制的进程以完全相同的状态恢复执行。续延通常可以被多次恢复。

中断(Interrupt)更像是协程,其中有两个不同的执行线程(应用程序代码、中断处理程序)相互交替。


3

Continuations(续体)大致等同于C语言中的setjmp/longjmp。当您调用续体时(堆栈、标志、寄存器、指令指针等等),您可以期望您的上下文保持完好无损。因此,它类似于软件中断调用,只是在处理程序完成后您不必返回(或更准确地说,调用续体),而且续体并不是隐式的。


听起来像是在高级语言中使用GOTO吗?“Continuations”(续延)是否是个好的实践方式呢?我只是问这个问题,因为GOTO可能会引起各种结构上的问题。谢谢,Kevin。 - KHWP
2
事实上,它们在很多情况下都像goto语句一样使代码难以跟踪。但是,它们不像命令式语言那样会出现跳转到无效上下文的问题。与标签不同的是,在实际初始化其上下文之前,您无法创建一个 continuation。 - artificialidiot

1
在某些方面,它们是相似的。但是,续延由程序本身调用,而中断通常由计算机上的CPU或设备生成。此外,中断更像是C信号,只需调用即可返回控制权给程序。中断负责保存状态并在之后恢复它。
另外,应该注意,您可以很容易地在汇编语言中实现续延。

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