我工作的一个方案解释写入C.目前使用的C runtime叠作为其自己的堆,这是呈现一个小问题与执行的延续。我目前的解决方案手册是复制的C堆堆那么复制它回来的时候需要。除了不是标准的C,这种解决方案几乎是不理想。

什么是最简单的方法来实现的延续进行方案C?

有帮助吗?

解决方案

我记得我阅读了一篇文章,可能有助于你: 切尼在M.T.A. :-)

一些实施中的方案,我知道的,例如 SISC, 分配他们的电话框架堆上的.

@奥利:你不需要做到提升,如果所有你的电话框架是在堆。有一个折衷的性能:时间到提升,与所需的开销的分配的所有框架堆上的.也许这应该是一个可调谐运行参数的解释。:P

其他提示

一个很好的总结可在 执行战略一类的延续, 一条通过克林杰,Hartheimer,并Ost。我让你看Chez方案的执行情况尤其如此。

堆叠复制不是复杂的并有一定数量的良好理解技术可用以提高性能。使用堆分配框架也是相当简单,但是你作一个折衷的创建的开销用于"正常"情况下不使用明确的延续。

如果转换输入代码继续通过风格(CPS)然后,你可以摆脱消除叠。然而,虽然CPS是优雅加处理的另一步骤的前端,并需要额外的优化,以克服某些性能的影响。

如果你是从头开始,你真的应该看到继续通过风格(CPS)转变。

好的来源包括"口齿不清的小片"和 Marc Feeley的方案在90分钟的介绍.

它似乎Dybvig的论点是未尽为止。它是一种喜悦于阅读。堆基础的模型 是最容易实现,但基于堆叠 是更有效率。忽略基于字符串的模型。

R.肯特Dybvig."三个执行模式方案"。http://www.cs.indiana.edu/~dyb/文件/3imp.pdf

还检查了执行情况文件ReadScheme.org.http://library.readscheme.org/page8.html

该摘要如下:

这篇论文提出了三种实施模式的方案 编程语言。第一个是一堆为基础的模式用于一些 形式在大多数方案实现的日期;第二是一个新的 堆为基础的模式,这是更有效率比 堆为基础的模式在执行大多数方案;第三个是一个新的 串为基础的模式旨在用于在多个处理器 执行的方案。

堆为基础的模式分配的几个重要数据结构中的一个 堆,其中包括实际参数清单、结合环境,并呼叫 框架。

堆为基础的模式分配这些相同的结构在一堆 只要有可能。这种结果在小堆分配更少的记忆 参考文献、缩短指令序列,少垃圾收集, 和更高效的使用的存储器。

串的基于模型的分配的版本的这些结构就在 该计划文本,其中表示作为一串的符号。在 基于字符串的模型,方案程序被翻译成FFP 语言设计的专门支持方案。在这个节目 语言是直接执行的FFP机, 多个处理器串减少计算机。

堆为基础的模式是立即实际受益;它是的 模型的使用作者的Chez方案系统,一个高性能的 执行的方案。串为基础的模式将是有用的 供应方案,作为一个高级别代FFP在FFP机 一旦机是实现。

除了很好的答案你已经得到了迄今为止,我建议安德鲁Appel的 编译的延续.这是写得很好并且尽管不直接处理C时,它是一个非常好的想法编译器的作家。

鸡Wiki还有一些网页,你会发现很有趣的,例如 内部结构汇编过程 (其中CPS解释与实际的实例的汇编).

例,你可以看看是: (a方案执行情况,编写C这一支助的延续);保罗*格雷厄姆的 在口齿不清 -他在那里创建一个CPS变压器,以实现的一个子集延续在共同的口齿不清;和 Weblocks -继续基于网络的框架,其中还实现了有限的形式继续在共同的口齿不清。

延续不是问题:你可以实现这些定期的高阶的职能利用CPS。问题的天真堆分配是尾呼吁是不优化,这意味着你不可能方案。

目前最好的办法映射方案的意大利面条堆栈是蹦床使用:基本上额外的基础设施来处理非C-像话和退出程序。看看 Trampolined式(ps).

还有 一些代码 说明的这些想法。

传统的方法是使用 setjmplongjmp, 虽然有的注意事项。

这里有一个 相当不错的解释

延续基本上包括的所保存的状态的堆和CPU注册点的方面交换机。至少你没有复制整个堆堆的时候,你只能向堆的指针。

延续是平凡实施使用的纤维。 http://en.wikipedia.org/wiki/Fiber_%28computer_science%29 .唯一的事情,需要精心包囊是参数通过和返回值。

在窗户的纤维做使用的CreateFiber/SwitchToFiber家庭的呼吁。在Posix兼容的系统,它可以做makecontext/swapcontext.

提升::协程的工作实现协同程序C++的,可以作为一个参考点,执行。

使用一个明确的叠代替。

帕特里克是正确的,只有这样,你真的可以这样做是使用一个明确的堆在你的翻译,并提升机的适当段的成堆堆的,当你需要转换成一个延续。

这基本上是相同的,为什么需要的支持,关闭在语言,支持他们(关闭和延续是有点有关)。

作为 soegaard 指出,主要参照仍然是 这一个

这个想法是,继续被封闭,让其评估控制堆。控制叠是必需的,以便继续评估从目前继续使用 call/cc.

经常援引的继续使长时间的执行并填充的存储器与重复。我写了这个愚蠢的代码,证明,在麻省理工学院的方案,它使得方案的崩溃,

代码的款项的第1000号码 1+2+3+...+1000.

(call-with-current-continuation 
 (lambda (break)
   ((lambda (s) (s s 1000 break))
    (lambda (s n cc)
      (if (= 0 n)
          (cc 0)
          (+ n
             ;; non-tail-recursive,
             ;; the stack grows at each recursive call
             (call-with-current-continuation
              (lambda (__)
                (s s (- n 1) __)))))))))

如果切换1000至100 000码将花2秒钟,如果你成长的输入号码它会崩溃。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top