Язык сценариев с поддержкой "edit and continue" или "hot swap"? (Возможно, возможно в Lua?)

Я делаю свои существующие.Net Application Scriptable для не программирующих пользователей. Я добавил Луа, это работает как шарм. Затем я добавил функциональность отладки (пауза / продолжение / шаг) через debug.sethook. Это также работает как шарм.

Теперь я понимаю, что моему Приложению нужно отредактировать и продолжить работу, как в 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 Interpreter. Сначала он генерирует дерево AST, а затем непосредственно его выполняет.
  2. Парсер нужно изменить. В Parser.cs public Ast.Block ParseString(string Chunk) сначала создается parseTree. parseTree.tokens[i].locations содержит точную позицию каждого токена. Irony.Parsing.ParseTree затем снова анализируется и преобразуется в NetLua.Ast.Block но информация о местоположении отсутствует. Мне нужно будет это изменить, чтобы позже я узнал, какое заявление в какой строке.
  3. Теперь каждый оператор из дерева AST напрямую выполняется через EvalBlock. Должна быть добавлена ​​функциональность отладки (как у меня в C Binding lua Interpreter DynamicLua через debug.setHook). Это можно сделать во внутреннем статическом LuaInterpreter.cs LuaArguments EvalBlock(`. Функции паузы / продолжения / шага не должны вызывать проблем. Теперь я также могу добавить выделение текущей строки, поскольку каждый оператор содержит информацию о позиции строки.
  4. Когда выполнение приостановлено и код был отредактирован, текущий LuaContxct сохраняется. Он содержит все переменные. Также сохраняется последний оператор с последней строкой выполнения.
  5. Теперь код String снова анализируется в новом дереве AST. Это выполняется. Но все операторы пропускаются, пока не будет достигнут сохраненный оператор с оператором строки. Сохраненный LuaContext восстанавливается, и выполнение может продолжаться со всеми примененными изменениями.

Новые переменные также могут быть добавлены после последней выполненной строки, потому что новая NetLua.Ast.Assignment Оператор может просто добавить новую переменную в текущий LuaContext, и все должно работать нормально.

Будет ли это работать?

1 ответ

Я думаю, что это довольно сложно и триично сделать правильно.

Вероятно, единственный способ сделать это - полностью перекомпилировать кусок кода. В функции это будет означать всю функцию независимо от того, где находится функция редактирования. Затем снова вызовите функцию. Очевидно, что функция должна быть входящей, иначе ее побочные эффекты (например, увеличение глобального или повышающего значения) должны быть отменены, что невозможно. Если он не является повторно входящим, он все равно будет работать, просто не давая ожидаемых результатов (например, если функция увеличивает глобальную переменную на 1, вызывая ее снова, это приведет к увеличению глобальной переменной на 2 после окончательного возврата из функции).

Но найти строки в скрипте, где начинаются и заканчиваются фрагменты, будет непросто, если это действительно общее решение. Для конкретного решения вам нужно будет опубликовать конкретные примеры скриптов, которые вы хотите запустить, и примеры строк, которые вы хотите отредактировать. Если весь пользовательский скрипт будет перекомпилирован и перезапущен, то это не проблема, но побочные эффекты все еще являются проблемой, примеры также могут помочь.

Другие вопросы по тегам