Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Exception handling 异常帧与返回堆栈上的其他数据的区别是什么?_Exception Handling_Stack_Forth_Gforth - Fatal编程技术网

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将使用标准方式。感谢链接。这很有帮助。