а) |
б) |
в) |
г) |
|
(1) program Sort(input, output);
(2) var arr : array [0..11] of integer;x: integer;mVal,rest:word;
(3)
|
(4) begin … end { readarray };
(5)
|
begin … end { exchange };
(6)
(7) procedure QuickSort(iBeg,iEnd : integer);
(8) var iMid,k,si,sj: integer;
(9) function PartExch(iBeg,iEnd: integer): integer;
(10) var i,j: integer;
(11) begin
(12) …
(13)
|
(14) …
(15)
|
(16) …
(17) end { PartExch };
(18) begin
(19) …
(20) iMid:=PartExch(iBeg,iEnd);
(21) …
(22) QuickSort(iBeg,iMid-1); end;
(23) …
(24) end { QuickSort };
(25) begin
(26) QuickSort(0, 11);
(27) end; { sort }
Глубина вложенности процедур:
sort |
1 |
readarray |
2 |
Exchange |
2 |
QuickSort |
2 |
PartExch |
3 |
Использование связей по доступу
Если в процедуре с глубиной вложенности Na требуется доступ к объекту, объявленному в процедуре с глубиной вложенности Nb (очевидно, что Na>Nb), то
1. (Na-Nb) раз выполняется цикл выборки указателей на записи активации (связей по доступу)
2. Полученный указатель (базовый адрес записи активации) складывается со смещением объекта
Дисплей – глобальный массив – модифицируется в моменты передачи и возврата управления между процедурами.
При входе в процедуру та часть дисплея, которая соответствует большей или равной глубине вложенности сохраняется в куче или стеке. На верхушку дисплея заносится указатель на собственную запись активации.
Перед выходом (возвратом) состояние дисплея
восстанавливается из стека (кучи).
Динамический доступ к нелокальным объектам
Глубокий доступ: реализуется путем движения по связям по управлению и просмотра таблиц имен объектов (таблиц идентификаторов) процедур, которые транслятором с такого языка сохраняются в области локальных данных записи активации.
Мелкий доступ: значения всех объектов с их именами (глобальная таблица идентификаторов) хранятся в статической области. При входе в процедуру значения всех ее локальных объектов переносятся из глобальной таблицы в область локальных данных, перед любым выходом (вызовом другой процедуры или возвратом) – копируются в глобальную таблицу.
Семантический анализатор создает дополнительные операции (тетрады) для:
1. Создания записи активации (в том числе – локальных данных и не объявленных в исходной программе переменных, предназначенных для хранения промежуточных результатов вычислений) каждой вызываемой процедуры и установления ее связей с записями активации других процедур.
2. Обеспечения доступа из процедур к нелокальным для них объектам (управление дисплеем при реализации текстуальной видимости, перемещение данных при мелком и поиск при глубоком доступе, если реализуется динамическая видимость).
3. Преобразования значений данных к типу, требуемому для выполнения операций.
4. Перемещения обрабатываемых значений в ту память, которая непосредственно доступна для выполнения операции (например – регистры процессора), и результатов вычислений обратно в основную память.
5. Уничтожения записи активации (в том числе локальных объектов) процедуры в момент возврата из нее.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.