在LuaVM上运行JavaScript有意义吗?

在LuaVM上运行JavaScript有意义吗?,javascript,node.js,compiler-construction,lua,Javascript,Node.js,Compiler Construction,Lua,Lua很小,可以很容易地嵌入。当前的JavaScript虚拟机相当大,很难集成到现有的应用程序中。 那么,难道不可能将JavaScript编译成Lua或Lua字节码吗? 特别是对于移动应用程序中的限制,这似乎是一个很好的选择。能够轻松地将最流行的脚本语言之一集成到任何iPhone或Android应用程序中将是非常棒的 我对Lua不是很熟悉,所以我不知道这在技术上是否可行。 有一个活动项目正在尝试将Node.js架构移植到Lua。因此,JavaScript事件的世界离Lua的可能不会太远。将Jav

Lua很小,可以很容易地嵌入。当前的JavaScript虚拟机相当大,很难集成到现有的应用程序中。
那么,难道不可能将JavaScript编译成Lua或Lua字节码吗?
特别是对于移动应用程序中的限制,这似乎是一个很好的选择。能够轻松地将最流行的脚本语言之一集成到任何iPhone或Android应用程序中将是非常棒的

我对Lua不是很熟悉,所以我不知道这在技术上是否可行。

有一个活动项目正在尝试将Node.js架构移植到Lua。因此,JavaScript事件的世界离Lua的可能不会太远。

将JavaScript编译到Lua的胜利并不像您最初想象的那样伟大。Javascript的语义与Lua的非常不同(LuaJIT的作者引用Lua的设计作为LuaJIT能够与Javascript JIT编译器如此竞争的主要原因之一)

以这个代码为例:

if("1" == 1)
{
    print("Yes");
}
这将在Javascript中打印“是”。Lua中的等效代码不相同,因为在Lua中字符串永远不等于数字。这似乎是一个小问题,但它有一个基本的结果:我们不能再使用Lua内置的平等测试

我们可以采取两种解决方案。我们可以将
1==“1”
重写为
javascript_等于(1,“1”)
。或者我们可以将每个Javascript值包装在Lua中,并使用Lua的元表覆盖==运算符行为

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

我们甚至必须包装Javascript对象,因为它们与Lua表不同。例如,Javascript对象仅支持字符串键,并将任何索引强制为字符串:

> a = {}
{}
> a[1] = "Hello"
'Hello'
> a["1"]
'Hello'
您还必须注意Javascript的作用域规则、vararg函数等等

现在,如果有人将精力投入到完整的编译器中,所有这些都是可以克服的。然而,任何效率的提高都将很快被淹没。您最终将在Lua中构建一个Javascript解释器。大多数Javascript解释器都是用C编写的,并且已经针对Javascript的语义进行了优化

因此,为了提高效率而这样做是徒劳的。可能还有其他原因——比如在只支持Lua的环境中支持Javascript,尽管即使在可能的情况下,仅仅将Lua绑定写入现有的Javascript解释器可能会少一些工作


如果您想使用Javascript->Lua源代码到源代码转换器,请看一下,这是我不久前创建的一个玩具项目。它在任何地方都不完整,但玩它肯定会让人深思。它已经包含了一个Javascript lexer,所以已经完成了艰苦的工作。

当然V8可以(并且是Node.js)用作C库。我更新了我的问题-你说得对,V8可以用作库。但由于它的复杂性,它不是一个开发人员会为一个单一的应用程序项目做的事情。在iOS上生成本机代码也有一些限制。嵌入Lua要容易得多,在游戏中也很常见。只需对Node.js发表一条评论-
luvit
并不是将Node.js移植到Lua的唯一项目,也不是第一个项目。它使用
boost.asio
而不是
libuv
。您可以在必要的地方使用JavaScript,比如在浏览器中,但是如果您可以选择使用Lua,为什么选择使用JavaScript呢?Lua只是一种更好的语言。@Mud也许Lua真的是一种“更好”的语言。但是有很多快乐的JavaScript用户可能希望有一种轻量级的方式将js代码嵌入到应用程序中。