我过去在业余时间做IronLua的工作。词法分析和解析目前已经完成。我因为沮丧而停止了对它的工作,因为在.NET中实现Lua协程而不求助于肮脏的线程编程并不容易。这与我如何编译Lua函数有关,这是我在设计编译器时需要尽早解决的问题。
我一直在研究协程实现,结果证明我最初对延续的感觉是正确的。
由于协程创建、产出和其他操作不是语言关键字,而是“协程”表中的函数,因此我不能静态地切换到CPS样式的编译,因为协程表可能已被以前的脚本覆盖。虽然我知道脚本重写协程表的情况很少发生,但我还是希望安全起见,尽可能干净利落地处理这个问题。
我的计划是对每个表达式使用延续传递样式,无论我们是否处于协程中。每件事之后都会有一个延续。
除了首先编写编译器并在其上添加CPS转换的明显困难之外,我还对这个设计决策及其性能影响感到困扰。
我正在寻找关于Lua协程在.NET中实现的建议。
耽误您时间,实在对不起。
发布于 2011-08-09 23:10:48
我不熟悉lua协同例程的细节。但我认为,您可以获得与lua本身所支持的类似级别的协同例程支持的唯一方法是,所有局部变量都以某种形式分配到堆上。
您的问题不仅仅是协程函数可能会被替换,而且您调用的任何lua函数都可能产生结果。
您还应该研究异步CTP,它在C#中实现了非常相似的行为。我看到的主要区别是,您需要使所有方法都是异步的,而C#功能是选择加入的。
如果你的.net集成很好(如果构建在DLR上就更好了),那么我就不会太担心性能了。很容易用C#编写性能关键部分,并使用lua编写胶水代码。
发布于 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
https://stackoverflow.com/questions/6384632
复制相似问题