8

有没有办法自动将 Ruby 代码转换为 Lua?我的问题是:

  1. 为此目的存在哪些类型的工具?
  2. 它们的局限性是什么?

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


更新:

我对这个主题做了很多研究,但我个人没有找到解决方案(这就是为什么我在 StackOverflow 上问这个问题)。

如果有人好奇,我已经深入研究过:

  • Ruby-Lua,尽管这一切都允许你从 Ruby 调用 Lua
  • RLua,这允许您从 Lua 运行 Ruby 代码,反之亦然,但它不会将 Ruby 转换为 Lua,它仍然会在程序运行时调用 Ruby 解释器。
4

3 回答 3

7

如果这不是您想听到的答案,我很抱歉,但是没有实用的方法可以做到这一点,朋友。我不会说 Ruby 比 Lua 更丰富,因为我对后者的研究还不够多,不能这么说,但根据我所知道的和所见,

  1. 没有人会费心为 Lua 和类似语言编写 Ruby 编译器。
  2. 编写这样的编译器不会比手动重写程序花费更短的时间。
  3. Ruby 社区唯一关心将 Ruby 编译成的语言是 Ruby 字节码。

人们可以继续讨论将高级语言编译成彼此的可能性和不可能性,但对你来说,底线是:尽早放弃。停止搜索并开始手动重写您的 progs。

于 2012-11-07T03:23:53.253 回答
2

注意:我同意这里的其他人的观点,你真的应该从头开始重新编写你的程序。这个答案只是一个想法,我希望有人会真正研究一下。

已经有一些可以引导的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)

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

于 2012-11-07T04:25:30.670 回答
0

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-17T01:53:46.337 回答