异常帧与返回堆栈上的其他数据有何区别?

Posted

技术标签:

【中文标题】异常帧与返回堆栈上的其他数据有何区别?【英文标题】:What differentiates exception frames from other data on the return stack? 【发布时间】:2017-12-15 02:01:51 【问题描述】:

我试图了解在THROW 期间异常帧在返回堆栈中的位置。

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

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

【问题讨论】:

看来gforth 没有使用“展开”方法。相反,它将活动异常帧的位置存储在全局变量中,同时将先前活动帧的位置保存在返回堆栈上的新帧中。抛出异常时,gforth 直接从全局变量中读取最后一帧(最内部捕获)位置。 实际上,在我检查过的其他多个方面,我没有看到这种“放松”方法。所有这些都使用了在链表中链接帧的相同想法,头指针存储在全局变量中。这现在看起来很典型:lars.nocrew.org/dpans/dpansa9.htm 也许jonesforth 依赖于一个假设,即返回堆栈在抛出时应该只包含返回地址。标记地址是唯一的,典型的循环索引不会达到与返回地址混淆的那么高。 JonesForth 的异常处理(THROW 和 CATCH)不是标准方式。它实际上是完全不同的。然而,大多数当前的 Forths 将使用标准方式。 【参考方案1】:

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

【讨论】:

感谢您的链接。这很有帮助。【参考方案2】:

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

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

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

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

【讨论】:

以上是关于异常帧与返回堆栈上的其他数据有何区别?的主要内容,如果未能解决你的问题,请参考以下文章

了解Java在抛出异常时的堆栈展开

JAVA中 请问RETURN与break有何区别

JAVA中构造方法和普通方法的区别

Java开发学习视频!java栈和堆栈有何区别

Java开发学习视频!java栈和堆栈有何区别

MERN 堆栈上的 FindOneAndDelete 将返回成功但数据仍在数据库中?