静态和动态范围问题

Dev*_*vyn 2 programming-languages pseudocode

我正在解决静态和动态范围中的以下代码问题.我得到了以下答案,但我需要有人确认我是否正确,因为我有点困惑.如果有人能以简单的方式解释,我真的很感激!

Static  => (1)8  (2)27
Dynamic => (1)10 (2)27

proc main
var x,y,z;
    proc sub1
        var x,z
        x := 6;
        z := 7;
        sub2;
        x := y*z + x;
        print(x);   ---- (2)
    end;
    proc sub2
        var x,y
        x := 1;
        y := x+z+2;
        print(y);   ---- (1)
    end;
begin
    x := 1; y:=3; z:=5;
    sub1;
end 
Run Code Online (Sandbox Code Playgroud)

zeu*_*xcg 5

范围定义了代码中的变量标识符(即名称)映射到实际变量的规则.

静态(或词法)作用域确定映射,根据程序代码结构映射变量名称.首先搜索直接范围(即伪语言中的proc... 之间的块end),即引用变量的范围,搜索变量声明.如果它在那里,名称绑定到此变量.如果不是,则在父范围(基于代码结构 - 即程序文本),祖父母等中查找名称.

在您的情况下,在sub2表达式中x+z+2,x始终引用局部变量(在同一范围内定义),z始终引用mainproc中定义的变量- 此映射不依赖于实际的程序执行.因此,利用静态作用域,x是指具有的值的局部变量1,z是指该变量在main与的值5,所以结果是5+1+2=8.需要注意的是在sub1,x并且z是局部变量-即z := 7不改变zmain.

动态作用域类似于静态作用域,因为它首先在直接作用域中查找变量,然后继续查看作用域的祖先.但是,使用静态作用域时,作用域层次结构由程序文本确定,通过动态作用域,层次结构由程序生成的子例程调用的层次结构确定 - 即作用域层次结构和调用堆栈是相似的.

使用动态范围,在这一点上(1),callstack如下:main -> sub1 -> sub2.因此,sub2首先查找名称sub2(x名称解析为x局部变量,与静态作用域一样),然后在sub1(z名称解析为z变量sub1),然后在main.

所以,x解决的变量与价值1,z从解析到变量sub2与价值7,其结果是10.最后,ysub2被看着sub2,然后在main(因为调用栈是main -> sub2),因此表达结果在(2)IS 3*7+6=27-这是相同的,与静态作用域因为静态(词法)范围层次结构和动态(基于呼叫)的层次结构在这个执行点上是平等的.