0092 - Основные концепции языков программирования - Нелокальная ссылка представляется упорядоченной пар...

Роберт У. Себеста. Основные концепции языков программирования. 2001

 Роберт У. Себеста 
.  Основные концепции языков программирования 
. 2001
. 
. Вильямс
. 
. Книга, ставшая бестселлером в США, посвящена всестороннему обсуждению основных концепций языков программирования. Автор описывает фундаментальные понятия программи
Название: 
Основные концепции языков программирования
Автор: 
Роберт У. Себеста
Год: 
2001
Издательство: 
Вильямс
Описание: 

Книга, ставшая бестселлером в США, посвящена всестороннему обсуждению основных концепций языков программирования. Автор описывает фундаментальные понятия программирования на примере вопросов разработки различных языковых конструкций, подвергая критическому анализу их реализацию в широком спектре языков программирования, таких как FORTRAN, PASCAL, PL/1, C, C++, Ada, Java, Smalltalk, Eiffel и LISP. Материал книги охватывает все парадигмы программирования, начиная с функциональной и заканчивая объектно-ориентированной, и, несомненно, представляет интерес и как учебник по современным методологиям.

Нелокальная ссылка представляется упорядоченной парой целых чисел . Нелокальную переменную можно удобно и быстро адресовать, дважды выполнив косвенную адреса цию, основанную на смещениях. При каждом вызове подпрограммы и возврате из нее необходимо изменять содержимое индикатора, чтобы отражать новое состояние областей видимости. Теперь мы исслегем действия, которые следует выполнять для поддержания работы индикатора. Предположим, что параметры не могут быть именами подпрограмм и передаваться по имени. Эти более сложные случаи рассматриваются в разделе . Смещение индикатора зависит только от статической глубины процедуры, в которой . Если статическая глубина процедуры . Индексы индикатора отсчитываются от нуля, причем левая позиция используется для доступа к переменным, объявленным во внешней об. Указатель на позицию к в индикаторе адресует экземпляр активационной записи процедуры, имеющей статическую глубину, равную к. При вызове процедуры Р, имеющей статическую глубину, равную к, индикатор следует модифицировать, выполнив следую. Сохранить копию указателя, записанного в к. Поместить связь с экземпляром записи активации процедуры Р в к. При завершении работы подпрограммы указатель, сохраненный в экземпляре записи :тнвации завершенной подпрофаммы, следует вернуть в индикатор. с . Реализация подпрофамм на языках, подобных языку . . поскольку они обе имеют статическую глубину, равную . Состояние стека и индикатор непосредственно перед вызовом и сразу после него показаны на рис. ЭЗА . Изменение индикаторов, соответствующих вызывающей и вызываемой подпрограммам одинаковой статической глубины . Реализация подпрофамм . Новая среда ссылок содержит только подпрофаммы . Поскольку значения статической глубины подпрофамм . Это означает, что их смещения в индикаторе должны быть равными. Поскольку индикаторные связи всегда хранятся в новом экземпляре активационной записи, никаких проблем не возникает. Следовательно, элемент индикатора, соответствующий подпрофамме . должен быть удален, и на его место должен быть записан новый элемент индикатора, соответствующий подпрофамме . В данном случае он является вторым элементом индикатора в соответствии со статической глубиной подпрофаммы . После того как подпрофамма . Непосредственно перед удалением экземпляра активационной записи процедуры . Второй случай может возникнуть, если подпрограмма . Статическая глубина подпрофаммы . Состояние стека и дисплея непосредственно перед вызовом и сразу после него показаны на рис. ЭЗА . Изменение индикатора в ситуации, когда статическая гчубина вызывающей подпрограммы меньше статической глубины вызываемой подпрограммы . Таким образом, в индикатор можно просто добавить новый казатель. В этом конкретном примере нет необходимости сохранять в экземпляре актизационной записи существующий указатель, записанный в индикаторе на месте, предназначенном для нового указателя. Однако в общем случае это неверно. В других ситуаци ях это делать необходимо. Намного проще каждый раз сохранять существующий указа тель, чем определять при каждом вызове подпрофаммы, следует ли это делать. В качес . Реализация подпрофамм на языках, подобных языку . Допустим теперь, что подпрофамма . Это пример ситуации, при которой статическая глубина вызывающей подпрофаммы меньше, чем вызываемой. В этом случае указатель, соответствующий подпрофамме . Обе эти подпрофаммы имеют статическую глубину, равную . Следовательно, существующий в индикаторе указатель следует сохранить перед тем, как на его место будет помещен новый указатель. Правильное состояние стека и индикатора при выполнении подпрофаммы . Третий случай . Статическая глубина процедуры . Состояния стека и индикатора непосредственно перед вызовом и сразу после него показаны на рис. В данном случае оказывается, что два элемента индикатора, соответствующие подпрофаммам . должны быть временно удалены, поскольку они не принадлежат среде ссылок подпрофаммы . Однако в действительности должен быть удален только один из этих указателей, соответствующий подпрофамме . Указатель, соответствующий подпрофамме . Ссылки на переменные в подпрофамме . Таким образом, можно совершенно спокойно оставить этот указатель в индикаторе. Компилятор не будет генерировать код, имеющий доступ к элементам индикатора, находящимся выше элементов, соответствующих текущей активной подпрофамме. . Реализация подпрофамм . Состояние стека и индикатора перед тем, как подпрограмма . Состояние стека и индикатора посче того, как подпрограмма . Изменение индикатора в ситуации, при которой вызывающая подпрограмма имеет большую статическую глубину, чем вызываемая подпрограмма . Реализация подпрофамм на языках, подобных языку . Хранение переменных, объявленных в блоке, в случае, когда блоки не рассматриваются как процедуры без параметров . Реализация методов динамического обзора данных Существуют, по крайней мере, два вида доступа к нелокальным переменным в языках с динамическим обзором данных. Отметим, что ни глубокий, ни теневой доступ не связаны с понятиями глубокого и теневого связывания. Основное отличие между связыванием и доступом здесь состоит в том, что глубокое и теневое связывания приводят к разным с точки зрения семантики результатам, а глубокий и теневой доступ — нет. . Реализация подпрофамм . Глубокий доступ Когда профамма на некотором языке с динамическим обзором данных обращается к локальной переменной, можно выполнить поиск объявления этой переменной в других .