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

6.1.2 Аспекты Global и Global'Class

Аспекты Global и Global'Class программного модуля используются для определения объектов, являющихся глобальными для модуля, которые могут считываться или записываться во время его выполнения.

Синтаксис

global_aspect_definition ::=
null
| Неопределено
| global_mode global_designator
| (global_aspect_element{; global_aspect_element})
global_aspect_element ::=
global_mode global_set
| global_mode all
| global_mode synchronized
global_mode ::=
basic_global_mode
| extended_global_mode
basic_global_mode ::= in | in out | out
global_set ::= global_name {, global_name}
global_designator ::= all | synchronized | global_name
global_name ::= object_name | package_name

Правила разрешения имён

Имя global_name должно статически ссылаться на объект или пакет (включая ограниченное представление пакета).

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

Для подпрограммы, входа, типа доступа к подпрограмме, задачи, защищенного блока или библиотечного пакета или параметрического библиотечного пакета, следующий определённый языком аспект может быть указан с помощью aspect_specification (см. 13.1.1):
Global
Аспект Global должен быть задан с помощью global_aspect_definition.
Аспект Global определяет набор переменных (который в целях этой главы включает все константы, за исключением тех, которые, как известно, не имеют представлений переменных (см. 3.3)), являющихся глобальными для вызываемого объекта или тела задачи и считываемых или обновляемых в рамках выполнения вызываемого объекта или тела задачи. Если указан для защищенного блока, он относится ко всем защищённым операциям защищенного блока. Константы любого типа также могут быть упомянуты в аспекте Global.
Если не указан или определён иначе ниже, аспект по умолчанию является аспектом Global для окружающего библиотечного модуля, если объект объявлен на уровне библиотеки, и Неопределён в противном случае. Если не указан для библиотечного модуля, аспект по умолчанию равен Global => null для чистого библиотечного модуля и Global => Неопределено в противном случае.
Для диспетчеризующей подпрограммы следующий определённый языком аспект может быть указан с помощью aspect_specification (см. 13.1.1):
Global'Class
Аспект Global'Class должен быть задан с помощью global_aspect_definition. Этот аспект определяет верхнюю границу набора переменных, глобальных для диспетчеризующей операции, которые могут быть считываемы или обновлены в результате вызова диспетчеризации операции. Если не указан, аспект по умолчанию является аспектом Global для диспетчеризующей подпрограммы.
Вместе аспекты Global и Global'Class называются глобальными аспектами.
Определение global_aspect_definition определяет аспект Global или Global'Class некоторого объекта. Аспект Global определяет наборы глобальных переменных, которые могут быть считываемы, записываемы или изменены в качестве побочного эффекта выполнения операций, связанных с объектом. Аспект Global'Class, связанный с диспетчеризующей операцией типа T, представляет собой ограничение на аспект Global соответствующей операции любого потомка типа T.
Аспект Global для вызываемого объекта определяет глобальные переменные, которые могут быть обработаны при вызове объекта, включая любые выражения утверждений, применимые к вызову (даже если они не включены), такие как предпосылки, пост-условия, предикаты и инварианты типов.
Аспект Global для объекта доступа к подпрограмме (или подтипа) определяет глобальные переменные, к которым можно обратиться при вызове через объект (или любой объект этого подтипа), включая выражения утверждений, которые применяются.
Для предопределённого оператора элементарного типа, функции, представляющей литерал перечисления или любой другой статической функции (см. 4.9), аспект Global равен null. Для предопределённого оператора составного типа аспект Global по умолчанию является таковым для окружающего библиотечного модуля (если для типа не указан аспект Global — см. H.7).
Следующее определяется в терминах операций, выполняемых или от лица объекта. Правила операций применяются к объекту(ам), связанному(ым) с этими операциями.
Глобальные переменные, связанные с любым global_mode, могут быть считываемы в качестве побочного эффекта операции. Режимы in out и out global_mode вместе определяют набор глобальных переменных, которые могут быть обновлены в качестве побочного эффекта операции. Создание значения доступа к переменной, обозначающего объект, считается обновлением обозначенного объекта, а создание значения доступа к константе, обозначающего объект, считается чтением обозначенного объекта.
Общий набор объектов, связанных с каждым global_mode, включает все объекты, определённые для режима в global_aspect_definition.
Множество global_set определяет множество глобальных переменных следующим образом:
  • all определяет множество всех глобальных переменных;
  • synchronized определяет множество всех синхронизированных переменных (см. 9.10), а также переменных составного типа, все недискриминационные подкомпоненты которых являются синхронизированными;
  • global_name{, global_name} определяет объединение множеств переменных, определённых именами global_name в списке, для следующих форм global_name:
object_name определяет указанную глобальную переменную (или константу);
package_name определяет множество всех переменных, объявленных в закрытой части или теле пакета, или где-либо в закрытом потомке пакета.

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

В пределах global_aspect_definition определённый global_mode должен быть задан не более одного раза. Аналогично, в рамках global_aspect_definition определённый объект должен быть назван не более одного раза с помощью global_name.
Если объект (кроме библиотечного пакета или параметрического библиотечного пакета) имеет аспект Global, отличный от Неопределённого или in out all, то связанная операция(и) должна считывать только те переменные, глобальные для объекта, которые находятся в множестве глобальных переменных, связанных с режимами in, in out или out global_mode, и операция(и) должна обновлять только те переменные, глобальные для объекта, которые находятся в множестве глобальных переменных, связанных с режимами in out или out global_mode. В отсутствие ограничения No_Hidden_Indirect_Globals (см. H.4), это игнорирует объекты, достижимые через разыменование значения доступа. Приведенное выше правило включает любые возможные эффекты Global вызовов, происходящих во время выполнения операции, за исключением следующих исключённых вызовов:
  • вызовы формальных подпрограмм;
  • вызовы, связанные с операциями на формальных подтипах;
  • вызовы через формальные объекты типа доступа к подпрограмме;
  • вызовы через параметры доступа к подпрограмме;
  • вызовы на операциях с аспектом Global Неопределено.
Возможные глобальные эффекты этих исключенных вызовов (кроме тех, которые не определены) учитываются вызывающей стороной исходной операции, предполагая, что они происходят по меньшей мере один раз во время ее выполнения. Для вызовов, которые не исключены, возможные глобальные эффекты вызова соответствуют разрешенным глобальным аспектом связанного сущности или глобальным аспектом класса, если это вызов диспетчеризации.
Если к типу доступа к подпрограмме применяется глобальный аспект, отличный от Неопределенного или вход/выход, то префикс префикса атрибута доступа ссылка_на_атрибут, производящего значение такого типа, должен указывать на подпрограмму, чей глобальный аспект не Неопределенный и покрыт аспектом типа результата, где глобальный аспект G1 покрыт глобальным аспектом G2, если множество переменных, которые G1 идентифицирует как читаемые или изменяемые, является подмножеством соответствующего множества для G2. Аналогично при преобразовании к такому типу операнд должен быть типа именованного доступа к подпрограмме, чей глобальный аспект покрыт аспектом целевого типа.
Если определённый реализацией режим_глобальности применяется к заданному набору переменных, определенное реализацией правило определяет, какие типы ссылок на них разрешены.
Для подпрограммы, которая является вызывающей операцией помеченного типа T, каждый режим ее глобального аспекта должен определять подмножество переменных, идентифицированных соответствующим режимом или режимом вход/выход глобального аспекта класса соответствующей вызывающей подпрограммы любого предка T, если аспект этого предка не Неопределенный.

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

Реализация может разрешить некоторые ссылки на объект-константу, которые не учитываются глобальным или глобальным аспектом класса, когда он рассматривается как переменная в вышеуказанных правилах, если реализация может определить, что объект на самом деле неизменяем.
Реализации могут выполнять дополнительные проверки вызовов операций с неопределенным глобальным аспектом, чтобы убедиться, что они не нарушают никаких ограничений, связанных с точкой вызова.
Реализации могут расширять синтаксис или семантику глобального аспекта способом, определённым реализацией; например, поддерживая дополнительные режимы_глобальности.
ПРИМЕЧАНИЕ. Пример использования этих аспектов см. в определении контейнера Vector в A.18.2.


Spec-Zone.ru

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