Динамическое определение объема - Глубокая привязка против мелкой привязки
Я пытался разобраться в мелкой и глубокой привязке, Википедия не может объяснить это должным образом. Скажем, у меня есть следующий код, что будет на выходе, если язык использует динамическую область видимости с
а) глубокое связывание
б) неглубокая привязка?
x: integer := 1
y: integer := 2
procedure add
x := x + y
procedure second(P:procedure)
x:integer := 2
P()
procedure first
y:integer := 3
second(add)
----main starts here---
first()
write_integer(x)
2 ответа
Глубокая привязка связывает среду в момент передачи процедуры в качестве аргумента.
Неглубокое связывание связывает окружающую среду во время фактического вызова процедуры
Таким образом, для динамической области видимости с глубоким связыванием, когда add передается во секунду, среда имеет вид x = 1, y = 3, а x - это глобальный x, поэтому он записывает 4 в глобальный x, который выбирается write_integer.
Неглубокая привязка проходит только до тех пор, пока не найдет ближайшую переменную, соответствующую имени, поэтому ответом будет 1.
A ) При глубоком связывании мы имеем дело со средой add, в которой x относится к глобальному x, а y относится к y, локальному к первому (последняя выполненная функция, которая имеет объявление y)
x (глобальный) = x (глобальный) + y (локальный): x = 1 + 3 = 4
б) При поверхностном связывании мы имеем дело со средой второго, в которой x относится к x, локальному к второму, а y относится к y, локальному к первому (последняя выполненная функция, которая имеет объявление y)
x (локальный) = x (локальный) + y (локальный): x = 2 + 3 = 5
НО: write_integer(x) выводит глобальный x, равный 1
в заключение
а) 4
б) 1
Мелкое связывание должно быть 5. определения: http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=15&lngWId=6