4

我试图了解异常帧在THROW.

“jonesforth.f.txt”中的注释断言“当被调用时,THROW 会沿着返回堆栈(该过程称为'展开')直到找到异常堆栈帧。” 我不清楚它是如何(EXCEPTION-MARKER)与返回堆栈上的其他其他数据区分开来的(返回地址、使用的用户值>R以及 do-loops 的索引)。

一般来说,各种 Forth 是如何区分异常帧和返回栈上的其他数据的呢?

4

2 回答 2

4

Gforth 似乎没有使用这种“展开”方法。

相反,它将活动异常帧的位置存储在全局变量中,同时将先前活动帧的位置保存在返回堆栈上的新帧中。当抛出异常时,Gforth 直接从全局变量中读取最后一帧(最内层捕获)位置。

实际上,在我检查过的其他多个方面,我没有看到“展开”方法的这种实现。所有这些都使用了相同的想法,即在链表中链接帧,指针存储在全局变量中。这看起来很典型: http ://lars.nocrew.org/dpans/dpansa9.htm

也许 Jones Forth 依赖于一个假设,即返回堆栈应该只包含抛出时的返回地址。标记地址是唯一的,因为它是一个字典词。并且典型的循环索引不会达到与返回地址混淆的那么高。

于 2017-07-21T06:35:39.827 回答
3

Milendorf的论文解释了它如何典型的 FORTH 系统中工作

于 2018-04-24T16:41:22.417 回答