Spec-Zone.ru › Ada 2005
Справочное руководство Ada 2005

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

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

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

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

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

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

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

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

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

Если реализация поддерживает директиву 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 игнорируется.
Этот абзац был удалён.

Примеры

Пример директив интерфейса:
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