Т. Пратт, М. Зелковиц - Языки программирования - разработка и реализация (4-е издание_ 2002) (1160801), страница 110
Текст из файла (страница 110)
Ситуация станет еще сложнее, если идентификатор 1' используется в разных частях программы для обозначения различных объектов. Какое из определений у следует использовать в данном месте программы? В двух словах, центральная проблема управления даннгями — зто проблема определения того, что означает у при каждом выполнении такого оператора присваивания. Поскольку У может быть как локальной, так и пе локальной переменной, зта проблема включает в себя то, что известно как области видимости для объявленных имен, Поскольку 1 может быть формальным параметром, имеют значение способы передачи параметров; а так как г может быть именем подпрограммы, не имеющей параметров, — то и механизмы возврата результатов из подпрограмм.
В следующем подразделе мы сначала обсудим, что собой представляют перечисленные задачи, а в разделе 93 более подробно опишем методы их реализации. 9.2.1. Имена и среды ссылок Существует два способа, с помощью которых обтскт данных можно сделать доступным в качестве операнда некоторой операции. + Неносредстоепная передача. Объект данных, вычисленный в определенной точке программы как результат выполнения некоторой операции, может быть непосредственно передан другой операции в качестве сс операнда (например, результат умножения 2 х 7 непосредственно передастся в качестве операнда операции сложения воператоре х:= г ~ 2 х 2). В этом случае объект данных временно располагается в памяти на все время его жизни и может даже никогда пс получить имени. + Ссьыка через ичеяоепя ныл обьект данпы г Прн создании объекта данных ему может быть присвоено нмя, которое затем используется для указания того, что этот объект является операндом некоторой операции. С другой стороны, объект дапнгях может быть компонентом некоторого другого объекта, имеющего имя, так что имя этого более крупного объекта может быть использовано совместно с операцией выбора для указания исходного объекта данных как операнда какой-либо операции.
Непосредственная передача используется для управления данными в выражениях, но для управления данными вне выражений в большинстве случаев исполь- 9,2. Атрибуты управления данными 399 зуются имена объектов данных и ссылки на них. Определение того, какой объект скрывается под некоторым именем, является центральной проблемой управления данными.
Элементы программы, которые могут иметь имена Какие типы имен можно встретить в программах? В каждом языке они свои, но существуют некоторые общие для многих языков категории типов имен, перечисленные ниже: 1) имена переменных; 2) имена формальных параметров; 3) имена подпрограмм; 4) имена тинов данных, определяемых программистом; 5) имена констант; 6) метки операторов (имена для операторов); 7) имена исключений; 8) имена элементарных операций (например, +, *, 56йт); 9) имена буквальных констант (например, 17, 3 25). Здесь мы в основном будем заниматься первыми тремя категориями имен— именами переменных, формальных параметров и подпрограмм.
Что касается остальных категорий, то большинство ссылок на имена этих групп разрешаются во время трансляции программы, а це во время ее выполнения, как уже говорилось ранее. Если разобраться в основных идеях, лежащих в процессе у правления данными для первых трех категорий, то распространить их на остальные категории не представляет большого труда. Имя, относящееся к любой из перечисленных категорий, называется простым именеэь Составное имя — это имя компонента некоторой структуры данных. Оно записывается как простое имя, обозначаюшее всю структуру целиком, за которым следует последовательность одной или более операций выбора, которые выбирают конкретный элемент данной именованной структуры.
Например, если А — это имя массива, то А является простым ил~енсы, а АГЗ) — составное имя. Составные имена могут быть достаточно сложными (например, АГЗ) .51аээ(2]. лооп). В больпшнстве языков простые имена представлены идентификаторами вида Х, 22, 5нЬ1, поатому термины «имя» и «идентификатор> являются взаимозаменяемыми. Ассоциации и среды ссылок К управлению данными по большей части опюсятся процедуры связывания идентификаторов (простых имен) с конкретными объектами данных и подпрограммами. Такое связывание называется ассоциацией и может быть представлено как пара, состоящая из идентификатора и связанного с ним объекта данных (или подпрограммы).
Во время выполнения программы мы можем наблюдать следуюшее. 1. В начале выполнения главной программы ассоциации идентификаторов связывают имя каждой объявленной в ~ ~ей переменной с конкретным об ьек- 400 Глава 9. Управление подпрограммами том данных, а каждое имя подпрограммы, вызываемой в главной программе, — с конкретным определением подпрограммы. 2. Когда выполняется главная программа, она вызывает операции обработки ссьиок для определения конкретного объекта данных или подпрограммы, ассоциированной с идентификатором. Например, для выполнения оператора присваивания А: В ~гв(В необходимо выполнить четыре операции обработки ссылок для получения объектов данных, ассоциированных с именами Я, В и С, и подпрограммы, ассоциированной с именем Гй. 3.
При вызове каждой новой подпрограммы для нее создается новое множество ассоциаций. Имя каждой переменной и каждого формального параметра, объявленных в подпрограмме, ассоциируется с определенным объектом данных. Также могут быть созданы новые ассоциации для имен подпрограмм. 4. Когда выполняется подпрограмма, она вызывает операции обработки ссылок для определения конкретного объекта данных или подпрограммы, ассоциированных с каждым идентификатором. Некоторые из этих ссылок могут быть ссылками на ассоциации, созданные при входе в подпрограмму, в то время как другие могут указывать на ассоциации, созданные ранее в главной программе.
5. Когда подпрограмма возвращает управление в главную программу, ее ассоциации уничтожаются (пли становятся неактивными). б. Когда управление возвращается в главную программу, выполнение продолжается, как и ранее, при этом используются первоначально созданные в начале выполнения главной программы ассоциации. В этом шаблоне создания, использования и уничтожения ассоциаций мы видим основные концепции управления данными. Среды ссылок. В каждой программе и поди рог рамме имеется множество ассоциаций идентификаторов, доступных для разрешения ссылок во время их выполнения.
Это множество ассоциаций идентификаторов назь1вастся средой ссылок подпрограммы (или программы). Среда ссылок подпрограммы обычно не меняется во время ее выполнения. Она устанавливается в момент создания активации подпрограммы и остается неизменной в течение всего времени жизни активации. Значения различных объектов данных могут меняться, но ассоциации имен с объектами данных и подпрограмм остаются неизменными. Среда ссылок подпрограммы может состоять из нескольких компонентов.
1. Среда локальных ссьиок (или просто локальная среда). Множество ассоциаций, созданных при входе в подпрограмму и представляющих формальные параметры, локальные псремешгые н подпрограммы, определенные только внутри этой подпрограммы, формирует среду локальных ссьыок этой активации подпрограммы. Значение ссылки на имя из локальной среды можно определить, не выходя за пределы активации подпрограммы. 2. Среди нелокальных ссылок. Множество ассоциаций для идентификаторов, которые могут использоваться в подпрограмме, но небыли созданы при входе 9.2. Атрибуты управления данными 401 в нее, называется средой нелокальных ссылок (или просто нелокальт<ой средой) подпрограммы. 3. Среди глобальных ссылок. Если ассоциации, созданные в начале выполнения главной программы, доступны для использования в подпрограмме, то они формируют среду глобальных ссылок (или просто глобальную сре<яу) этой подпрограммы. Среда глобальных ссылок является частью среды нелокальных ссылок.
4. Средапредопределеттт<ыхссылок. Для пекоторыхидентификаторовсуществует предопределенная ассоциация, которая задается непосредствешю в определении языка. Любая программа или подпрограмма может использовать подобные ассоциации без явного их создания. Видимость. Говорят, что ассоциация для идентификатора видима в подпрограмме, если она является частью среды ссылок лля атой подпрограммы. Существующая, но не входящая в среду ссылок выполняющейся в данный момент подпрограммыы ассоциация, называется скрытой от этой подпрограммы.
Часто ассоциация для идентификатора становится скрытой при входе в подпрограмму, которая переопределяет идентификатор, уже используемый где-то в программе. Динамическая область видимости. Кажлая ассоциация имеет динамическую областль видимости, которая ассоциируется с тем периодом выполнения программы, в течение которого она существует как часть среды ссылок. Таким образом, динамическая область видимости ассоциации состоит из множества активаций подпрограмм, внутри которых она видима. Операции обработки ссылок.
Операция обработки ссылки — это операция с сигнатурой: операция обработки ссылки идетттификатор х среда ссылок -т обкект данных ипи надира<ранна гле операция обработки ссыпки при заданных идентификаторе и среде ссылок находит соответствующую ассоциацию для этого идентификатора в этой среде ссылок и возвращает связанный с идентификатором объект ланных или определение полпрограммы. Локальные, нелокальпые и глобальные ссылки. Ссылка на илентификатор является локальной ссылкой, если операция обработки ссылки находит ассоциацию в локальной среде; сс ылка является недо кало<той или глобальттой ссьы кой, если ассоциация находится в нелокальяой или глобальной среде соответственно.