Учебное пособие по дисциплине Разработка языков программирования высокого уровня
Скачать 1.74 Mb.
|
2.6 Область видимости переменныхОбласть видимости – фрагмент программы, в котором переменная видима, т.е. определены её атрибуты и к ней можно обратиться. Область видимости тесно связана с понятием блока программы. Блок позволяет фрагменту программы иметь собственные локальные переменные, которые, как правило, автоматические, поэтому память им выделяется в начале выполнения блока и освобождается по его окончании. Существует два способа реализации области видимости: - в виде статического обзора данных (СОД), - в виде динамического обзора данных (ДОД). Статический обзор данных. Статический обзор данных – это связывание глобальных (нелокальных) переменных с атрибутами (т.е. определение области видимости переменных) на стадии компиляции. Он создаётся определениями главной программы, подпрограмм и блоков и определяет механизм вложенности подпрограмм или блоков друг друга (определяется иерархией вложенности подпрограмм и блоков, рис.5) Рис.5. Схема областей видимости главной программы Program, программ A,B,C,D,E Когда в языке со статическим обзором данных компилятор обнаруживает переменную, её атрибуты определяются путём поиска объявившего её оператора. Например: Procedure big; Var x: integer; Procedure sub1; begin {sub1}; ..x… end {sub1}; Procedure sub2; Var x: integer; Begin…end{sub2}; Begin {big}…end{big}; Здесь, ссылка на переменную x сделана в процедуре sub1. Вначале компилятор ищет объявление в sub1, и если не находит, продолжает поиск в процедуре, породившей sub1 (статическом родителе). Локализованные в блоке имена могут совпадать с ранее объявленными глобальными переменными. В этом случае считается, что локальное имя “закрывает” глобальное и делает его недоступным. Например: Var i: integer; Procedure P; Var i: integer; begin writeln(i); end (P); begin i: = 1; Обращение к блоку P; end. Эта программа выдаст любое значение, т.к. локальная переменная i в процедуре P “закроет” глобальную, а значение i при входе в блок P не определено. Если убрать описание i : integer из блока P, на экран будет выведено значение глобальной переменной i, т.е.1. Основной недостаток СОД заключается в том, что все переменные, объявленные в главной программе, видимы во всех программах иерархии и избежать этого нельзя (только если закрыть локальной). Динамический обзор. При динамическом обзоре данных видимость переменных определяется последовательностью вызовов подпрограмм, а не их структурной вложенностью. Определяющим фактором для реализации механизмов видимости здесь является иерархия активаций подпрограмм. Это означает, что все объявления переменных инициируются не при компиляции, а в динамике. Поэтому динамический обзор всегда реализуется только при выполнении программы. Например: Procedure big; Var x: integer; Procedure sub1; Begin ..x…end{sub1}; Procedure sub2; Var x: real; Begin … end {sub2}; Begin ………. end {big}; Тип переменной х здесь определяется последовательностью активаций процедур. При ссылке на переменную х во время выполнения программы начинается поиск среди локальных переменных процедуры. Если такого объявления не находится, то для определения типа переменной х обращение идёт не к структурной иерархии, породившей процедуру, а к иерархии активации процедур, вызванных ранее (динамическим родителям), и используются их объявления, начиная с нижнего уровня. Рассмотрим 2 последовательности вызовов вышеописанного примера: 1) big→sub2→sub1 2) big→sub1→sub2. При динамическом обзоре в цепочке 1) для переменной х процедуры sub1 будет действовать объявление из процедуры big. При статическом же обзоре в обоих случаях используется описание из процедуры big. Средой ссылок оператора называется совокупность всех имён, видимых в операторе. Среда ссылок оператора называется совокупность всех имён, видимых в операторе. Среда ссылок при статическом обзоре состоит из: - области видимости его локальных переменных, - совокупности областей видимости статических предков. Пример 5. Program example; Var a, b: integer; … Procedure sub1; Var x, y: integer; Begin……….. ------ точка 1 -------------- end; {sub1} Procedure sub2; Var x : integer; … Procedure sub3; Var x, y: integer; Begin ……..---------точка 2---------- end; {sub3} Begin ……..---------точка 3---------- end; {sub2} Begin……...---------точка 4---------- end; {example} В указанных точках программы области видимости (среда ссылок) при статическом обзоре будут состоять из следующих переменных: Точка 1 переменные x и y процедуры sub1, переменные а и b процедуры example; Точка 2 x процедуры sub3 (x процедуры sub2 скрыта), переменные a и b программы example. Точка 3 x процедуры sub2, переменные a и b программы example; Точка 4 переменные a и b программы example. Среда ссылок в языке с динамическим обзором состоит из: Локально объявленных переменных, Переменных всех других активных на данный момент подпрограмм. При этом некоторые переменные активных процедур могут быть скрыты от среды. Новые активации процедур могут скрывать переменные в предыдущих активациях. Пример 6. Void sub1() { Int a, b; -------точка 1---------} Void sub2() { Int b, c; -------------точка 2----------- Sub1; } Void main() { Int c, d; -------------точка 3----------- Sub2; } Среда ссылок для данной программы для данной программы при ДОД в указанных точках следующая: Точка 1 переменные а и b процедуры sub1, переменная с процедуры sub2, переменная d функции main (переменная с функции main и переменная b процедуры sub2 скрыты), Точка 2 b и с процедуры sub2, переменная d функции main (переменная с функции main скрыта), Точка 3 переменные с и d функции main. |