Т. Пратт, М. Зелковиц - Языки программирования - разработка и реализация (4-е издание_ 2002) (1160801), страница 112
Текст из файла (страница 112)
В тексте программы может быть несколько объявлений для В, а во время выполнения программы — несколько объектов данных, названных В в различных активациях подпрограмм во время выполнения. Таким образом, поддержание созласован нос пи между правилами статической и динамической области видимости является ие слишком тривиальной задачей. Существует несколько способов ее решения, которые мы рассмотрим ниже. Важность статической области видимости. Предположим, что какой-то язык ие использует правила статической области видимости. Рассмотрим оператор нида Х:- Х + Ь1ах из какой-либо подпрограммы. Без использования правил статической области видимости во время трансляции ничего невозможно определить относительно имен Х и Мах.
Во время выполнения программы, когда очередь доходит до выполнения данного оператора, операция обработки ссьиок сначала должна найти соответствующие ассоциации для Х и г1ах, а затем должны быть определены тип и другие атрибуты имен Х и Мзх, Существуетли ассоциация для каждого идентификатора? Является ли Мах именем подпрограммы, именем перемеииой, меткой оператора, именем типа или именем формального параметра? Если Х вЂ” имя перемеипой, принадлежит ли эта переменная к такому типу, который можно складывать с Р1ах? На эти вопросы невозможно ответить, пока ие будет установлено, ссылкой иа какие объекты являются имена Х и Мах.
Более того, каждый раз при 406 Глава 9. Управление подпрограммами выполнении этого оператора весь процесс требуется повторить заново, поскольку ассоциации Х и Мах могли измениться с момента предыдущего выполнения оператс>ра. В языках !.(ЯР, ЯЛОВО!.4 и АР! правила статическс>й области видимости почти не используются. Таким образом, ссылка па любое имя в процессе выполненияя программ на этих языках вызь>вает инициирование довольно сложного и дорогостоящего процесса интерпретации, который сначала ищет соответствук>щую ассоциацию для указанного имени (если таковая вообще существует), а затем определяет тип и атрибуты ассоциированного с именем объекта данных или подпрограммы.
Правила статической области видимосги позволяют выполнить этот процесс для большинства ссылок на имена, встречающиеся в программе, только один раз во время трансляции, вместо того чтобы выполнять его многократно во время выполнения программы. Например, если в программе па языке Рааса! встречается оператор присваивания Х:= Х + Мах и где-то в программе нмя Мэх определяется как константа с помо>цью объявления сопз0 Мах = 30, то правила статической области видимости позволяют во время трансляции связать ссылку па Мах с этим (или каким-то другим) объявлением имени Мэх. Затем компилятор Рааса! может определить, что при выполнении нашего оператора присваивания значение Мах всегда равно 30, и оттранслировать оператор в исполняемый код, в котором к Х просто добавляется 30 без выполнения операции обработки ссылки для имени Мах.
Аналогично, если правила статической области видимости языка Раэса! позволяют связать ссылку на Х с объявлением Х геа! где-то в тексте программы, тогда компилятор Рааса! может выполнить статическую проверку типов, то есть он может определить, что при выполнении этого опсратора: 1) будет существовать ассоциация, связывающая имя Х и некоторый объект данных; 2) этот объект данных будет относиться к типу вещественных чисел (геэ! ); 3) его значение будет типом, который можно использовать в качестве аргумента операции сложения.
Из объявления Х компилятор ис сможет определить пи жесгдополажение в памяти обьскта данных, на который ссылается нмя Х (поскольку местоположение определяется динамически во время выполнения программы и может быть различным для различных случаев выполнения оператора), ни значение Х (поскольку оно также определяется динамически во время выполнения программы). Тем не менее статическая проверка типов позволяет значительно ускорить выполнение программы и повысить надежное>п ес работы (поскольку во время трансляции ошибки определения типов отслеживаются для всех ветвей программы). Правила статического определения области видимости позволяют установить много разных типов связей между ссылками на имена и их объявлениями во время трансляции. Два из них были упомянуты ранее: связывание имени переменной с объявлением переменной и связывание имени конста»ты с ее объявлением. К другим типам связей с>тносится связывание имен типов с объявлениями типов, связывание формальных параметров со спецификациями формальных па)>аметров, связывание вызовов подпрограмм с объявлениями подпрограмм и связывание меток операторов, используемых в операторах 0о0о, с метками конкретных опе- 9.2.
Атрибуты управления данными 407 раторов. В каждом из этих случаев во время трансляции могут бьп ь сделаны многочисленные упрощения, которые повысят эффективность выполнения программы. Правила статической области видимости также важны для программиста при чтении программы, поскольку они позволяют связать имя, используемое в программе, с объявлением для этого имени без необходимости отслеживать процесс выполнения программы.
Например, правила статической области видимости языка Разса! позволя>от связать ссылку на переменную 11 в каком-либо операторе с расположенным где-то в программе объявлением >> без какого-яибо анализа последовательности вызовов подпрограмм, начиная с главной программы и заканчивая выполнением данного оператора. Таким образом, правила статической области видимости упрощают понимание программы. 9.2.3. Блочная структура Концепция блочной структуры, используемая в блочно-структурировонн>ях языках Разса!, Р1 У1 и Ас1а, заслуживает специавьного упоминания. Программы, написанные па блочно-структурированных языках, имеют характерну>о структуру и соответствующий набор правил статической области видимости.
Впервые вти понятия появились в языке АБООБ 60 — одном из наиболее важных ранних языков программирования. Благодаря своей элегантности и влиянию на эффективность реализации онп были приняты и в других языках. В блочно-структурированном языке каждая программа или подпрограмма организована как множествс> вложенных блоков. Главной характеристикой> блока является то, что он вводит новук> среду локальных ссылок.
Блок начинается с множества объявлений имен (объявления переменных, определения типов, определения констант и т. д.), за которым следует множество операторов, в которых имеются ссылки на указанные имена. Для простоты мы будем считать блок эквивалентным объявлению подпрограммы, хотя точное определение блока различно в различных языках.
Объявления, расположенные в блоке, определяют его среду локальных ссылок. Эта локальная среда не меняется во время выполнения операторов, составляющих тело блока В языке С имеется блочная структура, но она существует только в пределах одной подпрограммы. Это дает возможность определять не- локальные имена без каких-либо накладных расходов, связанных с активацией подпрограммы. Позже мы еще вернемся к этому вопросу. Вложение блоков осуществляется путем размещения определения одного блока полностью внутри некоторого друц>го блока.
На самом верхнем (или внешнем) уровне программа состоит из одного блока, определяющего главную программу. Внутри этого блока располагаются другие блоки, определяющие подпрограммы, которые вызываются непосредственно из главной программы; внутри этих блоков содержатся другие, в которых определяются подпрограммы, вызываемые из подпрограмм первого уровня и т. д. В листинге 9.4 представлена типичная компоновка блочно-структурированной программы. В таких языках, как С и Ада, самый верхний уровень может состоять из нескольких независимых блоков (каждый из которых содержит внутри себя вложенные блоки и может компилироваться по отдельности), но здесь мы ограничимся рассмотрением только одного внешнего блока.
408 Глава 9. Управление подпрограммами Листинг 9.4. Статическая блочная структура программы ргодгаы Мюп; - Локальные обьявпенкя для Маьп; Начаго Ма1п ргосебиге 5иЫ; ) - Локальные обьявленкя для 5иЫ: Начало 5иЫ ргоседиге 5иЬЗ; - Локальные абьявлення для 5иЬЗ. Начало 5иЬЗ Ьедлп - Операторы для 5иЬЗ: епб (5иЬЗ); Конец 5иЬЗ ргосвбиге 5иЬ4; - Локальные обьявленкя для 5иЬ4; Начало 5иЬ4 Ьед)п - Операчоры для 5иЬ4; ) епб (5иЬ4): Конец 5иЬ4 Ьед)л - Операторы для 5иЫ епб (5иЫ): ргосебиге 5иЬ2; - Локал~ные обьявленкя для 5иЬ2 Начало 5иЬ2 Ьед)п - Операторы для 5иЬ2 епб (5иЬ2); Конец 5иЬ2 Конец 5иЫ Ьедчп - Операторы для Мачо; ) епд (Мачп ). Конец Ма)п Правила статической облисты видимости для блочно-структурированных программ выглядят следующим образом.