Справочник по Ada 2005
10.2.1 Управление этапом разработки
Этот подраздел определяет директивы, которые помогают контролировать порядок разработки элементов_библиотеки.
Синтаксис
Форма директивы pragma Preelaborate выглядит следующим образом:
pragma Preelaborate[(имя_единицы_библиотеки_имя)];
Директива pragma Preelaborate является директивой для единицы библиотеки.
Форма директивы pragma Preelaborable_Initialization выглядит следующим образом:
pragma Preelaborable_Initialization(прямое_имя);
Правила допустимости
Элемент, подлежащий разработке, является предварительно разработанным, если его разработка не выполняет ни одно из следующих действий:
- Выполнение выражения, отличного от пустого_выражения.
- Вызов подпрограммы, отличной от статической функции.
- Вычисление операнда, являющегося именем объекта, если это имя не является статическим выражением или статически не обозначает дискриминанту содержащего типа.
- Создание объекта (включая компонент) типа, не имеющего предварительно разработанной инициализации. Аналогично, вычисление расширенного_агрегата с предком метка_подтипа, обозначающим подтип такого типа.
Тело обобщенного объекта является предварительно разработанным только в том случае, если разработка соответствующего тела экземпляра не выполняет никаких таких действий, предполагая, что:
- фактический для каждого формального частного типа (или расширения), объявленного в формальной части обобщенного объекта, является частным типом (или расширением), не имеющим предварительно разработанной инициализации;
- фактический для каждого формального типа является нестатическим;
- фактический для каждого формального объекта является нестатическим; и
- фактический для каждой формальной подпрограммы является определенной пользователем подпрограммой.
Если директива pragma Preelaborate (или pragma Pure — см. ниже) применяется к единице библиотеки, то она предварительно разрабатывается. Если единица библиотеки предварительно разработана, то ее объявление, если оно есть, и тело, если оно есть, разрабатываются до всех непредварительно разработанных элементов_библиотеки раздела. Объявление и тело предварительно разработанной единицы библиотеки, а также все подмодули, которые разрабатываются в рамках разработки единицы библиотеки, должны быть предварительно разработанными. В дополнение к местам, где обычно применяются правила допустимости (см. 12.3), это правило применяется также в частной части экземпляра обобщенного объекта. Кроме того, все модули компиляции предварительно разработанной единицы библиотеки должны семантически зависеть только от модулей компиляции других предварительно разработанных единиц библиотеки.
Следующие правила определяют, какие сущности имеют предварительно разработанную инициализацию:
- Частичный вид частного типа или частного расширения, защищенного типа без объявлений_входных_точек, формального частного типа обобщения или формального производного типа обобщения имеют предварительно разработанную инициализацию, если и только если к ним применена директива pragma Preelaborable_Initialization. Защищенный тип с объявлениями_входных_точек или тип задачи никогда не имеют предварительно разработанной инициализации.
- Компонент (включая дискриминанту) записи или защищенного типа имеет предварительно разработанную инициализацию, если его объявление включает выражение_по_умолчанию, выполнение которого не выполняет никаких действий, запрещенных в предварительно разработанных конструкциях, как описано выше, или если его объявление не включает выражение по умолчанию, а его тип имеет предварительно разработанную инициализацию.
- Производный тип имеет предварительно разработанную инициализацию, если его родительский тип имеет предварительно разработанную инициализацию и (в случае производного расширения записи) если все неунаследованные компоненты имеют предварительно разработанную инициализацию. Однако определяемый пользователем контролируемый тип с переопределенной процедурой Initialize не имеет предварительно разработанной инициализации.
- Вид типа имеет предварительно разработанную инициализацию, если это элементарный тип, массивный тип, тип компонента которого имеет предварительно разработанную инициализацию, тип записи, все компоненты которого имеют предварительно разработанную инициализацию, или интерфейсный тип.
Директива pragma Preelaborable_Initialization указывает, что тип имеет предварительно разработанную инициализацию. Эта директива должна появляться в видимой части пакета или обобщенного пакета.
Если директива появляется в первом списке базовых_декларативных_элементов спецификации пакета package_specification, то прямое_имя должно обозначать первый подтип частного типа, частного расширения или защищенного типа, который не является интерфейсным типом и не содержит объявлений_входных_точек, и тип должен быть объявлен непосредственно в том же пакете, что и директива pragma. Если директива применяется к частному типу или частному расширению, полный вид типа должен иметь предварительно разработанную инициализацию. Если директива применяется к защищенному типу, каждый компонент защищенного типа должен иметь предварительно разработанную инициализацию. В дополнение к местам, где обычно применяются правила допустимости, эти правила применяются также в частной части экземпляра обобщенного объекта.
Если директива появляется в формальной_части_обобщения, то прямое_имя должно обозначать формальный частный тип обобщения или формальный производный тип обобщения, объявленный в той же формальной_части_обобщения, что и директива pragma. В экземпляре_обобщения соответствующий фактический тип должен иметь предварительно разработанную инициализацию.
Рекомендации по реализации
В реализации тип, объявленный в предварительно разработанном пакете, должен иметь такое же представление в каждой разработке данной версии пакета, независимо от того, происходят ли разработки в различных выполнениях одной программы или в выполнениях различных программ или разделов, включающих данную версию.
Синтаксис
Форма директивы pragma Pure выглядит следующим образом:
pragma Pure[(имя_единицы_библиотеки_имя)];
Директива pragma Pure является директивой для единицы библиотеки.
Статическая семантика
Чистый элемент_библиотеки — это предварительно разработанный элемент_библиотеки, разработка которого не выполняет никаких из следующих действий:
- разработка объявления переменной;
- вычисление аллокатора типа доступа к переменной; для целей данного правила предполагается, что частичный вид типа имеет невидимые компоненты, значения по умолчанию которых вычисляют такой аллокатор;
- разработка объявления именованного типа доступа к переменной, если размер памяти типа не был указан статическим выражением со значением ноль или не определен языком как ноль;
- разработка объявления именованного типа доступа к константе, для которого размер памяти был указан выражением, отличным от статического выражения со значением ноль.
Размер памяти для анонимного типа доступа к переменной, объявленного на уровне библиотеки в единице библиотеки, которая объявлена чистой, определен как ноль.
Правила допустимости
Этот абзац был удален.
Использование псевдодирективы Pure позволяет объявить, что модуль библиотеки является чистым. Если псевдодиректива Pure применяется к модулю библиотеки, то все его единицы компиляции должны быть чистыми и семантически зависеть только от единиц компиляции других модулей библиотек, объявленных как чистые. Кроме того, полный вид любого частичного вида, объявленного в видимой части модуля библиотеки, имеющего доступные атрибуты потока, должен поддерживать внешнюю потоковую обработку (см. 13.13.2).
Разрешения реализации
Если модуль библиотеки объявлен чистым, то реализация может опустить вызов подпрограммы модуля библиотеки на уровне библиотеки, если результаты после вызова не требуются. Кроме того, реализация может опустить вызов такой подпрограммы и просто повторно использовать результаты, полученные от предыдущего вызова той же подпрограммы, при условии, что ни один из параметров, ни какой-либо объект, доступный через значения доступа из параметров, не является ограниченного типа, и адреса и значения всех фактических параметров по ссылке, значения всех фактических параметров по копированию-ввод и значения всех объектов, доступных через значения доступа из параметров, являются такими же, как и при предыдущем вызове. Это разрешение применяется даже если подпрограмма при вызове производит другие побочные эффекты.
Синтаксис
Форма псевдодирективы Elaborate, Elaborate_All или Elaborate_Body следующая:
pragma Elaborate_Body[(имя_модуля_библиотеки_имя)];
Псевдодиректива pragma Elaborate или Elaborate_All может использоваться только в описании_контекста.
Псевдодиректива pragma Elaborate_Body является псевдодирективой модуля библиотеки.
Правила легальности
Если псевдодиректива Elaborate_Body применяется к объявлению, то это объявление требует завершения (тела).
Имя имя_модуля_библиотеки_имя псевдодирективы Elaborate или Elaborate_All должно обозначать не ограниченный вид модуля библиотеки.
Статическая семантика
Псевдодиректива pragma Elaborate указывает на то, что тело указанного модуля библиотеки обрабатывается перед текущим элементом_библиотеки. Псевдодиректива pragma Elaborate_All указывает на то, что каждый элемент_библиотеки, необходимый для объявления указанного модуля библиотеки, обрабатывается перед текущим элементом_библиотеки. Псевдодиректива pragma Elaborate_Body указывает на то, что тело модуля библиотеки обрабатывается сразу после его объявления.
ПРИМЕЧАНИЯ
12 Разрешается, чтобы предварительно обработанный модуль библиотеки имел дочерние модули, которые не подлежат предварительной обработке.
13 Разрешается, чтобы модуль библиотеки, объявленный как чистый, имел дочерние модули, которые не являются чистыми.