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

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(string_expression);
Pragma Linker_Options разрешено только в месте declarative_item.
Этот абзац был удалён.

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

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

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

Аспект Convention должен быть задан с помощью convention_identifier, который должен быть именем соглашения. Имена соглашений определяются реализацией, за исключением определённых языковых, таких как Ada и Intrinsic, как описано в 6.3.1, «Правила соответствия». Дополнительные имена соглашений обычно представляют соглашения вызова для других языков, реализаций языков или конкретных моделей выполнения. Соглашение вызываемой сущности — это её соглашение вызова.
Если L — convention_identifier языка, то тип 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 — анонимный тип доступа, и T подходит для соглашения L,
  • Реализация допускает T как L-совместимый тип.
Если аспект Convention задан для типа, то тип должен быть совместим или пригоден для указанного соглашения.
Если для типа T задано соглашение L, то для каждого компонента T, имеющего анонимный тип доступа, соглашение анонимного типа доступа — L. Если для объекта, имеющего анонимный тип доступа, задано соглашение L, то соглашение анонимного типа доступа — L.
Несмотря на любые другие правила, объявление с аспектом Import со значением True не должно иметь завершения.
Сущность с аспектом Import (или Export) со значением True считается импортированной (соответственно, экспортированной). Сущность не может быть одновременно импортированной и экспортированной.
Объявление импортированного объекта не должно включать явное выражение инициализации. Инициализации по умолчанию не выполняются.
Тип импортированного или экспортированного объекта должен быть совместим с указанным аспектом Convention, если таковой указан.
Для импортированной или экспортированной подпрограммы типы результата и параметров должны быть совместимы с указанным аспектом Convention, если таковой указан.
aspect_definition (если таковой есть), используемый для непосредственного указания аспектов Import, Export, External_Name или Link_Name, должен быть статическим выражением. Выражение string_expression в 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 имеет эффект передачи своего строкового аргумента в качестве параметра системному линковщику (если он существует), если непосредственно окружающий блок компиляции включён в раздел, который подлежит линковке. Интерпретация строкового аргумента и способ объединения строковых аргументов из нескольких pragma Linker_Options определяются реализацией.

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

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

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

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

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

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

Примеры

Пример аспектов взаимодействия:
package Fortran_Library is
function Sqrt (X : Float) return Float
with Import => True, Convention => Fortran;
type Matrix is array (Natural range <>, Natural range <>) of Float
with Convention => Fortran;
function Invert (M : Matrix) return Matrix
with Import => True, Convention => Fortran;
end Fortran_Library;


Spec-Zone.ru

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