题
我工作的一个方案解释写入C.目前使用的C runtime叠作为其自己的堆,这是呈现一个小问题与执行的延续。我目前的解决方案手册是复制的C堆堆那么复制它回来的时候需要。除了不是标准的C,这种解决方案几乎是不理想。
什么是最简单的方法来实现的延续进行方案C?
其他提示
一个很好的总结可在 执行战略一类的延续, 一条通过克林杰,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机 一旦机是实现。
延续不是问题:你可以实现这些定期的高阶的职能利用CPS。问题的天真堆分配是尾呼吁是不优化,这意味着你不可能方案。
目前最好的办法映射方案的意大利面条堆栈是蹦床使用:基本上额外的基础设施来处理非C-像话和退出程序。看看 Trampolined式(ps).
还有 一些代码 说明的这些想法。
传统的方法是使用 setjmp
和 longjmp
, 虽然有的注意事项。
这里有一个 相当不错的解释
延续基本上包括的所保存的状态的堆和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秒钟,如果你成长的输入号码它会崩溃。