Статическая и динамическая задача определения объема - PullRequest
2 голосов
/ 03 января 2011

Я решаю следующий код в статическом и динамическом определении объема.Я получил следующий ответ, но мне нужен кто-то, чтобы подтвердить, правильно я или нет, потому что я немного запуталсяЯ действительно ценю, если кто-нибудь может объяснить простым способом!

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 

1 Ответ

5 голосов
/ 04 января 2011

Scoping определяет правила, по которым идентификаторы переменных в вашем коде (то есть имена) отображаются в фактические переменные.

Статическая (или лексическая) область видимости определяет отображение, посредством которого имена переменных отображаются на основе структуры программного кода. Во-первых, в непосредственной области (то есть блоке между proc .. end в вашем псевдо-языке), то есть в области, на которую ссылается переменная, выполняется поиск объявления переменной. Если он есть, имя привязано к этой переменной. Если это не так, имя ищется в родительской области (на основе структуры кода - то есть в тексте программы), в прародителе и т. Д.

В вашем случае, в sub2, в выражении x+z+2, x всегда ссылается на локальную переменную (определенную в той же области видимости), z всегда ссылается на переменную, определенную в main proc - это отображение не зависит от фактического выполнения программы. Следовательно, при статической области видимости x относится к локальной переменной со значением 1, z относится к переменной в main со значением 5, поэтому результат равен 5+1+2=8. Обратите внимание, что в sub1, x и z являются локальными переменными - то есть z := 7 не меняет z в main.

Динамическая область видимости похожа на статическую область видимости в том, что сначала она ищет переменную в непосредственной области видимости, а затем продолжает искать предков области видимости. Однако в то время как при статическом определении объема иерархия области определяется текстом программы, при динамическом определении объема иерархия определяется иерархией вызовов подпрограммы, которые выполняет ваша программа, то есть иерархия области действия и стек вызовов одинаковы.

При динамическом определении объема в точке (1) стек вызовов выглядит следующим образом: main -> sub1 -> sub2. Таким образом, имена в sub2 сначала ищутся в sub2 (имя x преобразуется в локальную переменную x, как при статической области видимости), затем в sub1 (имя z разрешается в z переменная в sub1), затем в main.

Таким образом, x разрешается в переменную со значением 1, z разрешается в переменную из sub2 со значением 7, и результат равен 10. Наконец, y в sub2 ищется в sub2, затем в main (поскольку стек вызовов равен main -> sub2), поэтому результат выражения в (2) равен 3*7+6=27 - это то же самое как со статической областью видимости, потому что статическая (лексическая) иерархия области действия и динамическая (основанная на вызове) иерархия равны в этой точке выполнения.

...