Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Область видимости и период жизни.






Ø В одномодульном программировании организация связи между инструментами решения задач базируется на понятии «локальные-глобальные», а для оформления этого понятия используется принцип вложенности программных компонентов:

§ в Pascal используются возможности вложенного описания процедур и функций;

§ в С/С++ - возможности вложенного использования оператора блок.

Инструменты (переменные, функции...), локализованные в программном компоненте (в процедуре-функции, в блоке), не видимы извне, но видят тех, кто для них глобален (объявлен в объемлющей области). Можно перекрыть возможность видеть то, чего «не хочется видеть» - если имя «возможно глобального» совпадает с именем локального, этот «возможно глобальный» становится не видимым, возможность перекрывается.

Что-то новое появляется в дилемме локальные – глобальные, когда базовое понятие «переменная» расширяется понятием «динамическая переменная», потому как динамические переменные не описываются, а явно создаются и уничтожаются в периоде выполнения программ.

Отметим, что понятие «локальные-глобальные» относительное – локальное для данного программного компонента является глобальным для вложенного в него программного компонента, с другой стороны – каждое глобальное для программного компонента должно быть локализовано в одном из объемлющих его. В программе обычно имеются максимальноглобальные инструменты, локализованные на самом верхнем уровне вложенности, т.е. объявленные вне процедур-функций. Отметим, что сами функции в С/С++ всегда максимальноглобальны.

С другой стороны, семантика понятия «локальные-глобальные» базируется на понятиях область видимости и период жизниимени или иначе, инструмента, который идентифицируется этим именем – в таблице 1 на следующей странице систематизировано соотношение понятий «локальные» и «глобальные» инструменты и их «область видимости» и «период жизни».

Ø В многомодульном программировании ситуация усложняется в связи с тем, что:

§ модули не вкладываются, а оформляются раздельно,

§ раздельная трансляция накладывает свои требования на организацию связи между модулями.

¨ Организация связи между инструментами внутри модуля основана на тех принципах, которые рассмотрены для одномодульного программирования.

¨ Организация межмодульной связи.

Для оформления связей и защиты инструментов модуля в C/C++ используются средства управления областью видимости и периодом жизни инструментов:

§ модификаторы класса памяти: static, extern – ключевые слова ставятся в начале объявления переменной или заголовка описания функции;

§ прототип функции: заголовок её описания.

Теперь рассмотрим оформление инкапсулированных и интерфейсных инструментов и импорта инструментов. В таблице 2 на следующей странице систематизировано соотношение этих понятий, их областей видимости и периодов жизни, а также способов оформления импорта-экспорта в Object Pascal 2 (OP2) и С/С++.


  Для данного программного компонента: процедуры или функции – в Pascal, блока - в C/C++
Инструмент – локальный для этого программного компонента Инструмент - глобальный (нелокальный) для этого программного компонента
Относительно глобальный Максимально глобальный
Область видимости Этот программный компонент (в котором объявлен этот инструмент). Тот объемлющий программный компонент, в котором этот инструмент локализован. Вся программа, точнее: program-модуль (или unit-модуль) в Pascal, программный файл в C/C++
Период жизни Период выполнения этого программного компонента (в котором объявлен этот инструмент), т.е. период выполнения вызова функции или оператора процедуры – в Pascal, блока - в C/C++ Период выполнения того объемлющего программного компонента, в котором этот инструмент локализован. Период выполнения всей программы. Замечание: если головной модуль программы импортировал инструменты модуля, то этот модуль остаётся в «живом» состоянии весь период выполнения головного модуля программы.

Таблица 1. Организация внутримодульной связи, область видимости и период жизни инструмента.

  Интерфейсные инструменты Инкапсулированные инструменты Локальные static-переменные
Импорт Ü Экпорт OP2 uses Ü interface невозможно Ü implementation  
C/C++ extern Ü максимальноглобальный невозможно Ü static максимальноглобальный static ОбъявлениеПеременной
Область видимости Определяющий (экпортирующий) и импортировавший модули Определяющий модуль Блок, в котором эта переменная объявлена
Период жизни Период выполнения всей многомодульной программы

Таблица 2. Организация межмодульной связи, область видимости и период жизни инструмента.


Инкапсулированные (неимпортируемые) инструменты модуля:

§ Инструменты, локализованные в блоках описания функций, импортировать невозможно, они невидимы даже в своём модуле за пределами области их видимости.

§ Только максимальноглобальные инструменты модуля (программного файла) можно импортировать, т.е. только те, которые объявлены вне описаний функций.

§ Для инкапсуляции инструмента (защиты от импорта) в начале его объявления ставится ключевое слово static. Модификатор класса памяти static допустим только для переменных, констант и функций, т.е. защитить определение типа от импорта невозможно. Попытка импорта инкапсулированного инструмента пресекается на этапе редактирования межмодульных связей после трансляции всех модулей многомодульной программы.

Модификатор класса памяти static применим и к локальным переменным. Как показано в таблице 2 на предыдущей странице, воздействие модификатора static на глобальные и локальные переменные заметно различается. Для глобальных переменных – он сужает область видимости (но не изменяет период жизни), а для локальных – расширяет период жизни (но не изменяет область видимости). Локальные static-переменные - это что-то новое в дилемме локальные - глобальные. При выходе из своего блока, области видимости этой переменной, она не уничтожается, как это происходит с обычной локальной переменной, и сохраняет своё значение. А потому при повторном входе в свой блок восстанавливается её последнее значение от предыдущего входа в этот блок.

Интерфейсные (экпортируемые) инструменты модуля:

§ Импортировать можно любой максимальноглобальный инструмент модуля, не защищённый модификатором static в его объявлении.

Импорт инструментов модуля:

Импортирование оформляется в импортирующем модуле повторным объявлением инструмента, а точнее ссылкой на основное собственно объявление этого инструмента в экспортирующем модуле:

§ Импорт функции: включить (в импортирующий модуль) прототип этой функции. Можно в начало прототипа поставить ключевое слово extern, но этот модификатор класса памяти для функций устанавливается по умолчанию.

§ Импорт переменной: включить объявление этой переменной, но с модификатором extern (в начале объявления) и без инициализации.

§ Импорт константы: оформляется аналогично, но в определении константы обязательно опускается определяющая часть = значение

§ Импорт типа: оформляется полным повторным объявлением.

Повторные объявления – опасная штука, могут появиться расхождения в этих объявлениях и сопутствующие им недоразумения... Чтобы оградить программиста от технических проблем, сопутствующих повторным объявлениям, в С/С++ используется понятие «заголовочный h-файл» и директива препроцессорных средств #include:

§ В заголовочный h-файл включается весь импорт модуля.

§ #include ИмяФайлаОбрамлённое

Эта директива имеет следующий смысл: заменить текст директивы текстом файла, имя которого указано в директиве. Если параметр директивы задан в виде < ИмяФайла >, то файл ищется в предопределенном каталоге среды программирования, а если в виде строковой константы ” ИмяФайла ” – то в текущем каталоге проекта. Директивы препроцессорных средств обрабатываются препроцессором до трансляции модуля.

Ø Вариант 1. С/С++. Статическая реализация стека.

На следующей странице приведена С/С++-программа статической реализации стека вместе с выше рассмотренной Pascal-программой для визуального сравнения.

 


UNIT UVal; INTERFACE TYPE TVal= CHAR;

PROCEDURE WriteElement(xPrm: TVal);

CONST CMaxL=1000 {статическая реализация - размер стека

изначально ограничен};






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.