针对将延续暴露为一流对象的一些批评是什么?
我觉得有一流的延续很好。它允许完全控制指令的执行流程。高级程序员可以为某些类型的问题开发直观的解决方案。例如,延续用于管理 Web 服务器上的状态。语言实现可以在延续之上提供有用的抽象。例如,绿色线程。
尽管如此,是否有反对头等舱延续的强烈论据?
针对将延续暴露为一流对象的一些批评是什么?
我觉得有一流的延续很好。它允许完全控制指令的执行流程。高级程序员可以为某些类型的问题开发直观的解决方案。例如,延续用于管理 Web 服务器上的状态。语言实现可以在延续之上提供有用的抽象。例如,绿色线程。
尽管如此,是否有反对头等舱延续的强烈论据?
现实情况是,许多可以使用延续的有用情况已经被专门的语言结构所涵盖:throw/catch、return、C#/Python yield。因此,语言实现者并没有太大的动力以可用于自己动手解决方案的通用形式提供它们。
在某些语言中,泛化延续很难有效实现。基于堆栈的语言(即大多数语言)基本上必须在每次创建延续时复制整个堆栈。
这些语言可以实现某些类似延续的特性,那些不会破坏基于堆栈的基本模型的特性,比一般情况更有效,但实现广义延续相当困难且不值得。
由于以下几个原因,函数式语言更有可能实现延续:
由于这些原因,延续很可能主要只停留在函数式语言的领域。
首先,当涉及到延续时,不仅仅是 call/cc。我建议从 Mark Feelys 的论文开始:A better API for first class continuations
接下来我建议阅读有关控制运算符 shift 和 reset 的内容,这是表示连接的另一种方式。
一个重要的反对意见是实施成本。如果运行时使用堆栈,则一流的延续在某些时候需要堆栈副本。复制成本是可以控制的(参见Representing Control in the Presence of First-Class Continuations以获得良好的策略),但这也意味着不能在堆栈上分配可变变量。这对于函数式或主要函数式(例如,Scheme)语言来说不是问题,但这会增加 OO 语言的大量开销。
一流的延续破坏了对代码进行推理的能力,尤其是在允许将延续强制分配给变量的语言中,因为闭包的内部可以以毛茸茸的方式再次活跃起来。
参照。Kent Pitman 关于延续的抱怨,关于 unwind-protect 与 call/cc 交互的棘手方式
Call/cc 是高级函数式编程的“goto”(例如此处的示例)。
在 ruby 1.8 中,实现非常缓慢。在 1.9 中更好,当然大多数方案都内置了它们并且从一开始就表现良好。