Ада-95. Компилятор GNAT

         

Атрибуты типов определенные в реализации компилятора GNAT


Список атрибутов типов определенных .

Standard'Abort_Signal

 - 

где Standard - единственно возможный префикс.

Предусматривает сущность для специального исключения, которая используется при принудительном завершении задачи или асинхронной передаче управления.

Обычно, этот атрибут должен использоваться только в окружении задачи

(атрибут достаточно специфичен и выходит за пределы нормальной семантики Ады; он предназначен для пользовательских программ перехватывающих исключение принудительного завершения).

   

Standard'Address_Size

 - 



где Standard - единственно возможный префикс.

Статическая константа представляющая количество битов в представлении адреса ('Address). Ее первичное предназначение - построение описания Memory_Size

в пакете Standard, однако она может быть свободно использована в программах пользователя.

   

'Asm_Input

 - 

Определяет функцию которая принимает два параметра. Первый параметр - это строка, а второй параметр - это выражение типа определяемое префиксом. Первый параметр (строка) должен быть статическим выражением и является ограничением для параметра (например, указывает требуемый регистр процессора). Второй аргумент это значение которое будет использоваться как аргумент ввода. Допустимые значения для констант будут такими же как и используемые в RTL, и они зависят от файла конфигурации который был использован для построения генератора кода GCC (GCC back end).

   

'Asm_Output

 - 

Определяет функцию которая принимает два параметра. Первый параметр - это строка, а второй параметр - это имя переменной определяемое префиксом. Первый параметр (строка) должен быть статическим выражением и является ограничением для параметра (например, указывает требуемый тип регистра процессора). Второй аргумент это переменная в которой будет сохранен результат.

Допустимые значения для констант будут такими же как и используемые в RTL, и они зависят от файла конфигурации который был использован для построения генератора кода GCC (GCC back end).



Если операнды вывода отсутствуют, то аргумент может быть опущен или явно указан как No_Output_Operands.
   
'AST_Entry  -  Этот атрибут реализован только для работы с OpenVMS версией GNAT.
   
obj'Bit  -  где obj: любой объект. Возвращает битовое смещение в элементе памяти (как правило байте) в котором находится первый бит пространства размещенного для объекта obj. Возвращаемое этим атрибутом значение имеет тип Universal_Integer, величина которого всегда не отрицательна и не достигает величины System.Storage_Unit. Для объектов, которые являются переменными или константами размещаемыми в регистре возвращаемое значение - нуль (использование этого атрибута не обязывает размещать переменные в памяти). Для объектов, которые являются формальными параметрами, этот атрибут применяется как для совпадающего фактического параметра, так и для копии совпадающего фактического параметра. Для ссылочных объектов, возвращаемое значение - нуль. Примечательно, что obj.all'Bit является объектом проверки Access_Check для обозначенного объекта. Подобным образом, этот атрибут для компонента записи X.C'Bit является объектом проверки дискриминанта, а в случае массива X(I)'Bit или X(I1..I2)'Bit - объектом проверки индекса. Этот атрибут был разработан для совместимости с описанием и реализацией атрибута 'Bit в DEC Ada 83.
   
'Bit_Position  -  R.C'Bit где R - это запись, а C - это одно из полей типа записи, возвращает битовое смещение внутри записи, которое содержит первый бит пространства размещенного для объекта. Возвращаемое этим атрибутом значение имеет тип Universal_Integer. Величина значения зависит только от указанного поля типа записи C и не зависит от выравнивания.
   
'Code_Address  - 
Атрибут 'Address может быть применен для подпрограмм Ады, но предполагаемый эффект, согласно руководства по языку (RM-95), должен предусматривать адресное значение, которое может быть использовано для вызова подпрограммы подразумевая использование адресного выражения как в данном примере:


procedure K is ... procedure L; for L'Addressuse K'Address; pragma Import (Ada, L); После чего вызов L ожидается как результат вызова K. В Ada 83, где не предусматривалось ссылочных типов для подпрограмм, это был широко используемый прием для получения эффекта косвенного вызова. GNAT реализует показанное в примере выше использование атрибута 'Address, и подобные приемы работают правильно. Однако, в некоторых случаях, полезно иметь возможность получить значение адреса начала сгенерированного для подпрограммы кода. На некоторых архитектурах в этом нет необходимости, также как и в использовании приема показанного в примере выше. Например, значение 'Address может быть ссылкой на дескриптор подпрограммы, а не на саму подпрограмму. Атрибут 'Code_Address, который может быть использован только для подпрограмм, всегда возвращает адрес начала сгенерированного для указанной подпрограммы кода, который может соответствовать или не соответствовать значению которое возвращает атрибут 'Address.
   
Standard'Default_Bit_Order  -  где Standard - единственно возможный префикс. Предусматривает значение System.Default_Bit_Order как значение 'Pos (0 для High_Order_First, и 1 для Low_Order_First). Это используется для построения описания Default_Bit_Order в пакете System.
   
U'Elaborated  -  где U: имя модуля. Возвращаемое значение имеет тип Boolean и индицирует была ли выполнена элаборация указанного модуля. Этот атрибут первоначально был предназначен для внутреннего использования генерируемым кодом для проверки динамической элаборации, но он также может быть использован в программах пользователя. Возвращаемое значение всегда будет True, как только выполнена элаборация всех модулей.
   
P'Elab_Body  - 
где P: имя программного модуля.

Возвращает объекты для соответствующей процедуры элаборации для выполнения элаборации тела указанного модуля.

Атрибут используется в главной процедуре элаборации редактора связей (binder) и, обычно, не должен использоваться в любом другом контексте.


Однако, могут возникнуть какие-либо особенные ситуации в которых использование этого атрибута может оказаться полезным для получения возможности вызвать процедуру элаборации из кода Ады (например, в случае необходимости выполнения выборочной переэлаборации для исправления какой-либо ошибки).
   
P'Elab_Spec  -  где P: имя программного модуля. Возвращает объекты для соответствующей процедуры элаборации для выполнения элаборации спецификации указанного модуля. Атрибут используется в главной процедуре элаборации редактора связей (binder) и, обычно, не должен использоваться в любом другом контексте. Однако, могут возникнуть какие-либо особенные ситуации в которых использование этого атрибута может оказаться полезным для получения возможности вызвать процедуру элаборации из кода Ады (например, в случае необходимости выполнения выборочной переэлаборации для исправления какой-либо ошибки).
   
'Emax  -  Этот атрибут предусмотрен для совместимости с Ada 83.
   
S'Enum_Rep  - 
где S: перечислимый тип, объект перечислимого типа или несовмещенный перечислимый литерал.

Для перечислимого типа обозначает функцию, которая имеет следующую спецификацию:

function S'Enum_Rep (Arg : S'Base) return Universal_Integer;

Для объекта перечислимого типа или несовмещенного перечислимого литерала S'Enum_Rep эквивалентен T'Enum_Rep(S) где T - это тип перечислимого литерала или объекта S.

Функция возвращает значение внутреннего представления для указанного перечислимого значения, которое будет равно значению возвращаемому атрибутом 'Pos

если отсутствует спецификация представления.

Этот атрибут статический (то есть, результат статический, если аргумент статический).

Атрибут S'Enum_Rep также может быть использован для целочисленных типов и объектов.

В таких случаях, он просто возвращает целочисленное значение.

Смысл этого в том, чтобы разрешить его использование для дискретных формальных аргументов (<>) в настраиваемых модулях, которые могут быть конкретизированы как с перечислимыми типами, так и с целочисленными типами.
   
'Epsilon  -  Предусмотрен для обеспечения совместимости с Ada 83.
   
S'Fixed_Value  -  где S: вещественный тип с фиксированной точкой. Обозначает функцию, которая имеет следующую спецификацию: function S'Fixed_Value (Arg : Universal_Integer) return S; Возвращаемое значение V - это вещественное значение с фиксированной точкой, подобное: V = Arg * S'Small Таким образом, это эквивалентно: сначала, преобразованию аргумента в значение целочисленного типа, используемого для представления S, а затем, выполнению непроверяемого преобразования в вещественный тип с фиксированной точкой. Первоначально, этот атрибут был предназначен для реализации функций ввода/вывода для значений вещественного типа с фиксированной точкой.
   
T'Has_Discriminants  -  где T: тип. Возвращенное значение типа Boolean будет True в случае когда тип T имеет дискриминант, и False - в обратном случае. Предполагается использование этого атрибута совместно с описаниями настраиваемых модулей. Если атрибут используется с приватным настраиваемым типом, то он индицирует имеет ли фактический тип дискриминант.
   
'Img  -  Этот атрибут отличается от стандартного атрибута 'Image тем, что он может быть использован как с объектами, так и с типами. В обоих случаях он возвращает 'Image для подтипа объекта. Это удобно для отладки: Put_Line ("X = " & X'Img); будет иметь такой же смысл, что и более "многословная" запись: Put_Line ("X = " & type'Image (X)); где type - это подтип объекта X.
   
S'Integer_Value  - 
где S: целочисленный тип.

Обозначает функцию, которая имеет следующую спецификацию:

function S'Integer_Value

(Arg : Universal_Fixed) return S;

Возвращаемое значение V подобно:

Arg = V * type'Small

Таким образом, это эквивалентно: сначала, выполнению непроверяемого преобразования из вещественного типа с фиксированной точкой в соответствующий ему тип реализации, а затем, преобразование результата в целочисленный тип назначения.


Первоначально этот атрибут был предназначен для использования в функциях стандартного ввода/вывода для вещественных типов с фиксированной точкой.
   
'Large  -  Предусмотрен для обеспечения совместимости с Ada 83.
   
'Machine_Size  -  Этот атрибут идентичен атрибуту 'Object_Size и предусмотрен для совместимости с одноименным атрибутом компилятора DEC Ada 83.
   
'Mantissa  -  Предусмотрен для обеспечения совместимости с Ada 83.
   
Standard'Max_Interrupt_Priority  -  где Standard - единственно возможный префикс. Предоставляет значение System.Max_Interrupt_Priority и первоначально предназначен для построения этого описания в пакете System.
   
Standard'Max_Priority  -  где Standard - единственно возможный префикс. Предоставляет значение System.Max_Priority и первоначально предназначен для построения этого описания в пакете System.
   
Standard'Maximum_Alignment  -  где Standard - единственно возможный префикс. Предоставляет максимальное пригодное значение выравнивания для целевой платформы. Это статическое значение которое может быть использовано для указания требуемого выравнивания объектов. При этом во всех случаях будет гарантироваться правильность выравнивания объектов Это может быть полезно при импортировании внешних объектов, когда требования для их выравнивания не известны.
   
'Mechanism_Code  - 
function'Mechanism_Code

возвращает целочисленный код, который определяет используемый механизм для передачи результата вызова функции function, а subprogram'Mechanism_Code(n)

возвращает целочисленный код, который определяет используемый механизм для передачи формального параметра с порядковым номером n

(статическое целочисленное значение, 1 - подразумевает первый параметр) подпрограммы subprogram.



Смысл возвращаемых кодов следующий:

1  -  по значению (by copy / value)
2  -  по ссылке (by reference)
3  -  по дескриптору (by descriptor / default descriptor class)
4  -  по дескриптору (by descriptor / UBS: unaligned bit string)
5  -  по дескриптору (by descriptor / UBSB: aligned bit string with arbitrary bounds)
6  -  по дескриптору (by descriptor / UBA: unaligned bit array)
7  -  по дескриптору (by descriptor / S: string, also scalar access type parameter)
8  -  по дескриптору (by descriptor / SB: string with arbitrary bounds)
9  -  по дескриптору (by descriptor / A: contiguous array)
10  -  по дескриптору (by descriptor / NCA: non-contiguous array)
Значения 3-10 справедливы только для Digital OpenVMS реализации GNAT.     'Null_Parameter  -  Ссылка T'Null_Parameter

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

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

Такая возможность необходима для спецификации того, что нулевой адрес должен быть передан для записи или другого составного объекта передаваемого по ссылке. Другого способа такой индикации, без использования атрибута 'Null_Parameter, не существует.     'Object_Size  -  Размер какого-либо объекта не обязан быть таким же самым как размер типа объекта, поскольку размер объекта по умолчанию увеличен в соответствии с выравниванием объекта.

Например, Natural'Object_Size

равен 31 бит, а размер объекта типа Natural по умолчанию будет иметь размер 32 бита. Подобным образом, запись которая содержит Integer и Character:

type Rec is record

I : Integer; C : Character; end record;

будет иметь размер 40 бит (Rec'Size будет 40 бит; выравнивание будет 4, из-за поля типа Integer; таким образом размер записи этого типа по умолчанию будет 64 бита или 8 байт).

Атрибут T'Object_Size был добавлен к реализации GNAT, чтобы обеспечить легкое определение размера объекта типа T по умолчанию.

Например Natural'Object_Size равен 32 бита, а Rec'Object_Size (для записи из примера) будет 64.

Примечательно также то, что в отличие от ситуации с атрибутом 'Size

который описан в руководстве по языку, атрибут 'Object_Size может быть определен индивидуально для различных подтипов. Например:

type R is new Integer; subtype R1 is R range 1 .. 10; subtype R2 is R range 1 .. 10; for R2'Object_Size use 8;

В этом примере R'Object_Size и R1'Object_Size, оба равны 32, поскольку размер объекта по умолчанию для подтипа такой же как и размер для подтипа-предка.

Это подразумевает, что размер по умолчанию для объектов с типами R и R1

будет 32 бита (4 байта).

Но объекты типа R2 будут иметь только 8 бит (1 байт), поскольку R2'Object_Size был установлен в 8.     T'Passed_By_Reference  -  где T: тип.

Возвращает значение типа Boolean которое равно True если тип T

может быть нормально передан по ссылке и False если тип T

может быть нормально передан по значению при вызове. Для скалярных типов результат всегда будет False и является статическим. Для не скалярных типов, результат - не статический.     T'Range_Length  -  где T: любой дискретный тип.

Возвращает число значений представляемых типом (нуль, в случае пустого диапазона значений). Результат статический для статических типов. Этот атрибут применяется для типов индекса одномерных массивов и дает те же результаты, что и атрибут 'Range

для того же массива.     'Safe_Emax  -  Предусмотрен для обеспечения совместимости с Ada 83.     'Safe_Large  -  Предусмотрен для обеспечения совместимости с Ada 83.     'Small  -  Этот атрибут предусмотрен в Ada-95 только для вещественных типов с фиксированной точкой. GNAT, для обеспечения совместимости с Ada 83, допускает использование этого атрибута для вещественных типов с плавающей точкой.     Standard'Storage_Unit  -  где Standard - единственно возможный префикс.

Предоставляет значение System.Storage_Unit

и первоначально предназначен для построения этого описания в пакете System.     Standard'Tick  -  где Standard - единственно возможный префикс.

Предоставляет значение System.Tick

и первоначально предназначен для построения этого описания в пакете System.     System'To_Address  -  где System - единственно возможный префикс.

Обозначает функцию которая идентична System.Storage_Elements.To_Address

с тем исключением, что это статический атрибут.

Это подразумевает, что подобное выражение может быть использовано в контексте (например, при преэлаборации пакета) который требует использования статических выражений и где не может быть использован вызов функции (поскольку вызов функции всегда является не статическим, даже при статических аргументах).     T'Type_Class  -  где T: любой тип.

Возвращает значение класса типа для типа T.

Если тип T является настраиваемым типом, то возвращаемое значение будет значением соответствующего фактического типа.

Значение этого атрибута имеет тип System.Aux_DEC.Type_Class, который имеет следующее описание:

type Type_Class is

(Type_Class_Enumeration, Type_Class_Integer, Type_Class_Fixed_Point, Type_Class_Floating_Point, Type_Class_Array, Type_Class_Record, Type_Class_Access, Type_Class_Task, Type_Class_Address);

Защищенные типы возвращают значение Type_Class_Task, которое, таким образом, подходит для всех многозадачных типов. Этот атрибут был разработан для обеспечения совместимости с одноименным атрибутом компилятора DEC Ada 83.     P'UET_Address  -  где P: библиотечный пакет.

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

Этот атрибут предназначен для использования только с реализацией GNAT.

См. модуль Ada.Exceptions в файлах "a-except.ads" и "a-except.adb" для получения более полной информации о том как эти атрибуты используются в реализации.     N'Universal_Literal_String  -  где N: именованное число.

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

Это позволяет пользователю программы получить доступ к фактическому тексту описания именованных чисел без промежуточного преобразования и без необходимости заключения строк в кавычки (которые препятствуют использование строк как чисел).

Это имеет внутреннее использование для построения значений вещественных атрибутов с плавающей точкой из файла "ttypef.ads", но может быть также использовано в программах пользователя.     'Unrestricted_Access  -  Этот атрибут подобен атрибуту 'Access, за исключением того, что отсутствуют проверка на доступность и проверка представления косвенного доступа.

Ответственность за правильность использования полностью возлагается на пользователя.

Это подобно атрибуту 'Addess, для которого необходима замена в тех случаях, когда требуемое значение должно иметь ссылочный тип.

Другими словами, эффект действия этого атрибута идентичен первоначальному получению атрибута 'Addess

с последующим непроверяемым преобразованием в требуемое значение ссылочного типа.

В GNAT, но не обязательно в других реализациях, использование статической цепочки для подпрограмм внутреннего уровня подразумевает, что 'Unrestricted_Access, примененный для подпрограммы, возвращает значение, которое может быть вызвано пока подпрограмма находится в области действия (видимости).

Нормальные правила доступа/видимости в Ada 95 ограничивают такое использование.     'VADS_Size  -  Для обеспечения совместимости с компилятором VADS Ada 83.

    T'Value_Size  -  где T: тип.

Возвращает число бит, которое требуется для представления значений указанного типа T.

Это то же самое, что и T'Size, но в отличие от 'Size, может быть установлено для не первого подтипа.     Standard'Wchar_T_Size  -  где Standard - единственно возможный префикс.

Предоставляет битовый размер типа wchar_t языка C

и первоначально предназначен для построения этого типа в пакете Interfaces.C.

Примечание: отсутствует в реализации GNAT V 3.13p.     Standard'Word_Size  -  где Standard - единственно возможный префикс.

Предоставляет значение System.Word_Size

и первоначально предназначен для построения этого описания в пакете System.
Содержание раздела