4

针对将延续暴露为一流对象的一些批评是什么?

我觉得有一流的延续很好。它允许完全控制指令的执行流程。高级程序员可以为某些类型的问题开发直观的解决方案。例如,延续用于管理 Web 服务器上的状态。语言实现可以在延续之上提供有用的抽象。例如,绿色线程。

尽管如此,是否有反对头等舱延续的强烈论据?

4

7 回答 7

7

现实情况是,许多可以使用延续的有用情况已经被专门的语言结构所涵盖:throw/catch、return、C#/Python yield。因此,语言实现者并没有太大的动力以可用于自己动手解决方案的通用形式提供它们。

在某些语言中,泛化延续很难有效实现。基于堆栈的语言(即大多数语言)基本上必须在每次创建延续时复制整个堆栈。

这些语言可以实现某些类似延续的特性,那些不会破坏基于堆栈的基本模型的特性,比一般情况更有效,但实现广义延续相当困难且不值得。

由于以下几个原因,函数式语言更有可能实现延续:

  1. 它们经常以连续传递方式实现,这意味着“调用堆栈”可能是在堆上分配的链表。这使得将指向堆栈的指针作为延续传递变得微不足道,因为当您弹出当前帧并推送新帧时,您不需要覆盖堆栈上下文。(我从未实施过 CPS,但这是我对它的理解。)
  2. 他们喜欢不可变的数据绑定,这使您的旧延续更加有用,因为您不会更改创建堆栈时指向的变量的内容。

由于这些原因,延续很可能主要只停留在函数式语言的领域。

于 2009-12-03T01:01:10.187 回答
4

首先,当涉及到延续时,不仅仅是 call/cc。我建议从 Mark Feelys 的论文开始:A better API for first class continuations

接下来我建议阅读有关控制运算符 shift 和 reset 的内容,这是表示连接的另一种方式。

于 2009-09-23T05:59:46.917 回答
4

一个重要的反对意见是实施成本。如果运行时使用堆栈,则一流的延续在某些时候需要堆栈副本。复制成本是可以控制的(参见Representing Control in the Presence of First-Class Continuations以获得良好的策略),但这也意味着不能在堆栈上分配可变变量。这对于函数式或主要函数式(例如,Scheme)语言来说不是问题,但这会增加 OO 语言的大量开销。

于 2009-12-03T00:39:52.307 回答
2
  1. 大多数程序员不理解它们。如果您有使用它们的代码,则很难找到能够使用它们的替代程序员。
  2. 在某些平台上很难实现延续。例如,JRuby 不支持延续。
于 2009-09-22T06:14:05.083 回答
1

一流的延续破坏了对代码进行推理的能力,尤其是在允许将延续强制分配给变量的语言中,因为闭包的内部可以以毛茸茸的方式再次活跃起来。

参照。Kent Pitman 关于延续的抱怨,关于 unwind-protect 与 call/cc 交互的棘手方式

于 2009-12-03T13:25:16.320 回答
0

Call/cc 是高级函数式编程的“goto”(例如此处的示例)。

于 2009-09-22T06:16:34.750 回答
0

在 ruby​​ 1.8 中,实现非常缓慢。在 1.9 中更好,当然大多数方案都内置了它们并且从一开始就表现良好。

于 2009-09-22T07:20:03.217 回答