Р.У. Себеста - Основные копцепции языков программирования (2001) (1160794), страница 55
Текст из файла (страница 55)
В таком языке среда ссылок оператора нужна во время компиляции оператора, поэтому можно созлавать команды и структуры данных, позволяющие доступ к переменным из лругих областей вилнмости во время выполнения программы. Методы реализации сред ссылок на нелокальные переменные в языках, использующих статический и динамический обзор данных, рассматриваются в главе 9. В языке Разса1, в котором области видимости создаются исключительно определениями процедур, среда ссылок оператора содержит локальные переменные, все переменные, объявленные в процедурах, содержащих данный оператор.
а также переменные, объявленные в основной программе (за исключением переменных в нелокальных областях вилимости, скрытых объявлениями ближних процедур). Кажлое определение процедуры создает новую область видимости, а следовательно, и новую среду. Рассмотрим следующую скелетную программу на языке Рааса(: ргодгеа ехагхр1ег чаг а, Ь : 'гседегг переменная х процедуры лиЬ2, переменные а и Ь программы ехавр1е переменные а и Ь программы ехавр1е чоз.с( вцЬ1 () ( лпс а, Ь) < --------------1 ) /* конец функции вцЫ */ тол.с) вцЬ2() 1 йпс Ь, с; < --------------2 ацЫ; ) /* конец функции вцЬ2 */ чо1о вафд() ( лпе с, с(; < --------------3 вцЬ2 (); ) /* конец функции вафд */ В указанных точках данная программа имеет следующие среды ссылок: Среда ссылок переменные а и Ь процедуры лиЫ, переменная с процедуры яиЬ2, переменная с функции ва1п (переыенная с функции ва1л и переменная Ь процедуры яиЬ2 скрыты) пеоеменные Ь и с процедуры лиЬ2, переменная <( блока ва1л (переменная с функции вабп скрыта) переменные с и б функции ва1л Точка 1 Глава 4.
Имена, связмаанне, проверка типов и области видимости 202 Рассмотрим теперь объявления переменных в скелетной программе. Отметим, вопервых, что, хотя область видимости процелуры вцЬ1 н выше уровнем (она менее глубоко вложена), чем область видимости процедуры виЬЗ, область видимости процелуры виЬ1 не является статическим прелком процедуры вцЬЗ, поэтому процедура вцЬЗ не имеет доступа к переменным, объявленным в процедуре зцЬ1. Для этого существует важная причина.
Переменные, объявленные в процедуре вцЫ, являются автоматическими, поэтому они не связаны с памятью в то время, котла процелура вцЫ не выполняется. Поскольку процедура виЬЗ может выполняться в то время, когда процедура виЬ1 не выполняется, она не лолжиа иметь доступа к переменным процелуры вцЬ1, которые не обязательно должны связываться с ячейками памяти во время выполнения процелуры виЬЗ.
Полпрограмма называется активной, если ее выполнение началось, но еше не завершилось. Среда ссылок оператора в языке с динамическим обзором данных состоит из локально обьявленных переменных и переменных всех лругих активных на данный момент подпрограмм. Повторимся, некоторые переменные активных подпрограмм могут быть скрыты от среды ссылок.
Новые активации подпрограммы могут содержать обьявления переменных, скрывающих переменные с теми же именами в предыдущих активациях подпрограммы. Рассмотрим следующую программу. Прелположнм, что единственными возможными вызовами функций являются следующие; функция вафд вызывает функцию виЬ2, которая вызывает функцию виЬ1. 4.1 3. Именованные константы Именованной константой [пашег[ сопмапг) называется переменная, связываемая со своим значением только во время связывания ее с ячейкой памяти: значение именованной константы невозможно изменить оператором присваивания или ввода. Данный объект помогает улучшить читабельность программы: значительно удобнее, например, использовать имя ру. а не константу 3.
' 4 159. Другим полезным применением именованных констант являются программы, обрабатывающее заданное количество данных, например, 100. В подобных программах во многих местах, как правило, используется константа 100 для объявления диапазонов значений индексов массивов. пределов изменения счетчиков цикла и т.п. Рассмотрим следующую скелетную программу на языке Рааса!: ргодгаа ехавр1е; Суре Епсаггау аггау [1..100) оЕ Епседег; геа1аггау = аггау [1..100] оЕ геа1г Ьедйп [ ехавр1е Еог Епс[ех := 1 Со 100 с1о Ьедап [г Еог соцпс := 1 Со 100 с1о Ьед1п атегаде := ацв с[хе 100; епо.
[ехавр1е) Для того чтобы эту программу модифицировать для работы с другим количеством значений, следует обнаружить все места, в которых написана цифра 100. и все числа заменить новыми. В большой программе это может оказаться трудоемким и подверженным ошибкам процессом. Более легким и надежным методом является использование именованной константы: ргодгаа ехавр1е; ооипС 11вг1еп 100г Суре Епсаггау = аггау [1..11вг1еп) оЕ Епгедег; геа1аггау = аггау [1..11яГ1еп) оЕ геа1; Ьедз.п [ ехевр1е ) Еог 1пс[ех:= 1 Со 11ег1еп с[о Ьедаа 203 4.1 1.
Именованные константы йок соцпг := 1 Со 11эг1еп оо Ьеодп атегаде := эшп е)дзг 11эс1еп; епе!. !ехажр1е! Если в такой программе потребуется изменить количество данных, то изменять придется только одну строку, вне зависимости от количества упоминаний константы 100 в программе. Вот еше один пример преимушества абстракции: имя 11яс1еп является абстракцией для количества элементов некоторых массивов и количества повторений некоторых циклов. Привеленный пример иллюстрирует, как именованные константы могут облегчить модификацию программы.
Обьявление именованных констант в языке Разса! требует просто наличия некоторого значения справа от оператора =. Вместе с тем, языки Модо)а-2 и ГОКТКАХ 90 позволяют использовать константные выражения, которые могут содержать предварительно объявленные именованные константы, постоянные величины и операторы. Язык Рааса! ограничивается только константами, а язык Моди!а-2 — константными выражениями, поскольку в этих языках используется статическое связывание величин с именованными константал1и. Именованные константы в языках со статическим связыванием величин иногда еше называются манифестными константами (пап!)ез! сонэ!апта).
Языки Ада, С++ и Зача допускают динамическое связывание величин с именованными константами. Это позволяет в объявлениях присваивать константам выражения, содержашие переменные. Например, оператор МАХ : оопввепп Тпке9ег := 2 * И10ТН ь 1 языка Ада объявляет переменную МАХ именованной константой целого типа, значение которой соответствует значению выражения 2 * и10ТН + 1, причем значение переменной И10ТН должно быть видимым при выделении памяти константе мАХ и связывании этой константы со своим значением. Помимо этого, язык Аг)а допускает существование именованных констант перечислнмого и структурированного типов, рассматриваемых в главе 5. 4Л2.
Инициализация леременнмх Обсуждение связывания значений с именованными константами естественным образом приводит к теме инициализации переменных, поскольку связывание величины с именованной константой является таким же процессом, только постоянным. В большинстве случаев удобно. чтобы переменные имели значения до начала выполнения программы или подпрограммы, в которой они обьявляются. Связывание переменной со значением во время связывания ее с ячейкой памяти называется инициализацией (!и!г!айза!!оп).
Если переменная статически связана с ячейкой памяти. то связывание и инициализация происходят до выполнения программы. При динамическом же связывании с памятью инициализация также является динамической. Елово 4. Имено, связывоиие, проверко типов и области видимости В языке ГОКТКАН начальные значения переменных могут устанавливаться в операторе САТА: РЕАЕ Р1 1ИТЕЯЕЯ ЯСМ САТА ЯУМ /С/, Р1 /3.14159/ В этом операторе переменная Я-М иницназизируется значением С. а переменная Р1— значением 3. 14159.
В данном случае фактическая инициазизация происходит во время компиляции. Как только начнется выполнение программы. переменные Я'М н Р1 не будут ничем отличаться от друпш переменных. Во многих языках исходные значения переменных могут задаваться в операторах объявления, как в объявлении языка Ада: ЯУМ : 1ИТЕЯЕй := С; Ни язык Разсай ни язык Модо!а-2 не содержат иного способа инициализации переменных, кроме инициализации во время выполнения с помошью операторов присваивания. Вообше, инициализация статических переменных происходит только олин раз, но лля таких динамических переменных. как локальные переложенные в процедуре языка Ада, она происходит каждый раз при распределении памяти. Форма имен в языке может воздействовать как на читабельность этого языка, так и на улобство его использования.