静态链和绑定

时间:2011-10-16 05:13:51

标签: language-agnostic scope

我对嵌套子例程中静态范围变量的绑定如何工作感到困惑。

proc A:
      var a, x
       ...
          proc B:
                var x, y
                  ...
                proc B2:
                      var a, b
                      ...
                end B2
          end B
                   proc C:
                     var x, z, w
                         ....
                     end C
end A

首先,这是我所理解的:如果考虑静态作用域,那么B2可以使用其父B中存在的变量x和y。类似地,C可以使用proc A中使用的变量a。

现在,我的问题是:这些绑定是在编译时还是在运行时生成的?如果变量是静态范围的或动态范围的,它会有所不同吗?

1 个答案:

答案 0 :(得分:1)

直到它自然而然地,我发现绘制环境模型图很容易。它们对于考试和那些旨在让人困惑的深奥例子也非常重要。我建议使用着名的SICP(http://mitpress.mit.edu/sicp/),但互联网上显然有足够的资源(快速谷歌让我这样做:http://www.icsi.berkeley.edu/~gelbart/cs61a/EnvDiagrams.pdf)。

它取决于语言/实现何时/如何完成绑定,但在您的示例中,绑定可以在编译时完成。一般来说,静态作用域,顾名思义允许很多静态/编译时绑定。编译器可以查看函数并查看所有引用并立即解决它们。例如,在B2中,对y的引用可以立即解析为属于封闭范围,即B的范围。

根据动态范围与静态范围,存在巨大差异。顾名思义,动态编译时绑定要困难得多,因为代码的结构没有定义对变量的引用。不同的执行路径可能会产生不同的绑定。不过,你必须对问题更加具体。