保存执行状态 - 像protothreads但不使用标签作为值?

时间:2014-02-05 20:08:23

标签: c state-machine continuations

我正在尝试找到一种序列化执行/堆栈状态的方法,这样一种状态可以在稍后的时间进行存档和恢复,在这种情况下执行可以从中断处继续执行。类似于continuation,但具有堆栈状态应该能够序列化到磁盘并在后续运行中重新水化的功能。我正在使用C(和/或Objective-C,如果有帮助的话。)

Protothreads看起来有点接近我正在寻找的东西,但是使用GCC标签作为值扩展来从存储状态恢复。在我看来,这对于不同编译中的状态的序列化/反序列化来说不太可能是健壮的(并且甚至在ASLR存在的情况下甚至可能不会运行相同的二进制文件。)在摘要中,将会有版本控制可以确定的挑战,但看起来似乎无法通过protothreads达到目标。

我想这里的规范方法是将代码转换为状态机,然后序列化/反序列化SM的状态,但我发现在代码方面思考要容易得多,并且很难想象如何我们可以将大量非平凡代码转换为状态机(即使假设所述代码已经没有全局状态或不可序列化的堆结构等)。

似乎任何可行的方法都要求您在代码中对其进行限制。我想你必须将所有堆栈状态存储在一个镜像堆栈等的“托管”堆栈结构中。我怀疑它不会“免费”,但我想我希望有人已经发明了这个轮子

任何人都知道解决此问题的工具/库,或者是将任意(但符合要求)的代码转换为可序列化状态机的某些方法吗?我找到了ragel,它采用了另一种方式(SM规范 - >代码),但没有任何概括的方式。

我后来发现C#的编译器将基于yield的IEnumerator实现转换为私有/匿名内部类中的状态机,所以我想可以为任意代码自动执行此操作。有人知道这样做的一般化方法吗? (即假设您可以像生成迭代器那样构造代码。)

0 个答案:

没有答案