1

在 Pharo 中,如何找到当前正在评估的堆栈?

4

2 回答 2

1

你评价

thisContext contextStack

这里,thisContext实际上是一个特殊的变量,它指向当前活动的堆栈帧。然后,contextStack返回一个包含整个堆栈的数组。

于 2009-11-20T13:26:55.527 回答
1

好吧,事实上,问题并没有那么简单:thisContext与发送消息相比,这可能是一个相当昂贵的操作。

在 Visualworks Smalltalk 中,堆栈访问非常昂贵,因为它使用本机 C 堆栈,因此任何访问都thisContext必须将整个 C 堆栈具体化为因果连接的Smalltalk 对象。也就是说,对于每个 C 堆栈帧,将创建一个 Smalltalk 对象(包括可能的 JIT 去优化),此外,对这些对象的所有更改都必须反映回 C 堆栈。

在 Pharo(和 Squeak,就此而言)它不那么尴尬,因为它使用 Smalltalk 对象作为堆栈。但是缓存堆栈帧的对象池仍然在每次调用时刷新。(是的,除了在 Java 中,池化对象确实提高了 Squeak 的性能……欢迎回到 90 年代 :)

于 2009-11-20T18:17:18.697 回答