【发布时间】:2014-02-08 17:40:47
【问题描述】:
我正在用 C# 实现一个 Lua 解释器,我偶然发现了一个性能问题,我认为这是由不正确的设计引起的:
在我的实现中,范围以分层方式排列,也就是说,每个范围都有一个父范围,它可能为空,也可能不为空;每次设置或请求变量时,范围都会检查指定的变量是否包含在其中。如果没有,则要求其父级执行相同的操作,或者,如果没有父级,则创建它/返回 nil。
问题是作用域在下面使用Dictionary<string, LuaObject>,而Get/Set 函数是递归的。有更好的方法吗?我一直在考虑不同的方法,我发现了这个,它不是很优雅也不是很高效(受 V8 和 C# 闭包的启发):
使用类型和字段作为变量。
- 每次请求之前未声明的变量时,请使用继承前一个类型的反射创建一个新类型。
- 如果声明了函数,请检查它是否使用了在外部作用域中声明的变量。如果是这样,请重新创建该类型的字段并使外部变量指向新变量。 (我知道这点解释得非常糟糕,但这只是 C# 闭包的标准实现方式。如果你不明白,你可以去阅读)
有更简单/更优雅的解决方案吗? Lua 内部是如何实现的?
【问题讨论】:
-
关于 Lua 的内部实现,this reading order for Lua 的源代码你可能会感兴趣。
-
谢谢,我找不到任何解释 Lua 源代码的文档,阅读它绝对不容易:)