2012-11-07 30 views
8

是否有任何方法可以自動將Ruby代碼轉換爲Lua?我的問題是:如何將Ruby轉換爲Lua?

  1. 有什麼工具可用於此目的?
  2. 它們的侷限性是什麼?

這樣做的一個主要目標是當我執行(轉換爲)Lua程序時能夠繞過Ruby解釋器。我不介意在Lua轉換過程中是否需要調用Ruby解釋器,但是我不想在運行新生成的Lua代碼時依賴於Ruby解釋器。


UPDATE:

我已經做了相當多的研究這個話題,我個人沒有找到一個解決方案(這就是爲什麼我問的問題在這裏StackOverflow上)。

如果有人好奇,我已經深深的看着:

  • Ruby-Lua,但這樣做只是讓你從紅寶石
  • RLua調用Lua,這可以讓你從Lua運行Ruby代碼,反之亦然,但它並沒有將Ruby翻譯成Lua,它仍然在程序運行時調用Ruby解釋器。
+0

紅寶石和Lua在語義上可能完全不同,所以自動翻譯並不簡單。你想轉換的程序有多大? – lhf

+0

@lhf,大於我想:( – nickb

+0

爲什麼downvotes? – nickb

回答

7

我很抱歉,如果這不是你想聽到的答案,但有,朋友沒有切實可行的辦法。我不會說Ruby是不是Lua的豐富,因爲我還沒有足夠的研究後說,但我知道,我看什麼,

  1. 沒有辦法沒有人會打擾編寫Ruby編譯器到Lua和類似的語言。
  2. 編寫這樣的編譯器無法比手動重寫程序花費更少的時間。
  3. Ruby社區關心編譯Ruby的唯一語言是Ruby字節碼。

人們可以繼續討論可能性是什麼,而不是將高級語言編譯爲另一種語言,但您的底線是:儘早放棄。停止搜索並開始手動重寫您的prog。

+0

同意......... – texasbruce

+0

同意。語言功能不同。這就是爲什麼轉換會讓你失去優勢並帶來劣勢。如果你想要純粹的盧阿,寫純粹的盧阿。 – glasz

+4

jruby的人想和你說一句話:)。 – sunnyrjuneja

2

注意:我同意這裏的其他人,你應該從頭開始重新編寫你的程序。這個答案只是一個想法,我希望有人會真正考慮。

已經有幾個Ruby-to-X轉換器,你可以引導。好的已經有一個詞法分析器,所以你只需要在後端工作。如果你選擇一種類似於Lua的語言,那麼你可以更簡化一些事情。

例如,有a few 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) 

不,說實話,這不會是一個簡單的項目,但我認爲它的東西definetly值得投資的時間。我希望這有助於! :)

+1

我知道總有市場會出現這種情況,它上面有蛇油。由此,我並不是要冒犯RubyJS。他們承認自己 - 引用「RubyJS」網站:「通過RubyJS,您可以將Ruby的一個子集轉換爲Javascript代碼。」 *子集*是關鍵字。它可能取得重大成功,但最終會像X上的Wine一樣:除了你真正需要的程序之外,還有大量的程序在其上運行。儘管如此,還是給你+1。 –

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