首页 / 知识
关于C#:如何实施延续?
2023-04-11 22:24:00

How to implement continuations?我正在使用C编写的Scheme解释器。目前,它使用C运行时堆栈作为其自己的堆栈,这在实现延续性方面存在一个小问题。我当前的解决方案是将C堆栈手动复制到堆,然后在需要时将其复制回。除了不是标准C之外,此解决方案也不是理想的选择。 在C中实现Scheme的延续的最简单方法是什么? Clinger,Hartheimer和Ost的文章《一流的延续的实施策略》中有很好的摘要。我建议特别查看Chez Scheme的实施。 堆栈复制并不是那么复杂,并且有许多众所周知的技术可以用来提高性能。使用堆分配的帧也很简单,但是您需要权衡在不使用显式连续的"正常"情况下创建开销的方法。 如果将输入代码转换为延续传递样式(CPS),则可以完全消除堆栈。但是,尽管CPS很优雅,但它在前端增加了另一个处理步骤,并且需要进行额外的优化来克服某些性能隐患。 我记得读过一篇对您可能有帮助的文章:切尼(M.T.A.) :-) 我知道的Scheme的某些实现(例如SISC)在堆上分配其调用帧。 @ollie:如果所有呼叫帧都在堆上,则无需进行吊装。当然,需要在性能上进行权衡:提升时间和在堆上分配所有帧所需的开销。也许它应该是解释器中的可调运行时参数。 :-P 如果您是从头开始的,那么您确实应该查看Continuation Passing Style(CPS)转换。 好的资料包括90分钟演讲中的"小片段LISP"和Marc Feeley的计划。 看来Dybvig的论据至今尚未提及。 R。肯特·迪布维格(Kent Dybvig)。"方案的三种实现模型"。 也可以在ReadScheme.org上查看实施文件。 摘要如下:
除了到目前为止您已经获得的不错的答案之外,我还建议您使用Andrew Appel的" Continuations with Continuations"。它写的很好,虽然不直接与C打交道,但却为编译器编写者提供了很多不错的主意。 Chicken Wiki也有一些非常有趣的页面,例如内部结构和编译过程(其中CPS会以实际的编译示例进行解释)。 连续性不是问题:您可以使用CPS实现具有常规高阶函数的连续性。天真的堆栈分配的问题是,尾部调用从未被优化,这意味着您不能成为方案。 将方案的意大利面条堆栈映射到堆栈上的最新最佳方法是使用蹦床:本质上是额外的基础结构,用于处理非C类的调用和过程的退出。请参见蹦床样式(ps)。 有一些代码说明了这两个想法。 您可以查看的示例有:Chicken(Scheme实现,用C编写,支持延续);保罗·格雷厄姆(Paul Graham)的《论Lisp》-在其中创建了一个CPS转换器,以在Common Lisp中实现延续的子集;和Weblocks-一个基于连续性的Web框架,该框架还在Common Lisp中实现了一种有限形式的连续性。 传统方法是使用 这是一个很好的解释 连续性基本上由堆栈的保存状态和上下文切换点处的CPU寄存器组成。至少在切换时不必将整个堆栈复制到堆中,您只需重定向堆栈指针即可。 使用纤维轻松实现连续化。 http://en.wikipedia.org/wiki/Fiber_(computer_science) 在Windows中,光纤是使用CreateFiber / SwitchToFiber系列调用来完成的。 boost ::协程具有针对C的协程的有效实现,可以用作实现的参考点。 正如 这个想法是,延续是一个闭包,它保留了其评估控制堆栈。为了使用 创建延续之后的那一刻继续进行评估,需要控制堆栈。 通常调用延续会花费较长的时间,并用重复的堆栈填充内存。我写了这个愚蠢的代码来证明,在mit-scheme中,它会使方案崩溃, 代码将前1000个数字相加
如果从1000切换到100000,代码将花费2秒钟,如果增加输入数字,它将崩溃。 Patrick是正确的,真正做到这一点的唯一方法是在解释器中使用显式堆栈,并在需要转换为延续时将相应的堆栈段提升到堆中。 这基本上与支持闭包的语言所需要的语言相同(闭包和延续在某种程度上是相关的)。 改为使用显式堆栈。 |
最新内容
相关内容
python代码如何在命令行运行
python代码如何在命令行运行,代码,培训,路径,空格,文件,下面,以上,目录,更多,内容,我们在编写python代码时,可以在交互模式下运行代码,也可以用python模块能优化Python的运行速度
python模块能优化Python的运行速度吗?,代码,平台,培训,官网,环境,工作,系统,模块,程序,语言,今天介绍下Psyco模块,Psyco模块可以使你的Pythonpython解释器的多种使用
python解释器的多种使用,培训,文件,多种,脚本,后面,目录,终端,文件名,文件夹,路径,python解释器的多种使用1、在终端输入python就可以运行Pytpython解释器有几种
python解释器有几种,代码,技术,培训,语言,字节,速度,教程,内核,虚拟机,外观,python解释器有几种1、CPythonCPython这个解释器是用C语言开发的如何在Ruby脚本中运行Rake任务?
如何在Ruby脚本中运行Rake任务?,如何在Ruby脚本中运行Rake任务?,调用,命令行,我想,我有一个,How do I run Rake tasks within a Ruby s上下文选择器与使用DOM节点
上下文选择器与使用DOM节点,上下文,选择器,与,使用,DOM,节点,Selector,Context,, Selector Context(上下文选择器) 默认