当用作调用堆栈时,无垃圾的意大利面条堆栈会形成DAG吗?
我正在研究用于编程语言的实现技术,并且最近遇到了意粉堆栈,该堆栈被认为非常适合连续传递样式模型(假定它们在例如 Scheme和SML / NJ中使用)。为了简单起见,我们仅考虑此问题的单线程进程。 但是,我对Wikipedia上的图表有些困惑 (也可以在其他地方找到)。特别是,我不明白这种情况如何发生。我只能想象,变灰的分支是无法访问的,应该进行垃圾回收。另一方面,由于我对如何使用意大利面条堆栈实现CPS的含糊理解,我无法想象如何在该结构中实现循环。我必须得出一个结论,它实际上是一个有向无环图,而不是一个“父指针树”,其非垃圾源与线程一样多,宿(与)(潜在)“退出点”一样多。 但是我对这种实现的理解很模糊,所以我想我可能缺少了一些东西。我希望有人可以在“意大利面条调用堆栈”上给我启发,我的意思是指Scheme和/或SML / NJ中用于实现基于CPS的过程的数据结构。 给定以下意大利面条调用堆栈: [exit point] <-- ... <-- [frame A] <-- [frame B (active)] ^ `---- [frame C] 据我了解,来自B的任何流控制要么通过跳到父级(A变为活动状态,现在不可访问的B现在是垃圾)来取消堆栈,要么用子图代替活动帧,仅使用B持有的引用或引用来连接到新的框架。执行无法流向框架C,这必须表示框架C是垃圾。 与以前的情况不同,我认为可能会出现以下无垃圾情况: [exit point] <-- ... <-- [frame W] <-- [frame X] <-- [frame Z (active)] ^ | `---- [frame Y] <---´ 例如,我可以想象Z帧属于某个决策函数,该决策函数要么继续到X帧,要么继续到Y帧(两者都会返回到W)。这意味着意大利面条调用栈不是“父指针树 ”。 但是,我无法想象可以构造循环的任何情况。以以下情况为例: …