在 Lua VM 上运行 JavaScript 是否有意义?
2012-4-21 15:58:15
收藏:0
阅读:124
评论:1
Lua 是一种小巧且易于嵌入的语言。当前的 JavaScript 虚拟机非常庞大,很难集成到现有应用程序中。
那么将 JavaScript 编译为 Lua 或 Lua 字节码是否可能呢?
特别是对于移动应用程序中的限制,这似乎是一个很好的匹配。能够轻松地将最流行的脚本语言之一集成到任何 iPhone 或 Android 应用程序中将是很好的。
我不太熟悉 Lua,所以不知道这是否在技术上可行。
使用 [Luvit](https://github.com/luvit/luvit),有一个活跃的项目正在尝试将 Node.js 架构移植到 Lua 中。因此,事件驱动的 JavaScript 世界距离 Lua 中可能的情况并不远。
原文链接 https://stackoverflow.com/questions/10259842
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
将 JavaScript 编译成 Lua 并非像你最初想象的那样方便。JavaScript 的语义与 Lua 的非常不同(LuaJIT 的作者认为 Lua 的设计是 LuaJIT 可以与 JavaScript JIT 编译器进入激烈竞争的主要原因之一)。
以此代码为例:
if("1" == 1) { print("Yes"); }
在 JavaScript 中,它会输出 "Yes"。但在 Lua 中,等式不成立,因为字符串和数字在 Lua 中永远不会相等。这可能看起来是小问题,但它会带来根本性的后果:我们不能再使用 Lua 内置的等式测试。
我们有两个解决方案。一种是将
1 == "1"
重写为javascript_equals(1, "1")
。另一种是将每个 JavaScript 值包装成 Lua,并使用 Lua 的元表覆盖 == 运算符的行为。将 JavaScript 映射到 Lua 中,我们已经失去了 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 的词法分析器,因此这项艰苦的工作已经完成了。