.net - 用于协程实现的 CPS 编译器

标签 .net compiler-construction lua continuations coroutine

我曾经在业余时间从事 IronLua 的工作。目前已完成词法分析和解析。由于在 .NET 中实现 Lua 协程而不诉诸肮脏的线程技巧并不容易,我有点沮丧地停止了它的工作。这与我编译 Lua 函数的方式有关,这是我在设计编译器时需要尽早解决的问题。

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

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

我的计划是对每个表达式使用连续传递样式,无论我们是否在协程中。一切都将紧随其后。

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

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

谢谢你的时间。

最佳答案

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

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

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

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

关于.net - 用于协程实现的 CPS 编译器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6384632/

相关文章:

.net - 如何在 .Net msi 安装程序中设置发布者

Lua 拒绝读取文件

c++ - 将 C++ vector 绑定(bind)到 Lua

c# - 在 .NET 中,Dictionary<string,TValue> 是否存在键冲突

.net - 在 .NET 中将字符串转换为 System.Color

parsing - Bison 语法文件中出现一次或多次

c - x86/x64 平台上的嵌入式开发通常使用哪些 C 编译器?

lua - 如何使用/包含 lpeg luapeg re 模块

c# - 如何获取程序集文件版本

c++ - 调试信息是否显示 C++/MSVC 中的代码?