【发布时间】:2009-11-20 13:25:38
【问题描述】:
在 Pharo 中,我如何找到当前正在评估的堆栈?
【问题讨论】:
-
仅供参考,如果您提出一个非常简单的问题并在一分钟后给出一个非常简单的答案,您并没有真正为网站增加价值。
-
这是 google 查询找不到的东西……
标签: stack metaprogramming smalltalk pharo
在 Pharo 中,我如何找到当前正在评估的堆栈?
【问题讨论】:
标签: stack metaprogramming smalltalk pharo
好吧,事实上,问题并没有那么简单:thisContext 与发送消息相比可能是一项相当昂贵的操作。
在 Visualworks Smalltalk 中,堆栈访问是extermly昂贵的,因为它使用本机 C 堆栈,因此对 thisContext 的任何访问都必须将整个 C 堆栈具体化为因果关系 em> Smalltalk 对象。也就是说,对于每个 C 堆栈帧,将创建一个 Smalltalk 对象(包括可能的 JIT 去优化),此外,对这些对象的所有更改都必须反映回 C 堆栈。
在 Pharo(和 Squeak,就此而言)它不那么尴尬,因为它使用 Smalltalk 对象作为堆栈。但是缓存堆栈帧的对象池仍然在每次调用时刷新。 (是的,除了在 Java 中,池化对象确实提高了 Squeak 的性能……欢迎回到 90 年代:)
【讨论】:
你评价
thisContext contextStack
这里,thisContext 实际上是一个特殊的变量,它指向当前活动的堆栈帧。然后,contextStack 返回一个包含整个堆栈的数组。
【讨论】: