两种运行时

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

延续式调用与服务型调用其实在函数(除指令以外最小的工作单元)内部与长期状态保留中使用的分别应该是相同的内存模型-栈与堆。应为不管是任何语言,显然不会使用一个不能直接寻址的内存模型-堆-去保存一串定长的数据(计算机很难离开固定长度的数据进行工作。比如,虽然对象是不定长的,但其指针是定长的)。因此,延续式调用与服务型调用之间唯一的区别其实只是在于函数本身的内存模型。服务型调用在函数之间仍然使用与函数内相同的内存模型-“栈”。只不过,这里所讲的“栈”象函数一样,是对最小的工作单元(内存字)的第一层抽象。
1, what's good for continuation?
2, what's good for staging?
3, what's good for asynchronization?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值