【问题标题】:Easily porting Lua code to C#轻松将 Lua 代码移植到 C#
【发布时间】:2011-01-12 04:10:09
【问题描述】:

有没有什么简单的方法可以将 Lua 代码移植到 C# 中?

最大的问题可能是在某些字典中整齐地移植表格。

为了防止任何误解:不,我不能在我的程序中使用嵌入式 Lua

【问题讨论】:

  • “嵌入式 Lua”是什么意思?您是否也将 Lua2IL 视为“嵌入式 Lua”? Is 不使用或引用本机实现 AFAIK,而只是生成纯 IL,因此它甚至可以在紧凑的框架和不同的平台上工作。
  • 我的意思是我不能使用任何形式的 Lua。但是谢谢你的想法,我可能会在其他时候使用 Lua2IL。

标签: c# dictionary lua porting lua-table


【解决方案1】:

使用像 Lua 这样高度动态的语言设计的代码需要大量重构才能在像 C# 这样的静态语言中有意义——两者的用途根本不同。实际上,您必须从头开始重新编写此类代码,除非它仅使用任何语言的最基本功能,例如基本的数字/字符串操作。

【讨论】:

    【解决方案2】:

    没有简单的方法可以做到这一点。

    【讨论】:

      【解决方案3】:

      Universal-transpiler 可以将一小部分 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+"!";
      }
      

      【讨论】:

        【解决方案4】:

        你想达到什么目标?将 lua 文件转换为 C# 代码,您希望在其中广泛使用它们,或者您只想要一些与原始代码执行类似操作的代码。

        对于第一种类型的转换,答案是相当困难,但并非不可能。您必须解析代码并在 C# 中重新创建相同的(动态)功能。像 LinFu.Reflection 这样的框架可以在这里提供帮助,因为它们会为 CLR 添加一些动态功能。

        对于第二种类型,我的想法是将lua字节码转换为C#而不是原始代码。这应该不会太难,主要是因为 lua 没有太多的操作码(如果我没记错的话,大约 30 个)。在这些操作码中,最难转换的是逻辑和跳转运算符(因为您在 C# 中没有 goto),但是如果您保持流运算符完整(并将它们转换为 C# - 这或多或少是可以完成的),并且只有编译之间的代码,并将结果字节码转换为 C# 应该可以完成这项工作。当然,这样一来,您会因原始代码的可读性而损失很多,并且维护它会更加困难。

        您也可以尝试在我在此处编写的这两种极端情况之间找到解决方案。一些结构可以很容易地移植(主要是循环和简单的算术运算符),但会退回到操作码表示来处理表。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-27
          • 2015-06-18
          • 1970-01-01
          • 2023-03-09
          相关资源
          最近更新 更多