Cтраница 4
Имя SUB вносится в динамическую таблицу имен подпрограмм. В нашем примере X и Y - это имена формальных параметров, a U и V - имена локальных переменных. Имя подпрограммы, SUB, также служит локальной переменной, значение которой возвращается в качестве результата подпрограммы. Когда во время выполнения программы вызывается подпрограмма SUB, центральная таблица цепочек таким образом модифицируется, чтобы учесть нужную для выполнения SUB среду ссылок. Сначала следует сохранить существующие на данный момент в центральной таблице значения цепочек SUB, X, Y, U и V. Они сохраняются ( вместе с точкой возврата и другими системными данными) в виде активацион-ной записи в скрытом стеке. Затем в центральную таблицу заносятся новые значения для всех этих цепочек. [46]
Управление последовательностью действий в Сноболе 4 очень простое. Широко используются выражения, определяющие цепочки, числа и образцы. Инструкции могут быть помечены, при этом каждая инструкция содержит поле перехода, с помощью которого можно явно указать преемника данной инструкции в случае ее успеха или неудачи. Инструкция может завершиться успешно или неудачно по ряду причин; чаще всего это зависит от успеха или неудачи операции сопоставления с образцом. Простой механизм рекурсивных вызовов и возвратов позволяет передавать управление подпрограммам. Операция обработки ссылки основана на правиле последней ассоциации и использует центральную таблицу среды ссылок. [47]
В каждый элемент таблицы, соответствующий локальному для Q идентификатору, следует внести изменения с тем, чтобы включить новую локальную ассоциацию для Q. Так как элементы, требующие модификации, вероятно, разбросаны по центральной таблице, модификация должна выполняться поэлементно. При выходе из Q ассоциации, деактивированные и сохраненные при входе в нее, должны быть восстановлены в таблице и активированы. Вновь, как и в прежних методах моделирования, во время выполнения нужен стек, но теперь он используется как скрытый стек для сохранения деактивирован-ных ассоциаций. Для каждого локального идентификатора, ассоциация которого изменяется при входе в Q, старая ассоциация запоминается в блоке скрытого стека. При выходе из Q верхний блок ассоциаций стека вновь записывается в соответствующие позиции центральной таблицы. Этот метод моделирования с использованием центральной таблицы изображен на рис. 6.7. Использование центральной таблицы имеет еще одно преимущество, если язык не допускает генерацию новых ссылок во время выполнения. Тогда, как и ранее в случае локальных таблиц, можно исключить из таблицы сами идентификаторы: поскольку идентификаторы никогда не используются, их заменяет вычисление базовый адрес смещение. В некотором смысле идентификаторы во время выполнения представлены просто своим смещением в таблице. [48]
Каждый элем-ент центральной таблицы ц поч-ек содержит саму цепочку и указатель на ее значение. Когда во время выполнения программы создается новая цепочка, центральная таблица просматривается, чтобы выяснить, не была ли эта цепочка ранее внесена в таблицу. Если была, то используется указатель на найденный элемент таблицы. Эта простая схема вносит в язык значительную гибкость; она позволяет во время выполнения создавать при желании новые переменные. Ее недостаток заключается в стоимости поиска по таблице каждый раз, когда создается новая цепочка. Поскольку многие инструкции Снобола 4 создают новые цепочки, поиск по таблице происходит часто. Обычным представлением для центральной таблицы является хеш-таблица с дополнительным пространством для обработки коллизий. [49]
В каждый элемент таблицы, соответствующий локальному для Q идентификатору, следует внести изменения с тем, чтобы включить новую локальную ассоциацию для Q. Так как элементы, требующие модификации, вероятно, разбросаны по центральной таблице, модификация должна выполняться поэлементно. При выходе из Q ассоциации, деактивированные и сохраненные при входе в нее, должны быть восстановлены в таблице и активированы. Вновь, как и в прежних методах моделирования, во время выполнения нужен стек, но теперь он используется как скрытый стек для сохранения деактивирован-ных ассоциаций. Для каждого локального идентификатора, ассоциация которого изменяется при входе в Q, старая ассоциация запоминается в блоке скрытого стека. При выходе из Q верхний блок ассоциаций стека вновь записывается в соответствующие позиции центральной таблицы. Этот метод моделирования с использованием центральной таблицы изображен на рис. 6.7. Использование центральной таблицы имеет еще одно преимущество, если язык не допускает генерацию новых ссылок во время выполнения. Тогда, как и ранее в случае локальных таблиц, можно исключить из таблицы сами идентификаторы: поскольку идентификаторы никогда не используются, их заменяет вычисление базовый адрес смещение. В некотором смысле идентификаторы во время выполнения представлены просто своим смещением в таблице. [50]