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

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

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

            Псевдонимы – два или более имен для одного и того же объекта данных. В рамках данной работы следует обнаружить возможность использования псевдонимов в двух случаях:

-  подпрограмма может иметь доступ к объекту данных, переданному как фактический параметр по ссылке, через нелокальное имя;

-  один и тот же объект данных может быть передан по ссылке в двух или более позициях одного и того же списка фактических параметров.

6.  Рекомендации по методике проектирования

Структуры данных, с которыми должна работать и которые должна формировать проектируемая программная система, условно можно разбить на два класса: внешние и внутренние. Ко внешним данным отнесем те, что доступны внешнему пользователю системы: на входе – текст исходной программы и указание способа формирования области видимости символических имен; на выходе – представленная в соответствии с вариантом задания информация о видимых именах на этапе компиляции и на этапе выполнения исходной программы.

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

Таблица блоков в такой системе структур данных должна рассматриваться  как основная, с помощью которой остальные таблицы разбиваются на подтаблицы – по одной для каждого блока. Формат записи таблицы блоков может иметь вид:

Имя блока (ключ)

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

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

В таблицах имен полем ключа является поле символического имени; остальные поля записи таблицы имен могут содержать данные о типе имени (например: переменная, параметр, функция; если переменная – какого типа; если параметр – как передается и т.д.).

Таблица исполняемых кодов, или точнее – массив кодов, может быть организована в виде массива строк, каждая из которых является исполняемым оператором исходной программы.

Принадлежность фрагментов таблицы имен и массива исполняемых кодов отдельным поименованным блокам, как уже говорилось выше, указывается в таблице имен блоков, например, - в виде диапазонов значений индексов элементов, соответственно, таблицы имен и массива исполняемых кодов.