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

B.1 Прагмы взаимодействия

Прагма Import используется для импорта сущности, определённой на другом языке, в программу Ada, что позволяет вызывать подпрограмму на другом языке из Ada или получать доступ к переменной на другом языке из Ada. В отличие от этого, прагма Export используется для экспорта сущности Ada на другой язык, что позволяет вызывать подпрограмму Ada из другого языка или получить доступ к объекту Ada из другого языка. Прагмы Import и Export предназначены в первую очередь для объектов и подпрограмм, хотя реализации могут поддерживать и другие сущности.
Прагма Convention используется для указания того, что сущность Ada должна использовать соглашения другого языка. Она предназначена в первую очередь для типов и подпрограмм «обратного вызова». Например, «pragma Convention(Fortran, Matrix);» подразумевает, что Matrix должен быть представлен согласно соглашениям поддерживаемой реализации Fortran, а именно, в порядке следования столбцов.
Прагма Linker_Options используется для указания параметров системного компоновщика, необходимых при включении данного блока компиляции в разбиение.

Синтаксис

Прагма взаимодействия — это прагма представления, которая является одной из прагм Import, Export или Convention. Их формы, вместе с формой связанной прагмы Linker_Options, приведены ниже:
pragma Import(
[Convention =>] идентификатор_соглашения, [Entity =>] локальное_имя
[, [External_Name =>] строковое_выражение] [, [Link_Name =>] строковое_выражение]);
pragma Export(
[Convention =>] идентификатор_соглашения, [Entity =>] локальное_имя
[, [External_Name =>] строковое_выражение] [, [Link_Name =>] строковое_выражение]);
pragma Convention([Convention =>] идентификатор_соглашения,[Entity =>] локальное_имя);
pragma Linker_Options(строковое_выражение);
Прагма Linker_Options разрешена только в месте declarative_item.
Для прагм Import и Export аргумент Link_Name не должен быть задан без pragma_argument_identifier, если не указан аргумент External_Name.

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

Ожидаемый тип для строкового_выражения в прагме взаимодействия или в прагме Linker_Options — String.

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

идентификатор_соглашения прагмы взаимодействия должен быть именем соглашения. Имена соглашений определяются реализацией, за исключением определённых языковых, таких как 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 в прагме Convention указано соглашение L, и T подходит для соглашения L; это значит:
  • T — тип массива с не ограниченной или статически ограниченной первой подтипизацией, а тип его компонентов — L-совместимый,
  • T — тип записи без дискриминантов и со компонентами со статически ограниченными подтипизациями, и каждый тип компонента — L-совместимый,
  • T — тип доступа к объекту, а тип его обозначения — L-совместимый,
  • T — тип доступа к подпрограмме, а параметры и результат его обозначенного профиля — все L-совместимые.
  • T получен от L-совместимого типа,
  • Реализация допускает T как L-совместимый тип.
Если прагма Convention применяется к типу, то тип должен быть совместим с или подходить для соглашения, указанного в прагме.
Прагма Import должна быть завершением объявления. Несмотря на любые правила, прагма Import может служить завершением любого вида (явного) объявления, если это поддерживается реализацией для этого вида объявления. Если завершение является прагмой Import, то оно должно находиться в той же declarative_part, package_specification, task_definition или protected_definition, что и объявление. Для библиотечной единицы она должна находиться в той же compilation, перед любыми последующими compilation_unit, кроме прагм. Если local_name обозначает более одной сущности, то прагма Import завершает все из них.
Сущность, указанная в качестве аргумента Entity для прагмы Import (или прагмы Export), считается импортированной (соответственно, экспортированной).
Объявление импортированного объекта не должно включать явного выражения инициализации. Значения по умолчанию не выполняются.
Тип импортированного или экспортированного объекта должен быть совместим с соглашением, указанным в соответствующей прагме.
Для импортированной или экспортированной подпрограммы результат и типы параметров должны быть совместимы с соглашением, указанным в соответствующей прагме.
Строковые выражения external name и link name прагмы Import или Export, и строковое выражение прагмы Linker_Options должны быть статическими.

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

Прагмы Import, Export и Convention являются прагмами представления, которые определяют аспект соглашения представления. Кроме того, прагмы Import и Export соответственно определяют аспекты импортирования и экспортирования представления.
Прагма взаимодействия является прагмой модуля, когда применяется к модулю (см. 10.1.5).
Прагма взаимодействия определяет соглашение сущности, обозначаемой локальным именем. Соглашение представляет соглашение о вызове или соглашение о представлении сущности. Для типа доступа к подпрограмме оно представляет соглашение о вызове обозначенных подпрограмм. Кроме того:
  • Прагма Import указывает, что сущность определена внешне (то есть, вне программы Ada).
  • Прагма Export указывает, что сущность используется внешне.
  • Прагма Import или Export необязательно указывает внешнее имя, имя связи или оба.
Внешнее имя — это строковое значение имени, используемое программой на другом языке для сущности, импортируемой программой Ada, или для ссылки на сущность, экспортируемую программой Ada.
Имя связи — это строковое значение имени экспортированной или импортированной сущности, основанное на соглашениях компилятора языка другого языка при взаимодействии со средством компоновки системы.
Значение имён связи определяется реализацией. Если не указано ни имя связи, ни атрибут Address импортированной или экспортированной сущности, то имя связи выбирается реализацией определённым образом, на основании внешнего имени, если оно указано.
Прагма Linker_Options имеет эффект передачи своего строкового аргумента в качестве параметра системному компоновщику (если он существует), если немедленно окружающая единица компиляции включена в разбиение, которое компилируется. Интерпретация строкового аргумента и способ объединения строковых аргументов из нескольких прагм Linker_Options определяются реализацией.

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

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

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

Если реализация поддерживает pragma Export для данного языка, то она также должна разрешать написания главной подпрограммы на этом языке. Она должна поддерживать некоторый механизм для вызова разработки модулей Ada, включенных в систему, и для вызова завершения задачи окружения. В типичных системах рекомендуемым механизмом является предоставление двух подпрограмм, имена связей которых являются "adainit" и "adafinal". Adainit должен содержать код разработки для модулей библиотеки. Adafinal должен содержать код завершения. Эти подпрограммы не должны иметь никакого эффекта при втором и последующих вызовах.
Автоматическая разработка предварительно разработанных пакетов должна предоставляться, когда поддерживается pragma Export.
Для каждой поддерживаемой конвенции L, отличной от Intrinsic, реализация должна поддерживать pragma Import и Export для объектов типов, совместимых с L, и для подпрограмм, а также pragma Convention для типов и подпрограмм, подходящих для L, предполагая, что другой язык имеет соответствующие возможности. Pragma Convention не обязательно должна поддерживаться для скалярных типов.
ПРИМЕЧАНИЯ
1 Реализации могут накладывать ограничения на прагмы взаимодействия; например, требуя, чтобы каждая экспортируемая сущность была объявлена на уровне библиотеки.
2 Pragma Import определяет соглашения для доступа к внешним сущностям. Возможно, что фактическая сущность написана на языке ассемблера, но отражает соглашения определённого языка. Например, pragma Import(Ada, ...) может использоваться для взаимодействия с процедурой на языке ассемблера, которая подчиняется соглашениям вызовов компилятора Ada.
3 Чтобы получить «обратный вызов» Ada-подпрограмме из среды иностранного языка, pragma Convention должен быть указан как для типа доступа к подпрограмме, так и для конкретной подпрограммы(подпрограмм), к которой применяется 'Access.
4 Незаконно указывать более одной из Import, Export или Convention для данной сущности.
5 local_name в прагме взаимодействия может обозначать более одной сущности в случае перегрузки. Такая pragma применяется ко всем обозначаемым сущностям.
6 См. также 13.8, «Вставки машинного кода».
7 Если для прагмы Import или Export указаны как External_Name, так и Link_Name, то External_Name игнорируется.
8 Прагма взаимодействия может привести к эффекту, нарушающему семантику Ada.

Примеры

Пример прагм взаимодействия:
package Fortran_Library is
function Sqrt (X : Float) return Float;
function Exp (X : Float) return Float;
private
pragma Import(Fortran, Sqrt);
pragma Import(Fortran, Exp);
end Fortran_Library;


Spec-Zone.ru

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