Статические цепи и связывание - PullRequest
1 голос
/ 16 октября 2011

Я не совсем понимаю, как работает связывание для статически изменяемых переменных во вложенных подпрограммах.

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 может использовать переменные x и y, присутствующие в его родительском B. Аналогично C может использовать переменную a, используемую в proc A.

Теперь мои вопросы: сделаны ли эти привязки во время компиляции или во время выполнения? Имеет ли значение, если переменные имеют статическую или динамическую область?

1 Ответ

1 голос
/ 16 октября 2011

До тех пор, пока это не произойдет естественным образом, я легко нарисую диаграммы моделей среды. Они также очень важны для экзаменов и тех эзотерических примеров, которые предназначены для того, чтобы сбить с толку. Я предлагаю знаменитый SICP (http://mitpress.mit.edu/sicp/),, но в Интернете явно более чем достаточно ресурсов (быстрый Google привел меня к этому: http://www.icsi.berkeley.edu/~gelbart/cs61a/EnvDiagrams.pdf).

Это зависит от языка / реализации, когда / как выполняются привязки, однако в вашем примере привязки могут быть выполнены во время компиляции. В общем, статическая область видимости, как следует из названия, допускает большую статическую привязку / время компиляции. Компилятор может просмотреть функцию, увидеть все ссылки и немедленно разрешить их. Например, в B2 ссылка на y может быть немедленно разрешена, чтобы принадлежать к охватывающей области, то есть к B.

Согласно динамическому и статическому масштабированию, существует огромная разница. Динамическое, как следует из названия, гораздо сложнее связывать во время компиляции, поскольку структура кода не определяет ссылки на переменные. Разные пути исполнения могут давать разные привязки. Вы должны быть более конкретными с этим вопросом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...