Exception handling 异常帧与返回堆栈上的其他数据的区别是什么?
我试图了解在Exception handling 异常帧与返回堆栈上的其他数据的区别是什么?,exception-handling,stack,forth,gforth,Exception Handling,Stack,Forth,Gforth,我试图了解在抛出过程中异常帧如何位于返回堆栈上 “jonesforth.f.txt”中的注释断言“调用时,THROW将沿着返回堆栈(该过程称为“展开”),直到找到异常堆栈帧。”我不清楚(异常标记)如何与返回堆栈上的其他数据区分开来(使用>R返回地址、用户值以及do循环的指示) 一般来说,各种Forth如何区分异常帧和返回堆栈上的其他数据?似乎Gforth没有使用这种“展开”方法 相反,它将活动异常帧的位置存储在全局变量中,同时将以前活动帧的位置保存在返回堆栈上的新帧中。当抛出异常时,Gforth
抛出过程中异常帧如何位于返回堆栈上
“jonesforth.f.txt”中的注释断言“调用时,THROW将沿着返回堆栈(该过程称为“展开”),直到找到异常堆栈帧。”我不清楚(异常标记)
如何与返回堆栈上的其他数据区分开来(使用>R
返回地址、用户值以及do循环的指示)
一般来说,各种Forth如何区分异常帧和返回堆栈上的其他数据?似乎Gforth没有使用这种“展开”方法
相反,它将活动异常帧的位置存储在全局变量中,同时将以前活动帧的位置保存在返回堆栈上的新帧中。当抛出异常时,Gforth直接从全局变量读取最后一帧(最内部捕获)位置
事实上,在我检查过的其他多个Forth中,我没有看到“展开”方法的这种实现。所有这些Forth都使用了相同的想法,将帧链接到链接列表中,头部指针存储在全局变量中。这现在对于Forth来说很典型:
也许Jones Forth是基于这样一种假设,即返回堆栈在抛出时应该只包含返回地址。标记地址是唯一的,因为它是一个字典单词。典型的循环索引不会达到与返回地址混淆的高度。关于如何在典型的Forth系统中工作的解释stem是Milendof设计的。似乎,gforth
没有使用“展开”方法。相反,它将活动异常帧的位置存储在全局变量中,同时将以前活动帧的位置保存在返回堆栈的新帧中。当抛出异常时,gforth
读取最后一帧(大多数内部捕获)直接来自全局变量的位置。事实上,在我检查过的其他多个Forth中,我没有看到这种“展开”方法。所有Forth都使用相同的想法,将帧链接到一个链表中,头部指针存储在全局变量中。这现在看起来是Forth的典型情况:可能jonesforth
依赖于一个假设,即rn堆栈在抛出时应仅包含返回地址。标记地址是唯一的,并且典型的循环索引不会达到与返回地址混淆的高度。JonesForth的异常处理(包括抛出和捕获)不是标准方式。事实上是完全不同的。但是大多数当前Forth将使用标准方式。感谢链接。这很有帮助。