首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于协同程序实现的CPS编译器

用于协同程序实现的CPS编译器
EN

Stack Overflow用户
提问于 2011-06-17 18:47:49
回答 2查看 610关注 0票数 5

我过去在业余时间做IronLua的工作。词法分析和解析目前已经完成。我因为沮丧而停止了对它的工作,因为在.NET中实现Lua协程而不求助于肮脏的线程编程并不容易。这与我如何编译Lua函数有关,这是我在设计编译器时需要尽早解决的问题。

我一直在研究协程实现,结果证明我最初对延续的感觉是正确的。

由于协程创建、产出和其他操作不是语言关键字,而是“协程”表中的函数,因此我不能静态地切换到CPS样式的编译,因为协程表可能已被以前的脚本覆盖。虽然我知道脚本重写协程表的情况很少发生,但我还是希望安全起见,尽可能干净利落地处理这个问题。

我的计划是对每个表达式使用延续传递样式,无论我们是否处于协程中。每件事之后都会有一个延续。

除了首先编写编译器并在其上添加CPS转换的明显困难之外,我还对这个设计决策及其性能影响感到困扰。

我正在寻找关于Lua协程在.NET中实现的建议。

耽误您时间,实在对不起。

EN

回答 2

Stack Overflow用户

发布于 2011-08-09 23:10:48

我不熟悉lua协同例程的细节。但我认为,您可以获得与lua本身所支持的类似级别的协同例程支持的唯一方法是,所有局部变量都以某种形式分配到堆上。

您的问题不仅仅是协程函数可能会被替换,而且您调用的任何lua函数都可能产生结果。

您还应该研究异步CTP,它在C#中实现了非常相似的行为。我看到的主要区别是,您需要使所有方法都是异步的,而C#功能是选择加入的。

如果你的.net集成很好(如果构建在DLR上就更好了),那么我就不会太担心性能了。很容易用C#编写性能关键部分,并使用lua编写胶水代码。

票数 1
EN

Stack Overflow用户

发布于 2011-08-09 19:03:31

你可能想多看看在.NET上为Scala所做的工作,Scala支持continuations作为一个编译器插件。

注意:我不知道延续支持在.NET中是否有效,也不知道编译器本身的工作有多先进。对此负责的人是Miguel Garcia,您可以在Scala Lang上找到他的地址:The Scala Development Team

以下参考资料可能对您有所帮助:

Scala comes to .Net

The Scala Compiler Corner, for .NET and Mono fans

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6384632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档