javascript - 在 Lua VM 上运行 JavaScript 有意义吗?

标签 javascript node.js compiler-construction lua

Lua 体积小,易于嵌入。当前的 JavaScript 虚拟机非常大,很难集成到现有应用程序中。
那不是可以把JavaScript编译成Lua或者Lua字节码吗?
特别是对于移动应用程序中的约束,这似乎很合适。能够轻松地将一种最流行的脚本语言集成到任何 iPhone 或 Android 应用程序中会很棒。

我对Lua不是很熟悉,所以我不知道这在技术上是否可行。
Luvit有一个活跃的项目试图将 Node.js 架构移植到 Lua。因此,事件化的 JavaScript 世界与 Lua 中的可能性相差无几。

最佳答案

将 Javascript 编译为 Lua 的好处并不像您最初想象的那么大。 Javascript 的语义与 Lua 的语义非常不同(LuaJIT 作者将 Lua 的设计作为 LuaJIT 可以与 Javascript JIT 编译器竞争的主要原因之一)。

拿这段代码:

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

这会在 Javascript 中打印"is"。 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 绑定(bind)编写到现有的 Javascript 解释器可能会减少工作量。

如果您想体验 Javascript->Lua 源到源转换器,请查看 js2lua ,这是我前段时间创建的一个玩具项目。它在任何地方都不完整,但使用它肯定会给人一些思考。它已经包含一个 Javascript 词法分析器,因此已经完成了艰苦的工作。

关于javascript - 在 Lua VM 上运行 JavaScript 有意义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10259842/

相关文章:

javascript - 选择后,ng-repeat 在选择框上闪烁选项

javascript - 使用 JavaScript 中的 switch 循环更改背景颜色

c++ - g++ __FUNCTION__ 替换时间

Javascript 增加最大数组大小

c# - 是否可以调试在运行时编译的代码?

compiler-construction - 词法分析器的目的是什么?

javascript "header"文件存储一些数据

javascript - 一段时间后页面变得无响应

Java Websockets + 事件监听器。这是正确的方法吗?

node.js - 使用 bluebird 与 socket.io 不起作用