这一篇的动机是忽然想到在我上一篇博文中提到的使用“截栈”方式实现的分阶段工做模型中,若是把一个阶段看做是一个工做单元,那么这个工做单元与函数式编程中的工做单元--函数是能够彻底等同起来的。 由于,FP的工做模型是“接力”。在这种工做模型中,全部的工做单元是平等的。工做在总体上是经过平等的工做单元--“函数”所完成的。 而若是咱们对一个长调用进行“截栈”之后,方法调用将在截断位被停止。所以,被截开的栈与栈之间已经不存在原来意义上的“调用”关系。 由于采用“截栈”模型的运行时无论其如何管理栈(好比,为不一样的阶段分配不一样的栈;或者对栈进行重用---这其实正是分阶段的真正目的。即经过分阶段实现了栈的快速回收。咱们老是嘲笑那种捡了芝麻,丢了西瓜的人。然而不把西瓜丢掉,捡芝麻就不方便。这不正是咱们现正的问题吗?),一个属于已完成(指已经往约定的地址输出了本身的结果)阶段的栈必须被丢弃---或回收。 而传统调用模型是基于服务的同步调用。且这种同步调用理论上是无止境的。也就是说,历来没有任何东西被设计用来中止它。除非遇到了内存边界(人为的或机器的)!但被“截栈”之后的程序,显然,或者说最少,无止境的同步调用从设计上被“取消”了。一个被取消了无止境同步调用的工做模型,显然为异步的介入提供了机会(庆祝!)。且一旦引入了“截栈”的概念,本来受到物理内存限制的最大栈长再也不存在。由于“截栈”虽然表面上看起来仍然是一种人为设定内存边界的的手段,好象与原来的模型并无什么区别,但这只是单个“截栈”的状况。当咱们把眼光再放宽一点,即假设咱们如今看到了多个“截栈”,那么,如今的状况还与原来同样吗? 固然不。一个栈与多个栈的区别实在是太大了! 在“一栈到底”的工做模型中,栈空间的释放必须发生在整个工做被完成之后; 而在多栈模型中,由于工做被分红了几个阶段来完成。任何一个阶段的完成都意味着一个栈空间的释放(或可释放)。因此,理论上,任意长度的一个工做均可以使用两个栈完成!(这个讨论开始变得有点意思了。。。由于以前我一直在怀疑这种模型即“截栈”与如今最流行的异步模型有什么区别。甚至刚才还提醒本身记得在此文最后对如今的异步模型做一下理论回归。如今看来彻底没有必要。由于异步模型强调的是合做,基础仍然是基于服务的调用。只不过这种调用从同步变成了异步而已。二者之间根本就不存在任何联系!) 延续式调用与服务型调用其实在函数(除指令之外最小的工做单元)内部与长期状态保留中使用的分别应该是相同的内存模型-栈与堆。应为不论是任何语言,显然不会使用一个不能直接寻址的内存模型-堆-去保存一串定长的数据(计算机很难离开固定长度的数据进行工做。好比,虽然对象是不定长的,但其指针是定长的)。所以,延续式调用与服务型调用之间惟一的区别其实只是在于函数自己的内存模型。服务型调用在函数之间仍然使用与函数内相同的内存模型-“栈”。只不过,这里所讲的“栈”象函数同样,是对最小的工做单元(内存字)的第一层抽象。 1, what's good for continuation? 2, what's good for staging? 3, what's good for asynchronization?