【问题标题】:Expose ADA API to C/C++ ( the Scalable way )将 ADA API 公开给 C/C++(可扩展的方式)
【发布时间】:2017-06-08 08:22:39
【问题描述】:

最近,我遇到了一个只使用 Ada 的安全关键系统。系统提供了大约 3 个包,每个包中大约有 200-300 个函数作为源。

我需要在另一个完全用 C/C++ 编写的软件系统(非常漂亮和简洁)中访问几乎所有这些功能。

目标:我需要将这些 Ada 函数公开给 C/C++。

我知道我可以使用pragma Export()构造导出函数和接口。C包在C和Ada之间转换参数。

但是,我想知道是否有更简单或更可扩展的方法来做到这一点?

  1. 也许会以某种方式暴露整个包?
  2. 或者开发一个 RPC 架构?
  3. 或者使用创建 C/C++ 声明和类型转换的工具?

如果有类似经验的人能指出我正确的方向,那真的很有帮助。

记住我不是在寻找Ada to C translator

【问题讨论】:

  • pragma Export 或相关方面(如果您正在使用 Ada 2012)是您正在寻找的,至少根据我对您目标的理解。您可以编写一个脚本来为您生成这些导出;这就是我要做的。
  • 对不起,我的意思是 C 或 C++ 都可以。最好是 C++。
  • @PatrickKelly :您能否详细说明您是如何使用该脚本的?我以前从未使用过脚本向 C 公开 ADA 函数。或者可能共享一个简单的脚本。谢谢
  • @Olaf 从什么时候开始pragma export 不是标准的 Ada?可以在当前标准中找到它:ada-auth.org/standards/aarm12_w_tc1/html/AA-J-15-5.html
  • 您可能会在comp.lang.ada 上获得更多关注。在这里,问题有被关闭的危险:help center。也就是说,由于现有的 Ada 与安全相关,您可能不会在接口中发现诸如标记类型、访问子程序、泛型之类的尴尬事情。如果没有人想出一个工具,我会考虑制作一个基于 ASIS 的工具:我的 ASIS2XML(版本已过时,获取代码),或者有一个用于 GNAT(gnat2xml,由 @ 支持) 987654329@) 可从他们的 ASIS 存档中构建。

标签: c++ c ada


【解决方案1】:

如果您使用的是 Ada 2012 编译器,您可以尝试将 ExportConvention => X 方面添加到包中;示例:

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;

【讨论】:

  • 这类似于:stackoverflow.com/questions/42938883/…。正如@Shark8 所说,您可以在要公开的方法上添加pragma export,或者添加用pragma export 编写的路由层,以有效调用Ada 过程/函数。如果您有一些类型转换要做,那么附加层可能很有用:例如,如果您的 ada 服务的输入中有带判别符的类型。由于 Ada 结构不能总是用 C/C++ 轻松映射
猜你喜欢
  • 2017-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-06
  • 1970-01-01
  • 1970-01-01
  • 2019-06-07
相关资源
最近更新 更多