Cтраница 2
Ссылки в Фортране могут быть либо локальными, либо гло бальными; промежуточные уровни нелокальных ссылок не предусмотрены. Все идентификаторы должны быть описаны ( явно или неявно) в программе. Эти структуры позволяют определять среду ссылок для каждой подпрограммы во время трансляции и эффективно управлять этой средой во время выполнения практически без Каких-либо накладных расходов. [16]
Рассмотрим сначала правило последней ассоциации для нелокальных сред / Предположим, что подпрограмма Q, содержащая нелокальную ссылку на X, передается подпрограммой Р подпрограмме R в качестве параметра. После этого R вызывает Q, используя соответствующий формальный параметр. Предположим также, что и в Р, и в R есть локальная ассоциация для X. [17]
Если Q вызывает R, и в Q есть ассоциация для X, то при появлении в R нелокальной ссылки можно было бы использовать эту ассоциацию. Если в Q нет ассоциации для X, то мы выполняем поиск по цепи вызовов в обратном направлении, пока не найдем какую-нибудь подпрограмму, имеющую ассоциацию для X. Эта структура соответствует той точке зрения, что при вызове подпрограммы ассоциация идентификатора в вызывающей программе деактивируется только в том случае, когда тот же идентификатор содержится в локальной среде вызываемой подпрограммы. Полная среда ссылок каждой подпрограммы, таким образом, состоит из ее локальной среды плюс полная среда вызывающей программы, в которой деактивированы ассоциации, приводящие к противоречию. [18]
![]() |
Стек таблиц среды при выполнении Р (. [19] |
Чтобы сделать этот метод моделирования полным, необходимо во время выполнения знать статическую структуру блоков, чтобы можно было воспользоваться ею для управления обработкой нелокальных ссылок. [20]
Если нелокальные ассоциации явно описываются в каждой подпрограмме, то обычно транслятор ( или чаще связывающий загрузчик) собирает все ассоциации в одну центральную таблицу, причем нелокальные ссылки в каждой подпрограмме во время загрузки изменяются таким образом, чтобы происходило обращение к этой таблице. В тех случаях, когда элемент программы или данных, являющийся объектом ассоциации, уже известен во время загрузки ( например, блок команд подпрограммы), можно устанавливать ссылки непосредственно на программный объект или объект данных, минуя таблицу ассоциаций. Процесс трансляции, особенно загрузка и редактирование связей независимо транслируемых программ, становится более сложным из-за необходимости собирать и объединять нелокальные ассоциации, явно декларированные в каждой подпрограмме. Однако во время выполнения программы обработка ссылки совершенно тривиальна, а поскольку нелокальная среда одна и та же для всех подпрограмм, нет нужды заменять нелокальную среду при передачах управления между подпрограммами. [21]
В обоих языках для нелокальных ссылок используется правило последней ассоциации. Считая, что для моделирования обработки нелокальных ссылок используется метод центральной таблицы, опишите, как введение новых идентификаторов влияет на структуру и использование центральной таблицы. [22]
Такой метод был применен в Алголе, а позже - в ПЛ / I и других языках. Если мы требуем, чтобы для - - нелокальных ссылок была возможна статическая ( выполняемая во время трансляции) проверка типов, то каждой нелокальной ссылке во время трансляции должна однозначно сопоставляться некоторая декларация. Чтобы найти средства для такого сопоставления, нам придется обратиться к синтаксическому представлению семейства подпрограмм ( и блоков) и ввести понятие синтаксической вложенности определений подпрограммы. [23]
В ПЛ / I нет специальных конструкций для осуществления ссылок внутри программ прерываний, кроме некоторых встроенных функций для доступа к данным, которые связаны с причиной прерывания. Программа прерывания не может иметь параметров, а на нелокальные ссылки распространяются те же правила, которые регулируют нелокальные ссылки-для обычных подпрограмм. Работа с задачами и параллельное выполнение создают более сложные проблемы. В ПЛ / I задача всегда определяется как подпрограмма и ссылки подчиняются тем же правилам, которые действуют в обычных подпрограммах. Одна ко инициация выполнения подпрограммы как задачи приводит к появлению разветвления в стеке записей активаций, существующем во время выполнения программы. [24]
К такому языку, как Алгол, в котором обработка нелокальных ссылок основана на статической блочной структуре, метод центральной таблицы среды ссылок из разд. Лисп или Снобол 4, в которых для обработки нелокальных ссылок применяется правило последней ассоциации. [25]
Такой метод был применен в Алголе, а позже - в ПЛ / I и других языках. Если мы требуем, чтобы для - - нелокальных ссылок была возможна статическая ( выполняемая во время трансляции) проверка типов, то каждой нелокальной ссылке во время трансляции должна однозначно сопоставляться некоторая декларация. Чтобы найти средства для такого сопоставления, нам придется обратиться к синтаксическому представлению семейства подпрограмм ( и блоков) и ввести понятие синтаксической вложенности определений подпрограммы. [26]
В обоих языках для нелокальных ссылок используется правило последней ассоциации. Считая, что для моделирования обработки нелокальных ссылок используется метод центральной таблицы, опишите, как введение новых идентификаторов влияет на структуру и использование центральной таблицы. [27]
В языках из части II рассмотренные методы, а также различные их модификации применяются в самых разных вариантах. Разумеется, не существует общепринятого соглашения о наилучшем методе обработки нелокальных ссылок. Рассмотрим три основных метода: ( 1) явное задание нелокальных ассоциаций, ( 2) неявную нелокальную среду с использованием последней ассоциации и ( 3) неявную нелокальную среду с использованием статической блочной структуры. [28]
Заметим, что оба метода моделирования, требующие поиска, являются прямым продолжением основных методов моделирования локальной среды, рассмотренных в предыдущем разделе. Таблицы локальных сред помещаются на стек или располагаются вместе с командами подпрограммы, и при обработке нелокальной ссылки эти таблицы анализируются в порядке, обратном порядку вызовов. [29]
Преимущество явного задания состоит в простоте моделирования, поскольку определяется только одна глобальная среда. Кроме того, явное задание, веооятно, обеспечивает хо рошую защиту от ошибок, поскольку ссылки, которые не являются ни локальными, ни явно заданными нелокальными, могут быть обнаружены во время трансляции. С другой стороны, метод явного задания менее гибок в том смысле, что допускается только один уровень нелокальных ссылок. Кроме того, может потребоваться значительное количество дополнительных деклараций, если широко используются нелокальные ссылки. [30]