在Lua虚拟机上运行JavaScript有意义吗?

Lua很小,可以很容易地embedded。 目前的JavaScript虚拟机非常庞大,难以集成到现有的应用程序中。
所以不可能编译JavaScript到Lua或Lua字节码?
特别是对于移动应用程序的限制,这似乎是一个很好的select。 能够轻松地将最stream行的脚本语言集成到任何iPhone或Android应用程序将是伟大的。

我对Lua不是很熟悉,所以我不知道这在技术上是否可行。
有了Luvit,有一个活跃的项目试图将Node.js架构移植到Lua。 所以,平静的JavaScript世界离Lua的可能性还有很远的距离。

编译Javascript到Lua的胜利并不像你想像的那么好。 Javascript的语义与Lua非常不同(LuaJIT的作者引用Lua的devise是LuaJIT可以和Javascript JIT编译器竞争的主要原因之一)。

拿这个代码:

 if("1" == 1) { print("Yes"); } 

这在Javascript中打印“是”。 Lua中的等价代码不会,因为string永远不会等于Lua中的数字。 这可能看起来像一个小问题,但它有一个基本的结果:我们不能再使用Lua的内置的相等性testing。

我们可以采取两种解决scheme。 我们可以将1 == "1"重写为javascript_equals(1, "1") 。 或者我们可以将每个Javascript值包装在Lua中,并使用Lua的metatables覆盖==操作符的行为。

所以我们已经通过将Javascript映射到Lua而失去了一些效率。 这是一个简单的例子,但它继续这样一直下来。 例如,Javascript和Lua之间的所有运算符规则都是不同的。

我们甚至不得不打包Javascript对象,因为它们和Lua表不一样。 例如,Javascript对象只支持string键,并将任何索引强制转换为string:

 > a = {} {} > a[1] = "Hello" 'Hello' > a["1"] 'Hello' 

您还必须注意Javascript的范围规则,可变参数函数等等。

现在,所有这些都是可以克服的,如果有人把努力放到一个完整的编译器中的话。 然而任何提高效率的东西都很快就会被淹没。 你基本上最终会在Lua中build立一个Javascript解释器。 大多数Javascript解释器都是用C编写的,并且已经为Javascript的语义进行了优化。

所以,为了提高效率是失败的原因。 可能还有其他的原因,例如在Lua环境中支持Javascript,尽pipe如果可能的话,只要将Lua绑定到现有的Javascript解释器中,可能会less一些工作。

如果你想用Javascript-> Lua源代码到源代码翻译器来玩 ,请看看js2lua ,这是我在一段时间后创build的一个玩具项目。 这并不是完整的,但玩它肯定会给一些思考的食物。 它已经包含了JavaScript词法分析器,所以已经完成了艰苦的工作。