Serialization 支持序列化协同程序的语言

Serialization 支持序列化协同程序的语言,serialization,programming-languages,dsl,coroutine,Serialization,Programming Languages,Dsl,Coroutine,我认为目前的语言中不存在这样的支持。我想我想做的事情可以通过一个“工作流引擎”来解决。但工作流的问题通常是: 声明式/冗长式,我发现命令式风格更简洁 重量级,我会有很多简单但多样的小状态机 我已经调查过了,但这并没有让我真正达到我想要的目的。我目前正在考虑在中整合一个DSL,但不确定是否能够将类似于协同路由的行为纳入Boo,并将其序列化 例子 下面是我想做的有限的虚构例子。主要问题是,在例程的任何时候,您都可能需要获得用户输入。输入之间的时间可能很长,因此服务状态需要序列化到磁盘 def

我认为目前的语言中不存在这样的支持。我想我想做的事情可以通过一个“工作流引擎”来解决。但工作流的问题通常是:

  • 声明式/冗长式,我发现命令式风格更简洁
  • 重量级,我会有很多简单但多样的小状态机
  • 我已经调查过了,但这并没有让我真正达到我想要的目的。我目前正在考虑在中整合一个DSL,但不确定是否能够将类似于协同路由的行为纳入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有一个工作的“引擎”。它依赖于python中的迭代器/产量支持。代码如下所示:

    def escape(self, you):        
        roll = yield self.game.rollDice(you)
        if roll < 5:
            self.caughtAction(you)                  
    
    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
    
    当前调查 我仍然觉得这不能令人满意。因为我最终不得不在几乎所有方法上使用“收益率”。我不想专门装饰一个方法。此外,它在序列化方面也相当失败

    目前,我正在研究一种函数式方法,因为函数式语言似乎对元编程/DSL创建有更好的支持。目前正在考虑

    • 哈斯克尔

    我希望有了足够强大的元编程工具,我可以自动化状态存储机制。此外,如果我选择F#路线,我很确定我可以依靠我用来序列化迭代器的方法。

    您可能想看看Windows工作流:

    它的使用方式是这样的,能够在工作流处于非活动状态时保持工作流,并能够重新启动工作流

    虽然从技术上讲它不是语言支持,但它应该能够完成任务。

    您在寻找什么

    在任何支持闭包的语言中,都可以编写延续传递样式的程序并手动实现call/cc


    call/cc
    being
    call with current continuation

    有趣的是,你今天应该问这个问题,后来我读到了。看起来像是你想要的那种东西。特别是有一个参考,包括以下描述:

    SecondLife要求代码为 在任何时间点暂停,并且 它的整个状态是可序列化的 转换成适合存储的格式 输入数据库。序列化状态 然后可以在不同的时间恢复 时间点或在不同的时间点 计算机(例如移动时 从一个节点到另一个节点)


    除非我误解了您的意思,否则这可能是一个很好的探索途径。

    我发现对序列化的最好支持似乎是通过库在Lua中

    我三年了,但不能让合作项目运作。然后我用Python/IronPython进行了一段时间的实验,但缺少序列化支持

    现在有了Lua,我将不得不面对在Linux和Windows上工作的挑战,但最终如果我要寻找一种脚本语言来支持游戏,可能最好使用已经被广泛选择的语言

    更新

    我最终暂时放弃了Lua。我在集成问题上陷得太深了。我回到Python。我正在为我的合作计划使用,并且正在解决这个问题


    在我的例子中,程序状态并不总是有活动的协程,这意味着有时我可以对状态进行pickle。否则,我将存储最后一个pickle状态,以及此后操作的“重播历史记录”。然后恢复状态就是取消勾选最后一个状态,并重播任何操作。

    最新版本的Java包括Rhino,一个支持可序列化连续化的javascript解释器。还有冥王星+卢阿,我正在调查


    我想听听您最终选择了什么样的路径,因为可序列化的连续性对项目很重要。

    是的,我试图明确指出,我试图避免使用XML繁重、去极化的工作流引擎,例如Windows工作流。我相信协程是可以在连续性的基础上构建的。协同程序允许更自然地表达意图IMHO。但我回到这个问题,即使在语言中提供了延续支持,您能序列化它们吗?有些。例如,事实上,Seaside web框架的设计依赖于可序列化的continuations。这看起来很棒,或者至少它有最好的潜力。谢谢更新了我目前所在的位置的问题。我最终成功地使用了冥王星和Lua5.1。Lua5.2也有Eris,但我还没有尝试过。我最近让冥王星和Lua在我的延续序列化游戏引擎()中工作。