低级Lua口译员

时间:2009-03-14 20:14:45

标签: lua

有没有办法在比标准“lua_pcall”函数调用更细粒度的级别上运行C / C ++程序中的Lua代码?理想情况下,我希望能够遍历一个低级字节码指令列表(假设它有这样的东西)并逐个运行它们,这样我就可以编写自己的调度程序,它可以控制事物而不仅仅是运行从头到尾完整的Lua功能。

我想这样做的原因是因为我希望实现Lua代码可以调用的C函数,这将导致程序在继续执行之前等待某个(可能是冗长的)动作完成。在典型的Lua脚本中会有很大比例的这样的函数调用,所以在动作完成后重写它以使用回调的想法并不实际。

4 个答案:

答案 0 :(得分:14)

或许可以撇开这个问题,但你可以使用Lua协同程序而不是自定义C语言来等待某个事件发生。

例如,一个协程可以调用waitForEvent()函数。在那里,您可以切换到另一个coro,直到该事件发生,然后恢复第一个。有关详细信息,请查看the lua coro docs

答案 1 :(得分:6)

如果你可以使用Lua的协作线程(显式良率)功能编写那些漫长的等待C例程,那么Jder建议使用协同程序将非常有效。你仍然会使用lua_pcall()来输入Lua,但是入口点将是你的协程管理器功能。

这只适用于C例程在等待时不执行任何操作的情况。如果他们长时间运行,因为他们计算某些东西,那么你需要运行多个OS线程。 Lua是线程安全的 - 只需创建多个线程并在每个线程中运行lua_open()。

来自http://www.lua.org/pil/24.1.html

  

Lua库没有定义全局   变量。它保留了所有   动态结构中的状态   lua_State和指向它的指针   结构作为参数传递给   Lua里面的所有功能。这个   实现使Lua可以重入和   准备用于多线程   代码。

您也可以将这两种方法结合起来。如果你有一个包装器Lua函数来启动一个OS线程,你可以在启动线程后产生。协程管理器将跟踪线程并在它启动的线程完成后继续协程。这允许您使用单个Lua解释器和多个运行纯C代码的工作线程。

答案 2 :(得分:5)

如果您采用操作系统线程方式,请查看Lua Lanes。我认为它是你想要实现的目标的完美解决方案(=将一个插件添加到混合中,你将制作清晰,易懂和简单的代码,并且无缝内置多线程)。

请告诉我们您的问题是如何解决的。 :)

答案 3 :(得分:2)

debugging interface有帮助吗?