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
- это то же самое как со статической областью видимости, потому что статическая (лексическая) иерархия области действия и динамическая (основанная на вызове) иерархия равны в этой точке выполнения.