代码之家  ›  专栏  ›  技术社区  ›  David Boshton

Ada:如何在不同机器上的可执行文件之间发送和接收对象

ada
  •  0
  • David Boshton  · 技术社区  · 4 年前

    我需要在正在运行的Ada程序的实例之间发送一些相当大的数据结构。显然 json 结束 https 是一种选择。我不想使用它,因为它在数据开销方面比我想要的要大,但它现在可以工作。

    理想情况下,我想把它捣碎成一个二进制blob,并发送一个哈希值来确认消息。在Ada,有没有一种体面的方法可以做到这一点?

    0 回复  |  直到 4 年前
        1
  •  4
  •   Simon Wright    4 年前

    我会根据以下内容寻找解决方案 Streams ,通过TCP发送。

    如果你想实现自己的阻塞和散列,你可能需要先将原始流写入内存,这样你就可以知道blob有多大,并计算出校验和。这里有一个相当简单的方法, spec body .

    对于一个投入了大量工作的解决方案,请查看Dmitry Kazakov的《简单组件》 Block Streams .

        2
  •  0
  •   Shark8    4 年前

    理想情况下,我想把它捣碎成一个二进制blob,并用哈希值发送 以确认消息。在Ada,有没有一种体面的方法可以做到这一点?

    如上所述,DSA[附件E]是处理这一问题的好方法,尽管由于实现(而不是语言)的原因,DSA的/定义足够宽泛,只要尊重接口(基于RPC和流),传输几乎可以是任何东西。

    如果你从一开始就用适当的分类来组织你的程序,事情就会很简单 Pure , Shared_Passive , Remote_Types ,以及 Remote_Call_Interface ARM ,以及 Ada Rational 而不是试图将现有的东西塞进DSA所需的结构中。(也就是说,在某些情况下,修改现有的程序以使其具有DSA功能相当简单,只需添加分类语法/方面并配置+编译即可。)

    请注意,Ada的容器被设计为可以在DSA程序中使用,并且都是[IIRC] 远程_类型 分类。

    我需要在以下实例之间发送一些相当大的数据结构 我正在运行的Ada程序。

    另一种选择是 ASN.1 ,它允许您以独立于语言和机器的方式为某些数据进行类型定义。有几个ASN.1编译器,一个好的块可以生成Ada; here's one (用F*、IIRC编写)由欧洲航天局使用,免费开源。

    ASN.1有一个针对空间优化的编码方案,因此将为您提供最紧凑的在线表示。

    显然,json over https是一种选择。不是 我想用一个,因为它在数据方面比我想要的要大 开销,但目前还可以。

    直接使用HTTP和JSON对许多人来说很有吸引力,因为它“简单”,尽管这种简单性通常会产生误导:他们不做的所有事情,比如范围检查值或验证结构,都会被卸载给程序员。也就是说,你可以使事物模块化,并使用泛型来允许你“交换”方法。

    Generic
      Type Data(<>)           is private;
      Type Transport_Type(<>) is private;
      Target : However_you_address_the_target;
      with Function Encode(Input : Data) return Transport_Type;
    Procedure Send( Value : Data );
    

    Generic
      Type Data(<>)           is private;
      Type Transport_Type(<>) is private;
      with Function Decode(Input : Transport_Type) return Data;
    Procedure Receive( Value : Transport_Type ) return Data;
    

    或者类似的东西。我认为这比使用DSA更不方便,但也可能更简单,考虑到你(大多数情况下)不必担心这种方法的分类。