Spec-Zone.ru › Ada 2012
Справочник по Ada 2012

10.2.1 Управление разработкой

Этот подпункт определяет директивы, которые помогают контролировать порядок разработки элементов_библиотеки.

Синтаксис

Форма директивы pragma Preelaborate выглядит следующим образом:
pragma Preelaborate[(имя_единицы_библиотеки_имя)];
Директива pragma Preelaborate является директивой для единицы библиотеки.
Форма директивы pragma Preelaborable_Initialization выглядит следующим образом:
pragma Preelaborable_Initialization(прямое_имя);

Правила легальности

Разрабатываемый конструкт является предварительно разрабатываемым, если его разработка не выполняет ни одну из следующих операций:
  • Выполнение оператора кроме пустого_оператора.
  • Вызов подпрограммы, кроме статической функции.
  • Вычисление первичного_выражения, которое является именем объекта, если это имя не является статическим выражением или статически не обозначает дискриминант вложенного типа.
  • Создание объекта (включая компонент), который инициализируется по умолчанию, если его тип не имеет предварительной инициализации. Аналогично, вычисление расширяемого_агрегата со меткой_подтипа предка, обозначающей подтип такого типа.
Тело обобщенного типа является предварительно разрабатываемым только в том случае, если разработка соответствующего тела экземпляра не выполнит ни одну из указанных операций, предполагая, что:
  • фактическое значение для каждого дискриминированного формального производного типа, формального частного типа или формального частного расширения, объявленного в формальной части обобщенного блока, является типом, который не имеет предварительной инициализации, если для формального типа не применена директива pragma Preelaborable_Initialization;
  • фактическое значение для каждого формального типа является нестатическим;
  • фактическое значение для каждого формального объекта является нестатическим; и
  • фактическое значение для каждой формальной подпрограммы является подпрограммой, определенной пользователем.
Директива pragma Preelaborate (или pragma Pure — см. ниже) используется для указания того, что единица библиотеки является предварительно разрабатываемой, то есть, что аспект Preelaborate единицы библиотеки равен True; все единицы компиляции единицы библиотеки предварительно разрабатываются. Объявление и тело предварительно разрабатываемой единицы библиотеки, а также все подблоки, которые разрабатываются в ходе разработки единицы библиотеки, должны быть предварительно разрабатываемыми. Все единицы компиляции предварительно разрабатываемой единицы библиотеки должны семантически зависеть только от объявленных чистых или предварительно разработанных элементов_библиотеки. В дополнение к местам, где обычно применяются правила легальности (см. 12.3), эти правила также применяются в частной части экземпляра обобщенного блока. Если единица библиотеки предварительно разрабатывается, то ее объявление (если таковое имеется) и тело (если таковое имеется) разрабатываются до всех непредварительно разработанных элементов_библиотеки раздела.
Следующие правила определяют, какие сущности имеют предварительно инициализируемые типы:
  • Частичный вид частного типа или частного расширения, защищенного типа без декларации_входа, формального частного типа обобщенного типа или формального производного типа обобщенного типа имеет предварительно инициализируемый тип тогда и только тогда, когда для них применена директива pragma Preelaborable_Initialization. Защищенный тип с декларациями_входа или тип задачи никогда не имеет предварительной инициализации.
  • Компонент (включая дискриминант) записи или защищенного типа имеет предварительно инициализируемый тип, если его объявление включает в себя выражение_по_умолчанию, выполнение которого не выполняет никаких операций, запрещенных в предварительно разрабатываемых конструкциях, как описано выше, или если его объявление не включает выражение по умолчанию, и его тип имеет предварительно инициализируемый тип.
  • Производный тип имеет предварительно инициализируемый тип, если его родительский тип имеет предварительно инициализируемый тип, и если все не унаследованные компоненты имеют предварительно инициализируемый тип. Однако, контролируемый тип с процедурой Initialize, которая не является пустой процедурой, не имеет предварительно инициализируемого типа.
  • Вид типа имеет предварительно инициализируемый тип, если это элементарный тип, массивный тип, тип компонента которого имеет предварительно инициализируемый тип, тип записи, все компоненты которого имеют предварительно инициализируемый тип, или интерфейсный тип.
Директива pragma Preelaborable_Initialization указывает, что тип имеет предварительно инициализируемый тип. Эта директива должна появляться в видимой части пакета или обобщенного пакета.
Если директива появляется в первом списке элементов_базового_объявления спецификации пакета, то прямое_имя должно обозначать первый подтип составного типа, и тип должен быть объявлен непосредственно в том же пакете, что и директива pragma. Если директива применяется к частному типу или частному расширению, полный вид типа должен иметь предварительно инициализируемый тип. Если директива применяется к защищенному типу, защищенный тип не должен иметь входов, и каждый компонент защищенного типа должен иметь предварительно инициализируемый тип. Для любого другого составного типа тип должен иметь предварительно инициализируемый тип. В дополнение к местам, где обычно применяются правила легальности (см. 12.3), эти правила применяются также в частной части экземпляра обобщенного блока.
Если директива появляется в формальной_части_обобщенного_блока, то прямое_имя должно обозначать формальный частный тип или формальный производный тип обобщенного типа, объявленный в той же формальной_части_обобщенного_блока, что и директива pragma. При обобщенной подстановке соответствующий фактический тип должен иметь предварительно инициализируемый тип.

Рекомендации по реализации

В реализации тип, объявленный в предварительно разработанном пакете, должен иметь одинаковое представление в каждой разработке данной версии пакета, независимо от того, происходят ли разработки в разных выполнениях одной программы или в выполнениях разных программ или разделов, которые включают данную версию.

Синтаксис

Форма директивы pragma Pure выглядит следующим образом:
pragma Pure[(имя_единицы_библиотеки_имя)];
Директива pragma Pure является директивой для единицы библиотеки.

Статическая семантика

Единица компиляции чистого типа является предварительно разрабатываемой единицей компиляции, разработка которой не выполняет ни одну из следующих операций:
  • разработка объявления переменной;
  • вычисление аллокатора типа доступа к переменной; для целей данного правила предполагается, что частичный вид типа имеет невидимые компоненты, чья инициализация по умолчанию вычисляет такой аллокатор;
  • разработка объявления непроизводного именованного типа доступа к переменной, за исключением случаев, когда Storage_Size типа указан статическим выражением со значением ноль или определен языком как ноль;
  • разработка объявления непроизводного именованного типа доступа к константе, для которого Storage_Size указан выражением, отличным от статического выражения со значением ноль.
Тело обобщенного типа является чистым только в том случае, если разработка соответствующего тела экземпляра не выполнит ни одну из указанных операций, при предположении, что любые составные формальные типы имеют невидимые компоненты, чья инициализация по умолчанию вычисляет аллокатор типа доступа к переменной.
Storage_Size для анонимного типа доступа к переменной, объявленного на уровне библиотеки в единице библиотеки, которая объявлена чистой, определяется как ноль.

Правила легальности

Этот абзац был удален.
END_OF_DOCUMENT_MARKER
Использование директивы Pure указывает на то, что единица библиотеки объявлена как чистая, то есть аспект Pure единицы библиотеки имеет значение True; все единицы компиляции единицы библиотеки объявлены чистыми. Кроме того, ограниченный вид любого библиотечного пакета объявлен чистым. Объявление и тело объявленной чистой единицы библиотеки, а также все подмодули, которые обрабатываются в рамках обработки единицы библиотеки, должны быть чистыми. Все единицы компиляции объявленной чистой единицы библиотеки должны семантически зависеть только от объявленных чистых элементов_библиотеки. В дополнение к местам, где обычно применяются правила допустимости (см. 12.3), эти правила также применяются в частной части экземпляра генерической единицы. Кроме того, полный вид любого частичного вида, объявленного во видимой части объявленной чистой единицы библиотеки, имеющей доступные атрибуты потока, должен поддерживать внешнюю потоковую передачу (см. 13.13.2).

Ошибка выполнения

Выполнение является ошибочным, если какая-либо операция (кроме инициализации или завершения объекта) изменяет значение объекта-константы, объявленного на уровне библиотеки в чистом пакете.

Разрешения реализации

Если единица библиотеки объявлена как чистая, то реализация разрешает опустить вызов подпрограммы единицы библиотеки на уровне библиотеки, если результаты не нужны после вызова. Кроме того, реализация может опустить вызов такой подпрограммы и просто повторно использовать результаты, полученные при предыдущем вызове той же подпрограммы, при условии, что ни один из параметров, ни какой-либо объект, доступный через значения доступа из параметров, не имеют части, тип которой является неизменяемым ограниченным типом, и адреса и значения всех фактических параметров по ссылке, значения всех фактических параметров по копированию и значения всех объектов, доступных через значения доступа из параметров, такие же, как и при предыдущем вызове. Это разрешение применяется даже если подпрограмма производит другие побочные эффекты при вызове.

Синтаксис

Форма директивы Elaborate, Elaborate_All или Elaborate_Body выглядит следующим образом:
pragma Elaborate(имя_единицы_библиотеки_имя{, имя_единицы_библиотеки_имя});
pragma Elaborate_All(имя_единицы_библиотеки_имя{, имя_единицы_библиотеки_имя});
pragma Elaborate_Body[(имя_единицы_библиотеки_имя)];
Директива Elaborate или Elaborate_All допускается только в рамках определения_контекста.
Директива Elaborate_Body является директивой для единицы библиотеки.

Правила допустимости

Если аспект Elaborate_Body имеет значение True для объявления (включая случай, когда применяется директива Elaborate_Body), то объявление требует завершения (тела).
Имя имя_единицы_библиотеки_имя директивы Elaborate или Elaborate_All должно обозначать не ограниченный вид единицы библиотеки.

Статическая семантика

Директива Elaborate указывает на то, что тело указанной единицы библиотеки обрабатывается перед текущим элементом_библиотеки. Директива Elaborate_All указывает на то, что каждый элемент_библиотеки, необходимый для объявления указанной единицы библиотеки, обрабатывается перед текущим элементом_библиотеки.
Директива Elaborate_Body устанавливает аспект Elaborate_Body единицы библиотеки, к которой она применяется, в значение True. Если аспект Elaborate_Body единицы библиотеки имеет значение True, то тело единицы библиотеки обрабатывается сразу после ее объявления.
ПРИМЕЧАНИЯ
12 Разрешается, чтобы предварительно обработанная единица библиотеки имела неосуществимые дочерние элементы.
13 Разрешается, чтобы единица библиотеки, объявленная как чистая, имела нечистые дочерние элементы.


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API