Cтраница 1
Обработка ссылок с использованием дисплея чрезвычайно проста. Применим несколько видоизмененное представление идентификаторов во время выполнения. [1]
![]() |
Среда ссылок в виде А-списка, содержащего ассоциации для L, Z. [2] |
Обработка ссылок в Лиспе строго подчинена правилу самой последней ассоциации, которое реализуется с помощью простого поиска по А-списку от начала ( самые последние ассоциации), к концу ( наиболее старые ассоциации) до тех пор, пока не будет найдена соответствующая ассоциация. [3]
![]() |
Упрощенные таблицы локальной среды и обработка ссылок в Фортране. [4] |
Операция обработки ссылки на локальные идентификаторы выполняется с использованием центрального стека во многом так же, как и в предыдущем методе. [5]
Используя это правило обработки ссылок, основанное на статической вложенности определений подпрограмм и блоков, мы всегда сможем во время трансляции сопоставить каждому идентификатору декларацию и, таким образом, избегнем проверки типов во время выполнения. Такая вложенность определений блоков и подпрограмм во время трансляции обычно называется статической блочной структурой программы. [6]
![]() |
Изменение дисплея при входе в подпрограмму. [7] |
Использование дисплея упрощает операцию обработки ссылки, однако вход и выход для подпрограмм при этом усложняются. Дисплей должен так изменяться при каждом входе и выходе, чтобы в любой момент отражать текущую активную статическую цепь. [8]
![]() |
Создание статической цепи при входе в программу. [9] |
Такое представление обеспечивает весьма простой алгоритм обработки ссылок. [10]
Указатели статической цепи служат основой простой схемы обработки ссылок. Обрабатывая ссылку на X, мы начинаем с текущей локальной среды на вершине стека. Если в локальной среде не найдено ассоциации для X, то мы переходим ко второй таблице согласно указателю статической цепи в исходной локальной таблице. Если и в этой таблице нет X, то мы продолжаем поиск, следуя указателям статической цепи, пока не найдем локальную таблицу, содержащую ассоциацию для X. [11]
В таких условиях может оказаться выгодным переложить часть расходов с операции обработки ссылки на операции входа в подпрограмму и выхода из нее. Эта цель достигается в описываемом ниже методе. [12]
Общее планирование подпрограмм, как было обнаружено в языках моделирования, вызывает наибольшие трудности при обработке ссылок. Любая подпрограмма может существовать одновременно во многих активациях, каждая из которых может находиться на разных стадиях выполнения. Окончание любой активат ии по ппогпнммы может произойти в ппоизволь-ный момент по отношению к другим активациям той же и других подпрограмм. Таким образом, не существует какого-либо правила вложенности вызовов и окончаний подпрограмм. Кроме того, активации подпрограмм могут приостанавливаться и возобновляться наподобие сопрограмм. [13]
Тогда типичная программа будет иметь структуру наподобие той, которая изображена на рис. 6.8. Затем мы применим сле-дующее правило обработки ссылок на нелокальные идентификаторы: нелокальный идентификатор в определении блока или подпрограммы ссылается на переменную, декларированную в самом внутреннем блоке ( или подпрограмме), физически содержащем данный идентификатор в тексте программы. [14]
После завершения прохода от вершины кучи к ее основанию этот процесс повторяется снова, на этот раз в противоположном направлении, для обработки возвращающих ссылок. При этом осуществляется перемещение активных ячеек. Как и прежде, работает счетчик активных ячеек, но на этот раз он используется для перемещения ячеек в их новое положение. Вначале значение счетчика равно А ( общее количество активных ячеек) и уменьшается на единицу после обработки каждого активного слова. [15]