8

Ruby コードを自動的に Lua に変換する方法はありますか? 私の質問は:

  1. この目的のためにどのような種類のツールが存在しますか?
  2. それらの制限は何ですか?

これの主な目的の 1 つは、(変換された) Lua プログラムを実行するときに Ruby インタープリターをバイパスできるようにすることです。Lua への変換プロセス中に Ruby インタープリターを呼び出す必要があるかどうかは気にしませんが、新しく生成された Lua コードを実行するときに Ruby インタープリターに依存する必要はありません。


アップデート:

私はこのトピックについてかなりの調査を行いましたが、個人的には解決策を見つけていません (これが、ここ StackOverflow で質問している理由です)。

誰かが興味を持っている場合のために、私は深く調べました:

  • Ruby-Lua、ただし、これにより、Ruby から Lua を呼び出すことができます
  • RLua、これにより、Lua から Ruby コードを実行したり、その逆を実行したりできますが、Ruby を Lua に変換するわけではなく、プログラムの実行時に Ruby インタープリターを呼び出します。
4

3 に答える 3

7

これが聞きたい答えでない場合は申し訳ありませんが、それを行う実際的な方法はありません。Ruby が Lua よりもリッチであると言うつもりはありません。Lua を十分に研究したことがないからです。

  1. Ruby コンパイラーを Lua や類似の言語用にわざわざ書く人がいるはずがありません。
  2. そのようなコンパイラを書くことは、プログラムを手動で書き直すよりも短い時間で済む方法はありません。
  3. Ruby コミュニティが Ruby のコンパイルに関心を持っている唯一の言語は、Ruby バイトコードです。

高水準言語を相互にコンパイルする可能性とそうでない可能性については、さらに続けることができますが、結論としては、早期にあきらめることです。検索をやめて、手動でプログラムを書き直してください。

于 2012-11-07T03:23:53.253 に答える
2

注: 私はここにいる他のすべての人に同意します。プログラムを最初から書き直すべきであるということです。この答えは単なるアイデアです。誰かが実際に調べてくれることを願っています。

ブートストラップできるRuby-to-Xコンバーターはすでにいくつかあります。優れたものにはすでにレクサーとパーサーがあるため、バックエンドを操作するだけで済みます。Lua に似た言語を選択すると、さらに単純化できます。

たとえば、RubyJSのようなRuby から Javascript への実装がいくつかあります。メタメソッド、シンタックス シュガー、ライブラリの違い、および所々のセマンティックの違いは別として、Lua はより冗長な構文を持つ Javascript のサブセットと見なすことができます。self

{ }それを念頭に置いて、いくつかの 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は、Ruby の小さなサブセットを Lua や他のいくつかの言語に変換できる SWI-Prolog 用のライブラリです。

これは、入力として Ruby ソース コードを使用した Prolog での使用例です。

:- 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 に答える