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

B.1 Аспекты взаимодействия

Аспект взаимодействия — это аспект представления, который является одним из аспектов Import, Export, Link_Name, External_Name или Convention.
Указание аспекта Import со значением True используется для импорта сущности, определенной на другом языке, в программу Ada, что позволяет вызывать процедуру на другом языке из Ada или обращаться к переменной на другом языке из Ada. Напротив, указание аспекта Export со значением True используется для экспорта сущности Ada на другой язык, позволяя вызывать процедуру Ada с другого языка или обращаться к объекту Ada с другого языка. Аспекты Import и Export предназначены в первую очередь для объектов и процедур, хотя реализации могут поддерживать и другие сущности. Аспекты Link_Name и External_Name используются для указания имени связи и внешнего имени соответственно, которые будут использоваться для идентификации импортированных или экспортированных сущностей во внешней среде.
Аспект Convention используется для указания того, что сущность Ada должна использовать соглашения другого языка. Он предназначен в первую очередь для типов и процедур «обратного вызова». Например, «with Convention => Fortran» в объявлении типа массива Matrix означает, что Matrix должен быть представлен в соответствии с соглашениями поддерживаемой реализации Fortran, а именно в порядке следования столбцов.
Для указания параметров системного линкера, необходимых при включении данного модуля компиляции в раздел, используется pragma Linker_Options.

Синтаксис

Форма pragma Linker_Options следующая:
Абзацы с 5 по 7 были перемещены в Приложение J, «Устаревшие возможности»
pragma Linker_Options(строковая_выражение);
Предикат pragma Linker_Options разрешен только в месте элемента_объявления.
Этот абзац был удален.

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

Аспекты Import и Export имеют тип Boolean.
Аспекты Link_Name и External_Name имеют тип String.
Ожидаемый тип для строковой_выражение в pragma Linker_Options — String.

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

Аспект Convention должен быть задан идентификатором_соглашения, который должен быть именем соглашения. Имена соглашений определяются реализацией, за исключением определенных языком, таких как Ada и Intrinsic, как описано в 6.3.1, «Правила соответствия». Дополнительные имена соглашений обычно представляют соглашения о вызовах на других языках, реализации языков или конкретные модели выполнения. Соглашение вызываемой сущности — это её соглашение о вызове.
Если L — идентификатор_соглашения языка, то тип T считается совместимым с соглашением L (или, альтернативно, L-совместимым типом), если выполняются следующие условия:
  • T объявлен в пакете интерфейса языка, соответствующем L, и определен как L-совместимый (см. B.3, B.3.1, B.3.2, B.4, B.5),
  • Для T задано соглашение L, и T подходит для соглашения L; то есть:
T — тип перечисления, при этом все внутренние коды (присвоенные по умолчанию или явно) находятся в определённом реализацией диапазоне, который включает, как минимум, диапазон значений 0 .. 2**15–1;
T — тип массива с неограниченным или статически ограниченным первым подтипом, и его компонентный тип L-совместим,
T — тип записи без дискриминантов и только с компонентами со статически ограниченными подтипами, и каждый компонентный тип L-совместим,
T — тип указателя на объект, его указанный тип L-совместим, и его указанный подтип не является неограниченным подтипом массива,
T — тип указателя на процедуру, и типы параметров и результата его обозначенного профиля — все L-совместимы.
  • T получен из L-совместимого типа,
  • Реализация допускает T как L-совместимый тип.
Если аспект Convention указан для типа, то тип должен быть либо совместим с, либо пригоден для указанного соглашения.
Несмотря на любые противоречащие правила, объявление с аспектом Import со значением True не должно иметь завершение.
Сущность с аспектом Import (или Export) со значением True называется импортируемой (соответственно, экспортируемой). Сущность не может быть одновременно импортируемой и экспортируемой.
Объявление импортируемого объекта не должно содержать явного выражения инициализации. Инициализации по умолчанию не выполняются.
Тип импортируемого или экспортируемого объекта должен быть совместим с указанным аспектом Convention, если таковой имеется.
Для импортируемой или экспортируемой процедуры типы результата и параметров должны быть каждый совместимы с указанным аспектом Convention, если таковой имеется.
Определение_аспекта (если таковое имеется), используемый для прямого указания аспектов Import, Export, External_Name или Link_Name, должно быть статическим выражением. строковое_выражение для pragma Linker_Options должно быть статическим. Аспекты External_Name или Link_Name должны быть указаны только для сущности, которая импортируется или экспортируется.

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

Абзацы 28 и 29 были удалены.
Аспект Convention представляет соглашение о вызове или соглашение о представлении сущности. Для типа указателя на процедуру он представляет соглашение о вызове обозначенных процедур. Кроме того:
  • Аспект Import со значением True указывает, что сущность определена внешне (то есть вне программы Ada). Этот аспект никогда не наследуется; если он не указан напрямую, то аспект Import имеет значение False.
  • Аспект Export со значением True указывает, что сущность используется внешне. Этот аспект никогда не наследуется; если он не указан напрямую, то аспект Export имеет значение False.
  • Для сущности с аспектом Import или Export со значением True также может быть указано внешнее имя, имя связи или оба.
Внутреннее имя — это строковое значение для имени, используемого программой на другом языке, либо для сущности, которую импортирует программа Ada, либо для ссылки на сущность, которую экспортирует программа Ada.
Имя связи — это строковое значение для имени импортируемой или экспортируемой сущности, основанное на соглашениях компилятора другого языка при взаимодействии с системным инструментом линковки.
Значение имён связи определяется реализацией. Если ни имя связи, ни атрибут Address импортируемой или экспортируемой сущности не указаны, то имя связи выбирается реализацией в определённом ею порядке, на основе внешнего имени, если оно указано.
Pragma Linker_Options оказывает действие передачи своего строкового аргумента в качестве параметра системному линкеру (если он существует), если немедленно окружающий модуль компиляции включен в линкуемый раздел. Интерпретация строкового аргумента и способ комбинирования строковых аргументов из нескольких pragmas Linker_Options определяются реализацией.

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

Несмотря на то, что в данном Международном стандарте сказано иначе, выработка объявления с аспектом Import со значением True не создаёт сущности. Такая выработка не имеет другого эффекта, кроме как разрешить определяющему имени обозначать внешнюю сущность.

Ошибочное выполнение

Программист несет ответственность за обеспечение того, чтобы использование аспектов взаимодействия не нарушало семантику Ada; в противном случае выполнение программы является ошибочным.

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

Если реализация поддерживает Export для данного языка, то она должна также позволять писать главную подпрограмму на этом языке. Она должна поддерживать какой-либо механизм для вызова обработки единиц Ada-библиотеки, включенных в систему, и для вызова завершения задачи среды. В типичных системах рекомендуемым механизмом является предоставление двух процедур, имена связей которых — "adainit" и "adafinal". Adainit должен содержать код выработки единиц библиотеки. Adafinal должен содержать код завершения. Эти процедуры не должны иметь никакого эффекта при втором и последующих вызовах.
Должна быть обеспечена автоматическая обработка предварительно обработанных пакетов при указании аспекта Export как True.
Для каждой поддерживаемой конвенции L, отличной от Встроенной, реализация должна поддерживать указание аспектов Импорта и Экспорта для объектов типов, совместимых с L, и для подпрограмм, а также аспект Конвенции для типов и подпрограмм, подходящих для L, при условии, что другой язык имеет соответствующие возможности. Указание аспекта Конвенции не обязательно должно поддерживаться для скалярных типов, за исключением типов перечисления, внутренние коды которых находятся в диапазоне от 0 до 215–1.
ПРИМЕЧАНИЯ
1 Реализации могут накладывать ограничения на аспекты взаимодействия; например, требовать, чтобы каждый экспортируемый элемент объявлялся на уровне библиотеки.
2 Аспект Конвенции в сочетании с аспектом Импорта указывает конвенции для доступа к внешним сущностям. Возможно, что фактическая сущность написана на языке ассемблера, но отражает конвенции конкретного языка. Например, с Конвенцией => Ada можно использовать для взаимодействия с процедурой на языке ассемблера, которая подчиняется соглашениям вызова компилятора Ada.
3 Для получения «обратного вызова» подпрограмме Ada из среды иностранного языка аспект Конвенции должен быть указан как для типа доступа к подпрограмме, так и для конкретной подпрограммы(подпрограмм), к которой применяется 'Access.
Абзацы 45 и 46 были удалены.
4 См. также 13.8, «Вставки машинного кода».
5 Если для данного элемента заданы оба External_Name и Link_Name, то External_Name игнорируется.
Этот абзац был удален.

Примеры

Пример аспектов взаимодействия:
пакет Fortran_Library есть
функция Sqrt (X : Float) возвращает Float
с Импорт => True, Конвенция => Fortran;
тип Matrix есть массив (Natural диапазон <>, Natural диапазон <>) из Float
с Конвенция => Fortran;
функция Invert (M : Matrix) возвращает Matrix
с Импорт => True, Конвенция => Fortran;
конец Fortran_Library;


Spec-Zone.ru

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