Программирование на языках высокого уровня: Методические указания к выполнению курсового проекта, страница 7

Пример содержания внутренних структур, сформированных компилирующей частью системы

Текст исходной программы (внешние данные)

program main;

var a,b;

procedure c(var d;e);

var a;

begin

end; {c}

procedure d(var e;f);

var b;

begin

c(b,f);

end; {d}

procedure g(h,var i);

var c;

procedure j(var k);

begin

end; {j}

begin

j(c);

d(h,c);

end; {g}

begin

d(a,b);

g(a,b);

end. {main}

Таблица имен блоков (внутренние данные)

Имя блока

Ссылка на таблицу имен

Ссылка на исполняемый код

main

1¸5

1¸3

c

6¸8

4¸4

d

9¸11

5¸6

g

12¸15

7¸9

j

16¸16

10¸10

Таблицы имен (внутренние данные)

имя

тип

1

a

var

2

b

var

3

c

proc

4

d

proc

5

g

proc

6

d

paramv

7

e

param

8

a

var

9

e

paramv

10

f

param

11

b

var

12

h

param

13

i

paramv

14

c

var

15

j

proc

16

k

paramv

Исполняемый код (внутренние данные)

1

d(a,b)

2

g(a,b)

3

stop

4

return

5

c(b,f)

6

return

7

j(c)

8

d(h,c)

9

return

10

return

Внешние выходные структуры компилирующей части системы – это таблицы символических имен для каждого блока программы. Они могут формироваться одновременно с вышеописанными внутренними структурами. В случае динамического формирования области видимости имен эти таблицы – просто фрагменты, из которых  сформирована внутренняя таблица локальных имен. В случае статического формирования области видимости неоценимую помощь в построении таких таблиц окажет так называемый стек времени компиляции. Запись такого стека – это символическое имя со своими атрибутами. В процессе просмотра исходной программы при обнаружении начала описания блока (в нашем примере это – procedure или program) компилятор заносит в стек все локальные имена этого блока, а при обнаружении конца описания блока (в нашем примере это - end) компилятор удаляет из стека все локальные имена этого блока. Таблица имен блока формируется в момент рассмотрения компилятором этого блока. В нее записываются по одному все имена, находящиеся в этот момент в стеке.

Примеры содержания стека времени компиляции

1)  Рассмотрение блока c

Содержание стека                            Таблица имен блока c

a var

c

a

var

c

c param

c

e

param

c

d paramv

c

d

paramv

c

b var

main

b

var

main

a var

main

2)  Рассмотрение блока d

Содержание стека                            Таблица имен блока d

b var

d

b

var

d

f param

d

f

param

d

e paramv

d

e

paramv

d

c proc

main

c

proc

main

b var

main

a

var

main

a var

main

При моделировании процесса выполнения программы аналогично формированию стека времени компиляции формируется стек времени выполнения программы (еще одна внутренняя структура). Занесение данных в стек происходит при обнаружении оператора вызова блока, удаление – при обнаружении оператора возврата из блока (в нашем примере это - return). В условиях динамического формирования области видимости имен текущее содержание такого стека позволяет определить видимые в исполняемом блоке имена аналогично тому, как это определяется по стеку времени компиляции в условиях статического формирования области видимости.