协程实现的CPS编译器

时间:2011-06-17 10:47:49

标签: .net compiler-construction lua continuations coroutine

我以前在业余时间在IronLua工作。 Lexing和解析目前已完成。由于在.NET中实现Lua协同程序而不采用脏的线程攻击并不容易,我有点因为沮丧而停止工作。这与我编译Lua函数的方式有关,这是我在设计编译器时需要尽早解决的问题。

我一直在研究协同程序的实现,结果发现我对延续的初步感觉是正确的。

由于协程创建,yield和其他操作不是语言关键字,而是“coroutine”表中的函数,我无法静态切换到CPS样式的编译,因为协程表可能已被前一个脚本覆盖。虽然我知道覆盖coroutine表的脚本很少见,但我希望能够安全地尽可能干净地解决问题。

我的计划是对每个表达都使用延续传递样式,无论我们是否在协程中。一切都会延续下去。

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

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

感谢您的时间。

2 个答案:

答案 0 :(得分:1)

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

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

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

如果您的.net集成良好(并且我希望在DLR上构建它是好的)那么我不会太担心性能。在C#中编写性能关键部分很容易,并使用lua作为粘合代码。

答案 1 :(得分:0)

您可能希望更多地了解针对.NET上的Scala所做的工作。 Scala支持continuation作为编译器插件。

警告:我不知道延续支持是否适用于.NET,或者实际上编译器本身的工作是否先进。负责此事的人是Miguel Garcia,你可以在Scala Lang找到他的地址:The Scala Development Team

以下参考资料可能有用:

Scala comes to .Net

The Scala Compiler Corner, for .NET and Mono fans