具有"edit and continue"或"hot swap"支持的脚本语言?(也许在卢阿可能?



我正在使我现有的.Net应用程序可为非编程用户编写脚本。我加了lua,它就像一个符咒。然后我通过debug.sethook添加了调试功能(pause/content/step)。它的工作原理也很有魅力。

现在我意识到我的应用程序需要像Visual Studio那样的编辑和继续功能。您可以暂停执行,编辑代码,然后从当前状态继续应用更改。这个功能对我来说非常重要。我认为这对于脚本语言来说很容易做到。

无论我读到哪里,脚本语言都可以做到这一点。但是,即使花了几个小时的搜索,我还没有找到Lua的实现。它不一定是Lua,但在Lua中热交换代码将是我的第一选择。

如何为用户提供暂停和编辑脚本的能力,然后在应用更改的情况下继续执行?

注意:不一定是Lua,每个脚本语言都可以

更新

@Schollii这里有一个例子:

function doOnX() 
   if getValue() == "200" then
      value = getCalculation()
      doSomething() -- many function calls, each can take about 2s
      doSomething()
      doSomething()
      print(value)
      doX(value)
   end
end
doOnX() 

谢谢你的建议。这就是它的工作方式:

  1. 我将使用https://github.com/frabert/NetLua这是一个非常酷、写得很好的100%C#Lua解释器。它首先生成一个AST树,然后直接执行它
  2. 需要修改解析器。在Parser.cs public Ast.Block ParseString(string Chunk)中,首先生成一个parseTree。parseTree.tokens[i].locations包含每个令牌的确切位置。然后再次解析CCD_ 2并将其转换为CCD_。我需要更改这一点,以便稍后我知道哪一行是哪一份声明
  3. 现在,AST树中的每个语句都通过EvalBlock直接执行。需要添加调试功能(就像我通过Debug.setHook在C绑定lua解释器DynamicLua中所做的那样)。这可以在LuaEnterprise.cs内部静态LuaArguments EvalBlock(`.Pause/continue/step函数应该没有问题。我现在还可以添加当前行高亮显示,因为每个语句都包含位置行信息
  4. 暂停执行并编辑代码时,保存当前LuaContxct。它包含所有变量。同时保存最后一行执行的最后一条语句
  5. 现在,代码String被再次解析为一个新的AST树。它被执行了。但是,所有语句都将被跳过,直到到达带有line语句的已保存语句为止。保存的LuaContext将被恢复,并且可以在应用所有更改的情况下继续执行

新的变量也可以在最后一行执行之后添加,因为一个新的NetLua.Ast.Assignment语句可以向当前的LuaContext添加一个新变量,一切都应该正常。

这行得通吗?

我认为这很有挑战性,而且做得很好。

可能唯一能做到这一点的方法是完全重新编译代码块。在函数中,这意味着整个函数,而不管编辑在函数中的哪个位置。然后再次调用该函数。显然,该函数必须是可重入的,否则它的副作用(如增加全局值或向上值)将不得不撤消,这是不可能的。如果它不可重入,它仍然会工作,只是不会给出预期的结果(例如,如果函数将全局变量增加1,那么一旦函数最终返回,再次调用它将导致全局变量增加2)。

但是,如果真的是通用的解决方案,那么在脚本中找到块开始和结束的行将是很棘手的。对于特定的解决方案,您必须发布要运行的脚本的特定示例和要编辑的行的示例。如果整个用户脚本被重新编译并重新运行,那么这不是问题,但副作用仍然是一个问题,示例也会有所帮助。

相关内容

  • 没有找到相关文章

最新更新