Предоставьте ADA API C / C ++ (масштабируемый способ)

Недавно я столкнулся с критической системой безопасности, которая использует только Ada. Система предоставляет около 3 пакетов с примерно 200-300 функциями в каждом пакете в качестве источника.

Мне нужно получить доступ почти ко всем этим функциям в другой программной системе (очень красивой и аккуратной), полностью написанной на C / C ++.

Цель: Мне нужно выставить эти функции Ada на C / C ++.

Я понимаю, что могу использовать pragma Export() Конструкция для экспорта функций и пакетов interface.C для преобразования параметров между C и Ada.

Но мне было интересно, есть ли более простой или более масштабируемый способ сделать это?

  1. Может быть, выставить полный пакет как-нибудь?
  2. Или разработать архитектуру RPC?
  3. Или использовать инструмент, который создает объявления C / C ++ и преобразования типов?

Было бы действительно полезно, если бы кто-то с подобным опытом мог указать мне правильное направление.

Помни я не ищу Переводчик Ada to C

0

Решение

Вы можете попробовать добавить Export а также Convention => X аспекты пакета, если вы используете компилятор Ada 2012; пример:

Package K with Export, Convention => C_Plus_Plus is

Function A( Input_1, Input_2 : Integer ) return Integer;

End K;

Это на самом деле компилируется, хотя, так как у меня нет проектов C ++ или C со смешанным исходным кодом, чтобы попробовать это, я не могу сказать вам, можно ли результаты строго использовать со стороны C ++.

Если это не сработает, возможно, лучшим способом было бы создать пакет, особенно для экспорта функций (и типов), которые будут использоваться на стороне C ++.

With
System,
Interfaces.C.Strings,
Interfaces.C.Pointers;

Package K with Convention => C_Plus_Plus is

-------------
--  TYPES  --
-------------

Type CPP_Window_Handle is Private;
Subtype CPP_String is Interfaces.C.Strings.chars_ptr;

--------------
-- MODULES  --
--------------

Package UI_Module is
Procedure Set_Title( Window : CPP_Window_Handle; Text : CPP_String )
with Export;
End UI_Module;

Private
Package STUB_TYPES is
Type Window is tagged null record;
End STUB_TYPES;
Use STUB_TYPES;

Type CPP_Window_Handle is not null access Window'Class
with Convention => C_Plus_Plus, Size => Interfaces.C.int'Size;

End K;

Реализуется как:

Package Body K is

Package STUB_FUNCTIONS is
Procedure Set_Window(Object : in out STUB_TYPES.Window'Class; Text : String) is null;
--'
End STUB_FUNCTIONS;

Package Ada_Dependencies renames STUB_FUNCTIONS;

Package Body UI_Module is
Procedure Set_Title( Window : CPP_Window_Handle; Text : CPP_String ) is
function Value (Item : CPP_String) return Interfaces.C.char_array
renames Interfaces.C.Strings.Value;
function Convert(Item     : Interfaces.C.char_array;
Trim_Nul : Boolean := True) return String
renames Interfaces.C.To_Ada;
Begin
Ada_Dependencies.Set_Window(
Object => Window.all,
Text   => Convert( Value( Text ) )
);
End Set_Title;

End UI_Module;

End K;
1

Другие решения

Других решений пока нет …