MetaLua 可以和 LuaJIT 一起使用吗?
如果是这样,那怎么办?
(我找不到任何可靠的信息)
Metalua 编译器似乎是用 Lua 和 Metalua 编写的,所以理论上是的。makefile揭示了一些有趣的核心部分。Metalua 本身似乎运行在 Lua 之上。
cat > ${BUILD_BIN}/metalua <<EOF
#!/bin/sh
export LUA_PATH='?.luac;?.lua;${BUILD_LIB}/?.luac;${BUILD_LIB}/?.lua'
export LUA_MPATH='?.mlua;${BUILD_LIB}/?.mlua'
${LUA} ${BUILD_LIB}/metalua.luac \$*
EOF
但是,LuaJIT 不能像 LuaC 那样在命令行中将多个脚本编译成一个输出文件。简单地用LUAC
LuaJIT 的实例替换是行不通的。必须针对 LuaJIT 兼容的 makefile 调整以下行。
${LUAC} -o ${BUILD_LIB}/metalua/bytecode.luac lopcodes.lua lcode.lua ldump.lua compile.lua
${LUAC} -o ${BUILD_LIB}/metalua/mlp.luac lexer.lua gg.lua mlp_lexer.lua mlp_misc.lua mlp_table.lua mlp_meta.lua mlp_expr.lua mlp_stat.lua mlp_ext.lua
不幸的是,与编译成的一些文件的内容相比,这个问题相形见绌,bytecode.luac
因为它们引用了 PUC-Lua 操作码和字节码,这绝对与 LuaJIT 不兼容。
我会说,如果可能的话,那肯定需要对编译器进行一些重新编程,但是 LuaJIT 的开箱即用使用是极不可能的。
答案取决于你想用它做什么。有一些组件不依赖于 Lua OPcodes 并且将在 LuaJIT 上运行,而一些组件则依赖于 Lua 并且不会在 LuaJIT 上运行(因为它具有不同的 OPcodes)。
不过,那些通用的组件仍然很有用。例如,我正在开发的Lua IDE正在使用Lua Inspect,它依赖于 metalua 来提供 AST 解析。我已经提取了我需要的那些模块并实现了一个以正确顺序加载这些模块的包装器。所有这些功能都在 LuaJIT (2.0.2) 上运行,没有任何问题。
请注意,metalua github 存储库有一些包含更新的 metalua 代码的分支;例如,tilo 分支包含 v0.6,而 master 分支似乎只包含 v0.5。您可能对较新版本感兴趣的原因是进行了一些重构以简化仅 Lua 部分的使用。