Главная страница

Учебное пособие по дисциплине Разработка языков программирования высокого уровня


Скачать 1.74 Mb.
НазваниеУчебное пособие по дисциплине Разработка языков программирования высокого уровня
Дата05.03.2023
Размер1.74 Mb.
Формат файлаdocx
Имя файлаLektsii_YaPVU_Lukinova_2_semestr.docx
ТипУчебное пособие
#970477
страница9 из 20
1   ...   5   6   7   8   9   10   11   12   ...   20

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.
1   ...   5   6   7   8   9   10   11   12   ...   20


написать администратору сайта