Т. Пратт, М. Зелковиц - Языки программирования - разработка и реализация (4-е издание_ 2002) (1160801), страница 111
Текст из файла (страница 111)
(Термины нелокальнлтй и глобальный часто используются как взаимозаменяемые для обозначения любой ссылки, не являкпцейся локальной,) Псевдонимы для объектов данных В течение своего времени жизни объект данных может иметь более <<диого имени (то есть может существовать несколько ассоциаций в разных средах ссылок, каждая из которых по-разному именует объект данных). Например, когда обьект данных предается по ссылке (раздел 9.3) в некоторую подпрограмму как ее параметр, в атой подпрограмме на него можно ссылаться с помощью имени соответствующего формального параметра, и в то же время он сохраняет свое первоначальное имя в вызывающей программе. С лругой стороны, объект данных может стать компонентом нескольких объектов ланных через организацию связи при помощи указателей и, таким образом, иметь несколько составных имен, которые можно исполь- 402 Глава 9.
Управление подпрограммами зовать для доступа к нему. Почти все языки программирования предлагают разнообразные способы задания различных имен для одного и того же объекта данных. Когда обьект данных видим в одной среде ссылок и имеет це одно имя (!!ростов или составное), то каждое из этих имен называется псевдо)тимом' для этого объекта данных. Если объект данных имеет несколько имен, но в каждой среде ссылок, в которой он появляется, у него только одно имя, то никаких проблем не возникает.
Но возможность ссылки на один и тот же объект в одной п той же среде ссылок с использованием разных имен приводит к серьезным проблемам как лля пользователя, так и для разработчика языка. В листинге 9.2 приведены две программы на языке Разов), в которых целочисленная переменная в различных местах программы имеет два имени — д и 1. В первой программе использование псевдонимов не встречается, так как ни в какой момент выполнения оба имени д н 1 нс могут использоваться в одной и той же подпрограмме. Во второй программе в подпрограмме 5ыЫ имена 1 и д являются псевдонимами для одного и того же объекта данных, так как 1 передается по ссылке в подпрограмму 5оЫ, где оно становится связанным с именем д, но в то же время 1 также видимо в подпрограмме 5ыЫ как нелокальное имя. Листинг 9.2.
Использование псевдонимов в программе на языке Рааса!; а — без пседвонммов, б — )и д являются псевдонимами в Зоб! л) ргодгав пати(оытрнт): ргаседыге 5оЫ (чаг д тптедег), Ьедтп ( д видиио, 1 невидные ) епо ргоседыге 5ыЬ2. чаг 1: ютедег, Ьедти 5оЫ(!); ! ! видино, д невидиио ) евт Ьедти 5ыЬ2 (Оса ииени невидины) епо Л) ргодгав ватп(о!ттрыт): чаг 1: тптедег. ргоселоге 5оЬ!(чаг д !птедег), Ьедтп 1 ! и д ссылаются на один и тот не печек! данных ) епя ргасет)ыге 5оЬ2; Ьедтп 5нЬЦ 1); 1 1 видимо.,1 невидима ) епо, Ьедти В ли тсратурс псевдоним ~тпогла называется термином «ах нас нос иытя«(от англ а1 )аа).
— Примеч науч. рад, 9.2. Атрибуты управления данными 403 5оЬ2 ( 1 вивиио. о невивиио ) еоо. Использование псевдонимов создает трудности для программиста, поскольку затрудняет понимание программы. Например, если в программе вы встретите следующую последовательность операторов: Х =А+В; У .= С ~ Р; то присваивания переменным Х и У, очевидно, независимы друг от друга и могут быть расположены в любом порядке; если переменная Х далее в программе вообще не используется, то первое присваиванне можно полностью удалить. Однако предположим, что Х и С явля ются псевдоггимами шгя одного и того же объекта данных.
Тогда этн операторы присваивания явля!отея взаимозависимыми, и попытка поменять их местами или удалить первый оператор приведет к трудно обнаруживаемой ошибке. Возможность использования псевдонимов усложняет верификацию программы, так как ни о каких двух переменных нельзя с уверенностью сказать, что они заведомо ссылаются на разные объекты данных. Кроме того, исполь:ювап не псевдонимов вызывает юхалогичные проблемы и для разработчика.
Частью процесса оптимизации прохраммного кода во время трансляции является реорганизация или удаление ненужных шагов вычислений. Если допускается использование псевдонимов, эта часть оптимизации становится невозможной без дополнителыпэй проверки того, что два фрагмента вычисления, внешне совершенно независимых друг от друга, не связаны между собой через псевдонимы. Из-за описанных проблем, вызываемых использованием псевдонимов, в некоторых новых языках иногда предпринимаются попьпки ограничить или вовсе запретить те свойства, которые позволяют создавать псевдонимы. Пример 9.1. Ссылки на переменные в языке Рааса! В листинге 9.3 приведена простая программа на языке Рааса! с помеченной средой ссылок для каждой подпрограммы. Обратите внимание на то, что каждый из иденти! фикаторов А, С и В объявлен в двух местах.
Идентификатор А является именем формального параметра в 5001, а также объявлен как имя переменной в главной программе. Идентификатор С является именем формального параметра в 50В2 н также именем переменной в главной программе. 0 является именем локальной переменной в обеих подпрограммах 50В1 и 50В2. Тем не менее в каждой среде ссылок видимой является только одна ассоциация для каждого нз этих имен. Так, в подпрограмме 50В2 видимой является локальная ассоциация дпя С, а глобальная ассоциация для С в главной программе скрыта.
В операторе С: = С + В подпрограммы 50В2 используется локальная ссылка на переменную С и глобальная ссылка на переменную В, объявленную в главной программе. Среда предопределенных ссылок здесь не показана. В языке Рааса! она состоит из постоянных типа МЛХ1(хТ (максимально допустимое целое значение) и подпрограмм типа геа0, нг!те и вцгт. Для каждого из этих предопределенных имен можно создать новую ассоциацию при помощи явного объявления и, таким образом, сделать невидимой предопределенную ассоциацию для части программы.
404 Глава 9. Управление подпрограммами Листинг 9.3. Среды ссылок в программе на языке Раэса1 ргодгия латп. чаг А, В. С геа1: ргосепыге 5ыЬПА геа11: чаг О. геа1. ргосепыге 5ыЬ2 (С.геа1 Н чаг О, геа1. Ьесп п - Операторы С :" С+В. — Операторы епо' Ьед1 и - Операторы 5иЬ2(В). — Операторы епп, Ьед1п — Операторы 5ыЫ(АН вЂ” Операторы епп Среда ссьвток для 5ыЬ2 Локалвные С. О Нелокалвные А. 5ыЬ2 в 5ыЫ В, 5оЫ в латп Среда ссылок для 5ыЫ Лоналвные А. О, 5оЬ2 Нелокалвные В, С, 5оЫ в латл Среда ссылок для ва!и Локалвные А, В, С. 5оЫ 9.2.2.
Статическая и динамическая области видимости Динамическая область еидинослти ассоциации для идентификатора, как было сказано в предыдущем разделе, представляет собой то множество активаций подпрограмм, в которых эта ассоцищ1ия является видимой во время выполнения программы. Динамическая область видимости ассоциации всегда включает в себя активацито подпрограммы, в которой эта ассоциация была создана как часть среды локальных ссылок. Опа также может быть видимой как нелокальная ассоциация в активациях других подпрограмм. Правило динамической области оидииостпи определяет дшщмнческую область видимости каждой ассоциации в терминах динамических изменений, возникающих прн выполнении программы.
Например, типичное правило динамической области видимости утверждает, что область видимости ассоциации, созданной во время активации подпрограммы Р, включает не только саму эту активацию, по и любую активацшо подпрограммы, вызванной подпрограммой Р илн подпрограммой, вызванной подпрограммой Ри т. д., до тех пор, пока активация вызванной позже подпрограммы не определит новую локальную ассоциацию для идентификатора, которая скроет исходную активацию. С помощью этого правила динамическая область видимости ассоциации связывается с диттамиттеской цепью активаций подпрограмм, описанной в разделе 9.1.2. Когда мы смотрим на текст программы, то замечаем, что организация ассоциации ссылок на идентификаторы с конкретными объявлениями или определениями смысла этих идентификаторов также представляет некоторую проблему. Например, в листинге 9.3 ссылки на имена В и С в операторе присваивания С:= С ч В в подпрограмме 5ОВ2 должны быть связаны с конкретными объявлениями имен С и В как переменных или формальных параметров.
Но какими объявлениями? Каж- 9.2. Атрибуты управления данными 405 дое объявление или другое определение идентификатора в пределах текста программы имеет определенную область видимости, называемую его статической областью видимости, Для простоты будем считать, что термин объявление используется здесь для ссылки па объявление переменных, определение подпрограммы, определение пользовательского типа данных, определение константы или другие средства определеиия смысла для конкретного идентификатора, встречаюШегося в тексте программы.
Объявление создает в тексте программы ассоциацию между идентификатором и некоторой информацией об объекте данных или о подпрограмме, именем которого или которой и будет служить данный идентификатор во время выполиепия программы. Статическая абласгпь видимости объявления — это та часть текста программы, где использование идентификатора является ссылкой иа это конкретное объявление идентификатора. Правило статической области видимости — это правило для определения статической области видимости объявления.
В языке Разса!, например, правило статической области видимости используется для определения того, что ссылка иа переменную Х в подпрограмме Р отсылает к объявлению переменной Х в начале подпрограммы Р, а если такого объявления там иет, то к объявлению Х, расположеииому в начале подпрограммы В, содержащей подпрограмму Р ит.д. Правила статической области видимости сопоставляют ссылки с объявлениями в тексте программы; правила динамической области видимости сопоставляют ссылки с ассоциациями для имен во время выполнения программы.
Как должны быть связаны эти правила? Очевидпо, что они должны быть согласованы друг с другом. Например, если правила статической области видимости в языке Разса! сопоставляюг ссылку иа переменную В в операторе С: = С + В (см. листинг 93) с объявлением имени В в главной программе, то правила дииамической области видимости также должны сопоставить ссылку иа В во время выполнеиия программы с объектом данных, названным В в гзгавиой программе.