Spec-Zone.ru › Ada 2022
Руководство по Ada (Ada 2022)

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

Этот подпункт определяет аспекты и псевдокоманды, которые помогают управлять порядком разработки library_itemов.
Абзацы с 2-го по 4-й были перемещены в Приложение J, «Устаревшие функции».

Правила законности

Разрабатываемый конструкт является предварительно разрабатываемым, если его разработка не выполняет ни одну из следующих действий:
  • Выполнение оператора, отличного от null_statement.
  • Вызов подпрограммы, кроме:
статической функции;
экземпляра Unchecked_Conversion (см. 13.9);
функции, объявленной в System.Storage_Elements (см. 13.7.1); или
функций To_Pointer и To_Address, объявленных в экземпляре System.Address_to_Access_Conversions (см. 13.7.2).
  • Оценку основного элемента, который является именем объекта, если имя не является статическим выражением или статически не обозначает дискриминанту вложенного типа.
  • Создание объекта (включая компонент), который инициализируется по умолчанию, если его тип не имеет предварительной разработки инициализации. Аналогично, оценку расширенного агрегата с предком subtype_mark, обозначающим подтип такого типа.
  • Разработку любого разрабатываемого конструкта, который не является предварительно разрабатываемым.
Генеральное объявление является предварительно разрабатываемым, если каждый экземпляр не выполняет одно из вышеперечисленных действий.
Тело обобщения предварительно разрабатываемо только тогда, когда разработка соответствующего тела экземпляра не выполнит никаких подобных действий, предполагая, что:
  • фактический для каждого формального типа, производного типа, формального частного типа или формального частного расширения, объявленного в формальной части обобщенного блока, является типом, у которого нет предварительно разрабатываемой инициализации, если для формального типа не был указан аспект Preelaborable_Initialization;
  • фактический для каждого формального типа является нестатическим;
  • фактический для каждого формального объекта является нестатическим; и
  • фактический для каждой формальной подпрограммы является подпрограммой пользователя.
Когда аспект библиотечного блока (см. 13.1.1) Preelaborate программного блока принимает значение True, блок называется предварительно разработанным. Когда аспект Preelaborate указан как True для библиотечного блока, все единицы компиляции библиотечного блока предварительно разрабатываются. Декларация и тело предварительно разработанного библиотечного блока, а также все подблоки, которые разрабатываются как часть разработки библиотечного блока, должны быть предварительно разрабатываемыми. Все единицы компиляции предварительно разработанного библиотечного блока должны семантически зависеть только от объявленных чистых или предварительно разработанных library_itemов. В дополнение к местам, где обычно применяются правила законности (см. 12.3), эти правила также применяются в частной части экземпляра обобщенного блока. Если библиотечный блок предварительно разработан, то его декларация (если она есть) и тело (если оно есть) разрабатываются до всех непредварительно разработанных library_itemов раздела.
Следующие правила определяют, какие сущности имеют предварительно разрабатываемую инициализацию, то есть аспект Preelaborable_Initialization сущности принимает значение True:
  • Частичный вид частного типа или частного расширения, защищенного типа без entry_declarationов, формального частного типа или формального производного типа имеет предварительно разрабатываемую инициализацию тогда и только тогда, когда для них был указан аспект Preelaborable_Initialization со значением True. Защищенный тип с entry_declarationами или тип задачи никогда не имеют предварительно разрабатываемой инициализации. Аспект Preelaborable_Initialization для частичного вида типа может быть указан как False, даже если полный вид типа имеет предварительно разрабатываемую инициализацию. Аналогично, формальный тип может быть указан с Preelaborable_Initialization False, даже если фактический тип в экземпляре имеет предварительно разрабатываемую инициализацию.
  • Компонент (включая дискриминанту) записи или защищенного типа имеет предварительно разрабатываемую инициализацию, если его объявление включает default_expression, выполнение которого не выполняет никаких действий, запрещенных в предварительно разрабатываемых конструктах, как описано выше, или если его объявление не включает выражение по умолчанию, а его тип имеет предварительно разрабатываемую инициализацию.
  • Производный тип имеет предварительно разрабатываемую инициализацию, если его родительский тип имеет предварительно разрабатываемую инициализацию и если все не унаследованные компоненты имеют предварительно разрабатываемую инициализацию. Однако управляемый тип с процедурой Initialize, которая не является процедурой null, не имеет предварительно разрабатываемой инициализации.
  • Вид типа имеет предварительно разрабатываемую инициализацию, если это элементарный тип, массивный тип, тип которого имеет предварительно разрабатываемую инициализацию, тип записи, все компоненты которого имеют предварительно разрабатываемую инициализацию, или интерфейсный тип.
Следующий атрибут определен для неформального составного подтипа S, объявленного в видимой части пакета или обобщенного пакета, или формального частного подтипа или формального производного подтипа:
S'Preelaborable_Initialization

Этот атрибут является булевого типа, и его значение отражает, имеет ли тип S предварительно разрабатываемую инициализацию. Значение этого атрибута, аспект Preelaborable_Initialization, связанный с типом, может быть указан для любого типа, для которого определен атрибут. Значение должно быть указано статическим выражением, если тип не является формальным типом, но тем не менее объявлен в обобщенном пакете. В последнем случае значение также может быть указано путем ссылки на атрибут Preelaborable_Initialization одного или нескольких видимых формальных типов в момент объявления составного типа, соединенных оператором and.
Если аспект Preelaborable_Initialization задан как True для частного типа или частного расширения, полный вид типа должен иметь предварительно разрабатываемую инициализацию. Если аспект задан как True для защищенного типа, защищенный тип не должен иметь входов, а каждый компонент защищенного типа должен иметь предварительно разрабатываемую инициализацию. Если аспект задан как True для формального обобщенного типа, то в generic_instantiation соответствующий фактический тип должен иметь предварительно разрабатываемую инициализацию. Если определение аспекта включает одну или несколько ссылок на атрибут Preelaborable_Initialization, то полный вид типа должен иметь предварительно разрабатываемую инициализацию, предполагая, что типы, упомянутые в префиксах ссылок на атрибут, все имеют предварительно разрабатываемую инициализацию. Для любого другого составного типа аспект должен быть статически указан как True или False только если он подтверждает. В дополнение к местам, где обычно применяются правила законности (см. 12.3), эти правила также применяются в частной части экземпляра обобщенного блока.

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

В реализации тип, объявленный в предварительно разработанном пакете, должен иметь одинаковое представление в каждой разработке данной версии пакета, независимо от того, происходят ли разработки в разных выполнениях одной программы или в выполнениях различных программ или разделов, которые включают данную версию.
Абзацы с 13-го по 15-й были перемещены в Приложение J, «Устаревшие функции».

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

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

Правила законности

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

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

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

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

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

Синтаксис

Определены следующие pragma:
pragma Elaborate(library_unit_name{, library_unit_name});
pragma Elaborate_All(library_unit_name{, library_unit_name});
Этот абзац был удален.
Pragma Elaborate или Elaborate_All разрешен только внутри context_clause.
Этот абзац был удален.

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

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

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

Pragma Elaborate указывает, что тело указанной библиотечной единицы обрабатывается до текущего library_item. Pragma Elaborate_All указывает, что каждый library_item, необходимый для объявления названной библиотечной единицы, обрабатывается до текущего library_item.
Если аспект Elaborate_Body библиотечной единицы равен True, тело библиотечной единицы обрабатывается сразу после ее объявления.
ПРИМЕЧАНИЕ 1 Предварительно обработанная библиотечная единица может иметь непоследовательные дочерние элементы.
ПРИМЕЧАНИЕ 2 Библиотечная единица, объявленная как чистая, может иметь нечистые дочерние элементы.


Spec-Zone.ru

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