如何在解释器上实现try/catch/finally功能(目前我正在使用F#)?
我怀疑GOTOs是可以使用的(但是,在解释器中提供它的功能也是必要的,但是我从来没有使用过GOTO (只知道它是邪恶的!)也不知道如何保护环境。
P.D:我已经知道CPS (延续)可以用来模拟异常和任何其他控制流。然而,它使语言实现和请求优化的其余部分变得复杂,从而消除了它的开销,对于这个问题,我希望了解其他方法。
P.D.2:除了CPS之外,还有另一种替代方案,可以很容易地实现自定义控制流?或者一种推广GOTOs的方法?
发布于 2016-07-23 05:30:19
控件可以通过多种方式避开“尝试”块:
你可能有更多,取决于你的语言。
尝试-最终块必须做的是捕获所有这些,执行最后部分,然后继续预期的操作。
实现这一目标的一种方法是为每个块转义创建一个传输岛。转移岛作为每个这些操作的目标;如果控制到达转移岛K,则块逃逸K已经发生。传输岛所做的是调用一个(无参数的)子例程,其中包含finally子句,然后执行一个动作以继续转义K。
想象一下下面的“尝试-最后”块:
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;在这种背景下,您必须让解释器执行操作,就像存在此代码一样。显然,解释器不需要实例化传输岛;它知道发生了哪种类型的块转义,可以执行最终操作,然后继续执行块转义。
https://stackoverflow.com/questions/38536362
复制相似问题