Существуют ли какие-либо языковые интерпретаторы (например, интерпретатор JavaScript, интерпретатор Lua, интерпретатор Python и т. Д.), Которые имеют возможность для сценария приостановить саму себя, а для хоста возобновить его позже?
Я пишу игровой движок с консольной RPG в .NET, и я бы хотел написать сценарий для каждого неигрового персонажа на экране. Эти высокоуровневые сценарии будут вызывать низкоуровневые функции сценария для выполнения таких действий, как «пройти один квадрат на юг», что будет реализовано в виде цикла: пройти четыре пикселя, а затем получить результат до следующего кадра анимации; пройти четыре пикселя, затем уступить; и т. д. «Выход» - это какой-то механизм, который позволяет сценарию сообщать интерпретатору: «Хорошо, я уже закончил. Сохраните мое состояние и мой стек вызовов для дальнейшего использования». Когда таймер срабатывает для следующего кадра анимации, хост возобновляет сценарий с того места, где он остановился. Было бы несколько сценариев, запущенных независимо, что, вероятно, означает несколько экземпляров механизма сценариев, чтобы каждый мог иметь свое собственное состояние.
Конечно, я мог бы сделать это на любом языке, если бы я хотел написать поток для скрипта каждого символа и возобновить / приостановить каждый поток для каждого кадра. Но я не хочу создавать потенциально десятки или сотни потоков, поэтому вместо этого я изучаю возможности сценариев.
Я не особо привязан к тому, чтобы быть переводчиком, но я подозреваю, что это будет требованием. Возможность приостановки, без потоков, в значительной степени потребовала бы, чтобы вызовы функций не были реализованы с использованием стека CLR - вместо этого им нужно было бы использовать Stack<T>
или некоторый другой тип объектов кучи - что вполне может означать интерпретатор, созданный специально для цель приостановления.
Мне известно о грядущем ключевом слове await
в C #, которое даст мне параллелизм, который я ищу, без многопоточности, но это очень сложно и требует изменения всего вызывающего кода на async
. Это также скомпилированный язык, и сценарии более привлекательны для разработки игр. Если возможно, я бы предпочел просто предоставить библиотеку сценариев функций «ходьбы» и позволить автору сценария блаженно не знать о скрытой сложности.