Facilmente porting del codice Lua a C #
-
25-09-2019 - |
Domanda
esiste un modo semplice per porto di codice Lua in C #?
Il problema più grande sarebbe probabilmente alle tabelle porta ordinatamente in alcuni dizionari.
E per evitare ogni equivoco:. no non posso utilizzare incorporato Lua nel mio programma
Soluzione
Codice progettato in un tale linguaggio altamente dinamico come Lua avrebbe bisogno sostanziale refactoring per dare un senso in un linguaggio statico come C # - i due servono scopi fondamentalmente diversi. Si dovrà riscrivere tale codice di nuovo da zero, realisticamente, a meno che non ha usato solo la maggior parte delle caratteristiche di base di tutte le lingue, come ops base numerico / stringa.
Altri suggerimenti
Non c'è modo più semplice per farlo.
Che cosa si vuole raggiungere? Convertire i file LUA per codice C #, in cui si desidera lavorare con loro ampiamente, o se si vuole semplicemente un codice che fa cose simili rispetto al codice originale.
Per il primo tipo di conversione, la risposta è che è molto difficile, ma non impossibile. È necessario analizzare il codice e ricreare lo stesso (dinamica) funzionalità in C #. Framework, come LinFu.Reflection può aiutare qui, perché saranno aggiungere alcune funzionalità dinamica per CLR.
Per il secondo tipo, la mia idea è quella di convertire il bytecode lua per C # al posto del codice originale. Questo non dovrebbe essere troppo difficile, soprattutto perché lua non ha molto codici operativi (circa il 30 se non ricordo correttamente). Da questi codici operativi i più difficili da convertire sono gli operatori logici e di salto (perché non si dispone di goto in C #), ma se si tengono i gestori di flusso intatto (e convertirli in C # - che è più o meno attuabile), e solo compilare il codice tra, e convertire il bytecode risultato per C # dovrebbe fare il lavoro. Naturalmente in questo modo si perde un sacco dalla leggibilità del codice originale, e la manutenzione sarà molto più difficile.
Si potrebbe anche provare a trovare una soluzione fra questi due casi limite che ho scritto qui. Alcuni costrutti possono essere facilmente trasferite (principalmente i loop, e le operazioni aritmetiche semplici), ma ripiegano alla rappresentazione codice operativo per la gestione della tabella.
Universal-transpiler può tradurre un piccolo sottoinsieme di Lua in diverse altre lingue, tra cui C #. Questo è un esempio, scritto per 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).
Questo è il codice sorgente C # che genera:
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+"!";
}