博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
两种运行时 -- 写于2009-05-19
阅读量:7093 次
发布时间:2019-06-28

本文共 1382 字,大约阅读时间需要 4 分钟。

  hot3.png

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

转载于:https://my.oschina.net/digerl/blog/34694

你可能感兴趣的文章
我的友情链接
查看>>
document.body属性
查看>>
诚聘Java高级开发工程师
查看>>
linux 下查看登陆用户
查看>>
趁热来一发——关于避免死锁时测试结果颠覆三观不得不思考虫生这件小事
查看>>
我的友情链接
查看>>
人脉通分享工能,点击分享到微信或者qq的分享链接打开H5,提示用户用浏览器打开,点击下载,有有app...
查看>>
Java:String和Date、Timestamp之间的转换
查看>>
Mongodb概述
查看>>
yii 安全措施 (Security)
查看>>
性能监测与优化命令top
查看>>
apache
查看>>
Logback学习笔记1
查看>>
随笔一篇
查看>>
小波说雨燕 第三季 构建 swift UI 之 UI组件集-视图集(三)Activity Indicators视图 学习笔记...
查看>>
浅谈物联网所面对的问题和挑衅
查看>>
期刊发表要求都有哪些
查看>>
php导出数据到excel,身份证等数字常用格式
查看>>
我的友情链接
查看>>
Grub 配置解析(1)
查看>>