我该如何将Ruby转换为Lua?

有没有自动将 Ruby 代码转换为 Lua 的方法?

我的问题是:

  1. 有哪些工具可用于此目的?
  2. 它们的限制是什么?

其中一个主要目标是,当我执行(转换为)Lua 程序时,能够绕过 Ruby 解释器。如果在转换过程中需要调用 Ruby 解释器,我不介意,但我不想在运行新生成的 Lua 代码时依赖 Ruby 解释器。

更新:

我已经对此主题进行了相当多的研究,并且 个人而言 没有找到解决方案(这就是为什么我在 StackOverflow 上提出这个问题的原因)。

如果有人感兴趣,这是我深入研究过的内容:

  • **Ruby-Lua**,虽然它只是允许你从 Ruby 调用 Lua
  • **RLua**,它允许你从 Lua 运行 Ruby 代码,反之亦然,但它没有将 Ruby 翻译成 Lua,并且仍然在程序运行时调用 Ruby 解释器。
点赞
用户1153747
用户1153747

很抱歉,如果这不是你想听到的答案,但是,朋友,实际上没有一种实用的方法可以做到。我不会说 Ruby 比 Lua 更丰富,因为我还没有对后者进行足够的研究,但从我所知道的和看到的来看,

  1. 没有人会烦恼地将 Ruby 编译成 Lua 或类似的语言。
  2. 编写这样的编译器所需的时间不可能比手动重写程序更短。
  3. Ruby 社区关心将 Ruby 编译成 Ruby 字节码的唯一语言。

人们可以继续讨论将高级语言编译成另一种语言的可能性和不可能性,但对于你来说,底线是:早点放弃。停止搜索,开始手动重写你的程序。

2012-11-07 03:23:53
用户195701
用户195701

** Note: 我同意其他人的观点,你应该重新编写你的程序。这个答案只是一个想法,我希望有人能真正看一看。**

已经有一些 Ruby-to-X 转换器,你可以使用它们来引导。好的转换器已经有了词法分析器和解析器,所以你只需要处理后台。如果你选择一种类似于 Lua 的语言,那么你甚至可以更简化。

例如,有一些 Ruby-to-Javascript 实现,比如 RubyJS。暂时不考虑元方法、self 语法糖、库差异和一些语义上的差异,Lua 可以被看作是一种 JavaScript 的子集,具有更冗长的语法。

有了这个想法,你可以通过改变一些{ },修改大部分后端生成器:

// 一些随机 JS
while(x < 56 && y == 40) {
  print('Hello World!');
}
-- 你能让它生成的:
while x < 56 and y == 40 do
  print 'Hello World!'
end

也许有一些时候它依赖于 JavaScript 特定的特性,但即使是这样,大部分也可以模拟。

// JavaScript 有一个=== 操作符,强制类型相等
'5' === 5 // FALSE!
-- Lua 没有这个,但模拟起来很容易。
(type('5') == type(5)) and ('5' == 5)

不,说实话,这不是一个容易的项目,但我认为这绝对值得投资时间。我希望这会有所帮助! :)

2012-11-07 04:25:30
用户975097
用户975097

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
2016-09-17 01:53:46