有没有办法自动将 Ruby 代码转换为 Lua?我的问题是:
- 为此目的存在哪些类型的工具?
- 它们的局限性是什么?
这样做的一个主要目标是在我执行(转换为)Lua 程序时能够绕过 Ruby 解释器。我不介意在转换到 Lua 的过程中是否需要调用 Ruby 解释器,但我不想在运行新生成的 Lua 代码时依赖 Ruby 解释器。
更新:
我对这个主题做了很多研究,但我个人没有找到解决方案(这就是为什么我在 StackOverflow 上问这个问题)。
如果有人好奇,我已经深入研究过:
有没有办法自动将 Ruby 代码转换为 Lua?我的问题是:
这样做的一个主要目标是在我执行(转换为)Lua 程序时能够绕过 Ruby 解释器。我不介意在转换到 Lua 的过程中是否需要调用 Ruby 解释器,但我不想在运行新生成的 Lua 代码时依赖 Ruby 解释器。
更新:
我对这个主题做了很多研究,但我个人没有找到解决方案(这就是为什么我在 StackOverflow 上问这个问题)。
如果有人好奇,我已经深入研究过:
如果这不是您想听到的答案,我很抱歉,但是没有实用的方法可以做到这一点,朋友。我不会说 Ruby 比 Lua 更丰富,因为我对后者的研究还不够多,不能这么说,但根据我所知道的和所见,
人们可以继续讨论将高级语言编译成彼此的可能性和不可能性,但对你来说,底线是:尽早放弃。停止搜索并开始手动重写您的 progs。
注意:我同意这里的其他人的观点,你真的应该从头开始重新编写你的程序。这个答案只是一个想法,我希望有人会真正研究一下。
已经有一些可以引导的Ruby-to-X转换器。好的已经有一个词法分析器和解析器,所以你只需要使用后端。如果您选择类似于 Lua 的语言,那么您可以进一步简化事情。
例如,有一些 Ruby-to-Javascript实现,例如RubyJS。撇开元方法、self
语法糖、库差异和一些语义差异不谈,Lua 可以被视为 Javascript 的一个子集,具有更冗长的语法。
{
}
考虑到这一点,您可以通过在这里和那里更改一些 s 来修改大部分后端生成器:
// some random js
while(x < 56 && y == 40) {
print('Hello World!');
}
-- What you could make it generate:
while x < 56 and y == 40 do
print 'Hello World!'
end
也许有几次它依赖于 Javascript 的特定功能,但即便如此,它们中的大多数都可以被模拟。
// Javascript has a === operator that enforces type equality
'5' === 5 // FALSE!
-- Lua lacks this, but it's easy to imitate
(type('5') == type(5)) and ('5' == 5)
不,老实说,这不是一个简单的项目,但我认为这绝对值得投入时间。我希望这会有所帮助!:)
Universal-transpiler是一个用于 SWI-Prolog 的库,它可以将一小部分 Ruby 转换为 Lua 和其他几种语言。
这是它在 Prolog 中的使用示例,输入为 Ruby 源代码:
:- use_module(library(transpiler)).
:- set_prolog_flag(double_quotes,chars).
:- initialization(main).
main :-
translate("def add(a,b) return a + b end def squared(a) return a*a end def add_exclamation_point(parameter) return parameter + \"!\" end",'ruby','lua',X),
atom_chars(Y,X),
writeln(Y).
...这是它生成的 Lua 源代码:
function add(a,b)
return a..b
end
function squared(a)
return a*a
end
function add_exclamation_point(parameter)
return parameter.."!"
end