Язык, поддерживающий сериализацию сопрограмм

Я не думаю, что такая поддержка существует в текущих языках. Я думаю, что то, что я хочу сделать, можно решить с помощью «механизма рабочего процесса». Но проблема, с которой я сталкиваюсь с рабочим процессом, обычно заключается в следующем:

  1. Декларативный / многословный, и я считаю императивный стиль более лаконичным
  2. Тяжеловес, у меня будет много простых, но разнообразных маленьких конечных автоматов

Я исследовал сериализацию итераторов на C #, но это не дает мне точного ответа. хотеть быть. Сейчас я собираюсь собрать DSL в Boo, но не уверен, что смогу поведение, подобное сопрограмме, в Boo, а также иметь возможность сериализовать его.

Пример

Вот ограниченный вымышленный пример того, что я хотел бы сделать. Основная проблема заключается в том, что в любой момент процедуры вам может потребоваться ввод данных пользователем. Время между входами может быть очень большим, поэтому состояние обслуживания необходимо будет сериализовать на диск.

    def RunMachine(user)
      var lever = user.ChooseLever()
      lever.Pull()
      var device = CreateDevice(user)
      machine.Add(device)
      machine.Run()

   def CreateDevice(user)
      var color = user.ChooseColor()
      var shape = user.ChooseShape()
      return Device(color, shape)

Обновлять

У меня есть рабочий "движок" в CPython. Он использует поддержку итератора / yield в python. Итак, код выглядит так:

def escape(self, you):        
    roll = yield self.game.rollDice(you)
    if roll < 5:
        self.caughtAction(you)                  

Где rollDice можно прервать. с некоторым действием пользователя. Однако CPython не сериализует итераторы.

Поскольку все состояние игры можно определить как последовательность команд, я сериализую состояние игры до точки, в которой запускается сопрограмма, а затем оставшийся список команд. Итак, сохранение / восстановление выглядит так:

def dumpGameState(game):
    if gameState.partialState:
        return pickle.dumps({ 'partialState': game.partialState, 'partialInputs': game.partialInputs })

    return pickle.dumps(game)

def loadGameState(data):
    state = pickle.loads(data)

    if state.__class__ is Game:
        return state

    r = pickle.loads(state['partialState'])

    for input in state['partialInputs']:
        game.execute(**input)   
    return game

Текущие расследования

Я все еще считаю это неудовлетворительным. Поскольку мне приходится использовать yield почти во всех методах. Я бы предпочел не специально украшать метод. Также он терпит неудачу при сериализации.

В настоящее время я исследую функциональный путь, поскольку функциональные языки, похоже, лучше поддерживают метапрограммирование / создание DSL. В настоящее время смотрю на

Я надеюсь, что с достаточно сильными средствами метапрограммирования я смогу автоматизировать механизм хранения состояний. Кроме того, если я пойду по маршруту F #, я почти уверен, что смогу вернуться к методу " "/ (hack) Я использовал для сериализации итераторов.


person Joseph Kingry    schedule 09.04.2009    source источник


Ответы (5)


Забавно, что вы спросили об этом сегодня, а потом я прочитал о Продолжениях в Mono . Похоже на то, что вам нужно. В частности, есть ссылка на микропоточность в Second Life, включая это описание:

SecondLife требовала, чтобы код был приостановлен в любой момент времени и чтобы все его состояние было сериализовано в формат, подходящий для хранения в базе данных. Затем сериализованное состояние может быть восстановлено в другой момент времени или на другом компьютере (например, при переходе от узла к узлу).

Если я вас не понял неправильно, это может быть хорошей возможностью для исследования.

person Jon Skeet    schedule 09.04.2009
comment
Это выглядит великолепно или, по крайней мере, имеет лучший потенциал. Спасибо! - person Joseph Kingry; 15.04.2009

Я обнаружил, что лучшая поддержка для сериализации сопрограмм, похоже, находится в Lua через Библиотека Плутона.

Я использую Mono 2.6, но не могу заставить работать сопрограммы. Затем я некоторое время экспериментировал с Python / IronPython, но поддержки сериализации не хватало.

Теперь с Lua мне нужно будет интерфейс через P / Invoke от .NET до Lua, которые оказались сложной задачей для работы как с Linux, так и с Windows, но в конечном итоге, если я ищу язык сценариев для поддержки игры, вероятно, лучше всего использовать то, что уже широко выбирается .

Обновить

В итоге я на время отказался от Lua. Я слишком увяз в вопросах интеграции. Я вернулся к Python. Я использую выражения доходности Python для своих сопрограмм. , и работа над проблемой, которую мариновать не может ' t поддержка генераторов.

В моем случае в состоянии программы не всегда есть активные сопрограммы, что означает, что иногда я могу выбрать состояние. В противном случае я сохраняю последнее состояние рассола и «историю воспроизведения» действий с тех пор. Тогда восстановление состояния - это просто распаковка последнего состояния и повторное воспроизведение любых действий.

person Joseph Kingry    schedule 01.03.2010
comment
Недавно я получил pluto и lua, работающие в моем игровом движке продолжения сериализации (weaverengine.com). - person Lilith River; 10.09.2011

Возможно, вы захотите взглянуть на Windows Workflow:

http://msdn.microsoft.com/en-us/netframework/aa663328.aspx

Он предназначен для использования подобным образом, с возможностью сохранения рабочего процесса в случае его бездействия, а также с возможностью его перезапуска.

Хотя технически это не языковая поддержка, она должна выполнять свою работу.

person casperOne    schedule 09.04.2009
comment
Да, я попытался конкретно указать, что я пытался избежать тяжелого декларативного механизма рабочего потока XML, например. в частности Windows Workflow. - person Joseph Kingry; 09.04.2009

Вы ищете продолжения?

На любом языке, поддерживающем замыкания, можно писать программы в стиле продолжения передачи и вручную реализовывать call / cc.

call/cc быть call-with-current-continuation.

person Svante    schedule 09.04.2009
comment
Я считаю, что сопрограммы - это то, что вы можете построить поверх продолжений. ИМХО, сопрограммы позволяют более естественным образом выражать намерения. - person Joseph Kingry; 09.04.2009
comment
Но я возвращаюсь к проблеме, даже при наличии поддержки продолжения на языке, вы можете сериализовать их? - person Joseph Kingry; 09.04.2009
comment
Немного. Например, wiki.apache.org/cocoon/. - person ephemient; 11.04.2009
comment
Фактически, структура веб-инфраструктуры seaide.st Seaside зависит от сериализуемых продолжений. - person ephemient; 11.04.2009

Последняя версия Java включает Rhino, интерпретатор javascript с поддержкой сериализуемых продолжений. Еще есть Pluto + Lua, который я сейчас исследую.

Я хотел бы услышать, по какому пути вы в итоге пошли, поскольку сериализуемые продолжения важны для http://weaverengine.com проект.

person Lilith River    schedule 04.09.2011
comment
Обновленный вопрос о том, где я сейчас нахожусь. - person Joseph Kingry; 09.09.2011
comment
В итоге я успешно использовал Pluto и Lua 5.1. Также есть Eris для Lua 5.2, но я еще не пробовал. - person Lilith River; 28.12.2013