return 堆栈上的异常帧与其他数据有什么区别?

What differentiates exception frames from other data on the return stack?

我试图了解异常帧在 THROW 期间如何位于 return 堆栈上。

"jonesforth.f.txt" 中的评论断言 "When called, THROW walks up the return stack (the process is called 'unwinding') until it finds the exception stack frame." 我不清楚 (EXCEPTION-MARKER) 与 return 堆栈上的其他数据有何区别(return 地址,使用 >R 的用户值,以及 do-loops 的索引)。

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

Gforth 好像没有使用这个'unwinding'方法。

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

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

也许 Jones Forth 依赖于 return 堆栈在抛出时仅包含 return 个地址的假设。标记地址是唯一的,因为它是一个字典词。典型的循环索引不会达到高到与 return 地址混淆的程度。

关于如何可以在典型的 FORTH 系统中工作的解释是 Milendorf

paper