gpt4 book ai didi

exception - 如何在带有 goto 或类似语言的解释器中实现 Try/Except/Finally?

转载 作者:行者123 更新时间:2023-12-03 07:00:37 26 4
gpt4 key购买 nike

如何在解释器上实现 try/catch/finally 功能(目前我使用的是 F#)?

我怀疑可以使用GOTO(但是,也有必要在解释器中提供它的功能,不太知道如何使用),但我一生中从未使用过GOTO(只知道是邪恶的!)并且也不知道如何保护环境。

P.D:我已经知道可以使用 CPS(Continuations)来模拟异常和任何其他控制流。然而,它使语言实现的其余部分变得复杂,并且需要优化过程来消除它的开销,对于这个问题,我希望了解实现这一点的替代方法

P.D.2:是否存在 CPS 的另一种替代方案,可以轻松实现自定义控制流?或者为此概括 GOTO 的方法?

最佳答案

控件可以通过多种方式逃脱“try” block :

  • 转到周围 block 中的标签(注意:goto X 和 goto Y 是 2 个不同的转义符!)
  • 从包含 try 的函数返回
  • 在 try 中抛出异常
  • 从 try 主体调用的函数传播异常
  • (可检测到)在 try 主体中调用 exit()

您可能有更多内容,具体取决于您的语言。

你的try-finally block 必须做的是捕获所有这些,执行finally部分,然后继续预期的操作。

实现此目的的一种方法是为每个方 block 逃生创建一个传送岛。中转岛是上述每项行动的目标;如果控制到达转移岛 K,则发生 block 逃逸 K。转移岛所做的就是调用一个包含finally子句的(无参数)子程序,然后执行一个 Action 来继续转义K。

想象一下以下 try-finally block :

   try
...goto X... // ... means some control structure wrapped around this
...raise Z...
...call q()... // throws exception
...goto Y...
...return 5...
finally
<some actions>
end
...return <exp>

此代码可能会编译为:

   // try
... goto TIX... // TIk ==> "tranfer island k"
...exception=Z; goto TIE ...
...try call q()
catch exception; goto TIE
end try
...result=5; goto TIR...
// finally
local subroutine finally()
{ <some actions> }
TIX: call finally();
goto X;
TIY: call finally();
goto Y;
TIR: call finally();
goto RETURN;
TIE: call finally();
propagate exception; // means "pass control to containing exception handler"
...
// end try

result=<exp>;
RETURN:
return result;

在这个背景下,你必须让解释器执行操作,就好像这段代码存在一样。显然,解释器不需要实例化传输岛;它知道发生了哪种类型的 block 转义,可以执行finally Action ,然后继续进行 block 转义。

关于exception - 如何在带有 goto 或类似语言的解释器中实现 Try/Except/Finally?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38536362/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com