1

值传递语义很容易在解释器中实现(例如,您的普通命令式语言)。对于每个范围,我们维护一个将标识符映射到其值的环境。处理函数调用涉及创建一个新环境并用参数的副本填充它。

如果我们允许通过引用传递的参数,这将不起作用。这种情况通常如何处理?

4

1 回答 1

2

首先,您的解释器必须检查参数是否可以通过引用传递——参数是否在赋值语句的左侧是合法的。例如,如果f有一个按引用传递的参数,f(x)则可以(因为x := y有意义)但f(1+1)不是(1+1 := y没有意义)。典型的限定参数是变量和类似变量的构造,如数组索引(如果是一个合法索引a的数组,没关系,因为有意义)。5f(a[5])a[5] = y

如果参数通过了检查,解释器就可以在处理函数调用时确定它引用的精确内存位置。当您构建新环境时,您会将对该内存位置的引用作为 pass-by-reference 参数的值。该引用的具体外观取决于您的解释器的设计,特别是取决于您如何表示变量:如果您的实现语言支持它,您可以简单地使用指针,但如果您的设计需要它,它可能会更复杂(重要的是是引用必须使您能够检索和修改所引用的内存位置中包含的值)。

当您的解释器正在解释函数的主体时,它可能必须特别处理 pass-by-referece 参数,因为环境不包含它的正确值,只是一个引用。您的口译员必须认识到这一点,然后去查看参考文献所指的内容。例如,如果x是局部变量并且y是通过引用传递的参数,计算x+1y+1可能(取决于您的解释器的详细信息)的工作方式不同:在前者中,您只需查找 的值x,然后将 1 添加到它; 在后者中,您必须查找y碰巧在环境中绑定的引用,然后查看引用远端的变量中存储的值是什么,然后向其添加一个值。同样,x = 1y = 1可能会有不同的工作方式:前者只是修改 的值x,而后者必须首先查看引用指向的位置并修改它在那里找到的任何变量或类似变量的东西(例如数组元素)。

您可以通过将环境中的所有变量绑定到引用而不是值来简化这一点;然后查找变量的值与查找传递引用参数的值的过程相同。但是,这会产生其他问题,这取决于您的解释器设计以及语言的细节是否值得麻烦。

于 2013-07-17T07:34:21.030 回答