Справочник Ada 2012
E.2.3 Модули библиотеки интерфейса удалённых вызовов
Модуль библиотеки интерфейса удалённых вызовов может использоваться в качестве интерфейса для удалённых вызовов процедур (RPC) (или удалённых вызовов функций) между активными разделами.
Синтаксис
Форма псевдодирективы Remote_Call_Interface выглядит следующим образом:
pragma Remote_Call_Interface[(имя_модуля_библиотекиимя)];
Форма псевдодирективы All_Calls_Remote выглядит следующим образом:
pragma All_Calls_Remote[(имя_модуля_библиотекиимя)];
Псевдодиректива All_Calls_Remote относится к модулю библиотеки.
Правила законности
Псевдодиректива Remote_Call_Interface используется для указания того, что модуль библиотеки является интерфейсом удалённого вызова (RCI), а именно, что аспект Remote_Call_Interface модуля библиотеки имеет значение True. Подпрограмма, объявленная во видимой части такого модуля библиотеки или объявленная таким модулем библиотеки, называется удалённой подпрограммой.
Объявление модуля библиотеки RCI должно быть предварительно вычисляемым (см. 10.2.1) и должно семантически зависеть только от объявленных чистых элементов_библиотеки, общих пассивных модулей библиотеки, модулей библиотеки удалённых типов, других модулей библиотеки интерфейса удалённых вызовов или предварительно вычисленных обычных модулей библиотеки, которые упоминаются только в частных разделах с.
Кроме того, на модуль библиотеки RCI накладываются следующие ограничения:
- его видимая часть не должна содержать объявление переменной;
- его видимая часть не должна содержать объявление ограниченного типа;
- его видимая часть не должна содержать вложенного объявления_обобщения;
- он не должен содержать, и его видимая часть не должна содержать, объявление подпрограммы, для которой аспект Inline имеет значение True;
- он не должен содержать, и его видимая часть не должна содержать, объявление подпрограммы (или доступа к подпрограмме), профиль которой имеет параметр или результат типа, который не поддерживает внешнюю передачу данных (см. 13.13.2);
- любой общедоступный дочерний элемент модуля библиотеки должен быть модулем библиотеки интерфейса удалённого вызова.
Псевдодиректива All_Calls_Remote устанавливает аспект All_Calls_Remote модуля библиотеки, к которому относится псевдодиректива, в значение True. Если аспект All_Calls_Remote модуля библиотеки имеет значение True, модуль библиотеки должен быть интерфейсом удалённого вызова.
Правила после компиляции
Модуль библиотеки интерфейса удалённого вызова должен быть назначен не более чем одному разделу данного программы. Модуль библиотеки интерфейса удалённого вызова, родитель которого также является модулем библиотеки RCI, должен быть назначен только тому же разделу, что и его родитель.
Несмотря на правило, приведённое в 10.2, единица компиляции в данном разделе, которая семантически зависит от объявления модуля библиотеки RCI, _нуждается_ (в смысле 10.2) только в объявлении модуля библиотеки RCI, а не в теле, для включения в тот же раздел. Поэтому тело модуля библиотеки RCI включается только в раздел, которому модуль библиотеки RCI явно назначен.
Требования к реализации
Если аспект All_Calls_Remote имеет значение True для данного модуля библиотеки RCI, то реализация должна маршрутизировать любые из следующих вызовов через Подсистему связи разделов (PCS); см. E.5:
- Прямой вызов подпрограммы модуля RCI извне области объявления модуля;
- Непрямой вызов через значение удалённого доступа к подпрограмме, которое определяет подпрограмму модуля RCI;
- Вызов распределения с управляемым операндом, определённым удалённым значением доступа к классу, метка которого идентифицирует тип, объявленный в модуле RCI.
Разрешения для реализации
Реализация может не поддерживать псевдодирективу Remote_Call_Interface или аспект, а также псевдодирективу All_Calls_Remote. Явная обмен сообщениями между активными разделами может быть поддержан в качестве альтернативы RPC.