Легко портировать код LUA к C #
-
25-09-2019 - |
Вопрос
Есть ли удобный способ портировать код Lua к C #?
Самая большая проблема, вероятно, будет аккуратно портировать таблицы в некоторых словарях.
И предотвратить любое недоразумение: Нет, я не могу использовать встроенный Lua в мою программу.
Решение
Код, разработанный на таком очень динамичном языке, такой как Луа, нуждается в существенном рефакторинге, чтобы иметь смысл на статическом языке, таким как C # - два служат принципиально различными целями. Вы должны были бы снова написать такой код с нуля, реально, если он не использовал только самые основные функции любого языка, как основные численные / строки OPS.
Другие советы
Там нет простого способа сделать это.
Что вы хотите достичь? Преобразуйте файлы LUA в код C #, где вы хотите работать с ними широко, или вы просто хотите, чтобы какой-то код, который делает подобные вещи, чем исходный код.
Для первого типа преобразования ответ - это довольно сложно, но не невозможно. Вы должны разбирать код и повторно создать одинаковую (динамическую) функциональность в C #. Рамки, такие как Linfu.reflection, могут помочь здесь, потому что они добавят некоторую динамическую функциональность CLR.
Для второго типа, моя идея состоит в том, чтобы преобразовать Bytecode Lua в C # вместо исходного кода. Это не должно быть слишком сложно, главным образом, потому что Lua не имеет большого количества Опкодов (около 30, если я вспоминаю это правильно). Из этих офкодов самым сложным для преобразования являются операторы логики и прыжка (потому что у вас нет Go GoTo в C #), но если вы держите операторы потока (и преобразовать их в C # - это более или менее выполнено), и только Скомпилируйте код между и преобразовывать результат Bytecode к C # должен выполнять работу. Конечно, таким образом, вы много потеряете от удовольствия от числа оригинала, и поддерживая его намного сложнее.
Вы также можете попробовать найти решение между этими двумя краевыми чехлами, которые я написал здесь. Некоторые конструкции могут быть легко перенесены (в основном петли и простые арифметические операторы), но падают обратно в представление OPCode для обработки таблиц.
Универсальный транспортер Может перевести небольшое подмножество LUA на несколько других языков, включая C #. Это пример, написанный для SWI-Prolog:
:- use_module(library(transpiler)).
:- set_prolog_flag(double_quotes,chars).
:- initialization(main).
main :-
translate("function add(a,b) return a + b end function squared(a) return a*a end function add_exclamation_point(parameter) return parameter .. \"!\" end",'lua','c#',X),
atom_chars(Y,X),
writeln(Y).
Это исходный код C #, который он генерирует:
public static int add(int a,int b){
return a+b;
}
public static int squared(int a){
return a*a;
}
public static string add_exclamation_point(string parameter){
return parameter+"!";
}