有什么方法可以自动将红宝石代码转换为lua?我的问题是:
- 为此目的存在哪些工具?
- 他们的局限性是什么?
当我执行(转换为LUA程序)时,一个主要目标是能够绕过Ruby解释器。我不介意在转换为LUA期间需要调用Ruby解释器,但是当我运行新生成的LUA代码时,我不想依靠Ruby解释器。
更新:
我对这个主题做了很多研究,我个人没有找到解决方案(这就是为什么我在stackoverflow上问问题的原因)。
以防任何人好奇,我深入研究:
- Ruby-lua ,尽管这一切都允许您从Ruby调用Lua
- rlua ,这使您可以从Lua和Vise Vise运行Ruby Code,但它并未将Ruby转换为LUA,并且仍会在程序运行中调用Ruby Driventer。
很抱歉,如果这不是您想听到的答案,但是没有实用的方法,pal。我不会说Ruby比Lua更丰富,因为我还没有足够的研究来这样说,而是从我所知道的,我所看到的,
- 没有任何人会打扰将Ruby编译器写入LUA和类似语言。
- 不可能编写此类编译器比手动重写程序更短的时间。
- 唯一的语言红宝石社区关心将红宝石汇编成ruby bytecode。
一个人可能会继续介绍什么可能性,而不是将高级语言彼此汇编在一起,而是您的最重要的是:尽早放弃。停止搜索并开始手动重写您的Prog。
注意:我同意这里的其他所有人,您真的应该从头开始重写程序。这个答案只是一个想法,我希望有人能真正研究。
已经有几个 ruby-to-x 转换器可以引导。好人已经有lexer&解析器,因此您只需要与后端合作。如果您选择类似于LUA的语言,那么您可以更简化内容。
例如,有一些Ruby-to-JavaScript实现,例如Rubyjs。抛开元方法, self
句法糖,库差异和一些语义差异,在这里和那里的一些语义差异,lua可以看作是带有更详细语法的JavaScript的子集。
考虑到这一点,您可以通过在此处和那里更改一些{
}
S来修改大多数后端生成器:
// some random js
while(x < 56 && y == 40) {
print('Hello World!');
}
&nbsp;
-- 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!
&nbsp;
-- Lua lacks this, but it's easy to imitate
(type('5') == type(5)) and ('5' == 5)
不,老实说,这不是一个容易的项目,但我认为这绝对值得投入时间。我希望这会有所帮助!:)
通用 - 转移器是Swi-Prog的库,可以将一小部分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