将 Javascript 编译为 Lua 的好处并不像您最初想象的那么好。Javascript 的语义与 Lua 的语义非常不同(LuaJIT 作者引用 Lua 的设计是 LuaJIT 可以与 Javascript JIT 编译器竞争的主要原因之一)。
拿这个代码:
if("1" == 1)
{
print("Yes");
}
这会在 Javascript 中打印“是”。Lua 中的等效代码没有,因为字符串永远不会等于 Lua 中的数字。这似乎是一个小问题,但它有一个根本的后果:我们不能再使用 Lua 内置的相等测试。
我们可以采取两种解决方案。我们可以重写1 == "1"
为javascript_equals(1, "1")
. 或者我们可以将每个 Javascript 值包装在 Lua 中,并使用 Lua 的元表来覆盖 == 运算符的行为。
因此,通过将 Javascript 映射到 Lua,我们已经失去了一些效率。这是一个简单的例子,但它一直这样继续下去。例如,Javascript 和 Lua 之间的所有运算符规则都不同。
我们甚至必须包装 Javascript 对象,因为它们与 Lua 表不同。例如 Javascript 对象仅支持字符串键,并强制对字符串的任何索引:
> a = {}
{}
> a[1] = "Hello"
'Hello'
> a["1"]
'Hello'
您还必须注意 Javascript 的范围规则、可变参数函数等。
现在,如果有人将精力投入到完整的编译器中,所有这些事情都是可以克服的。然而,任何效率提升都将很快被淹没。你最终会在 Lua 中构建一个 Javascript 解释器。大多数 Javascript 解释器都是用 C 语言编写的,并且已经针对 Javascript 的语义进行了优化。
因此,为了效率而这样做是一个失败的原因。可能还有其他原因——例如在仅限 Lua 的环境中支持 Javascript,尽管即使这样,如果可能的话,仅将 Lua 绑定写入现有的 Javascript 解释器可能会减少工作量。
如果你想玩 Javascript->Lua 源代码到源代码的翻译器,看看js2lua,这是我前段时间创建的一个玩具项目。它在任何地方都不完整,但玩它肯定会让人深思。它已经包含一个 Javascript 词法分析器,因此已经完成了艰苦的工作。