Ada:pragma Pure / Remote_Types和系统类型

时间:2014-07-26 12:56:42

标签: ada pragma

我正在编写一个需要分发的Ada应用程序,而我正在尝试使用DSA来实现它,但我发现“允许”被“篡改”的内容存在很大的局限性。 “T

我不会发布源代码,因为它非常复杂,无论如何这是一个通用的问题,我只是想要一些关于我不能正确理解的指针,所以如果我错了,请耐心跟我纠正。

所以我的问题是:我想用pragma Remote_Call_Interface标记一个程序,以便可以远程调用它。但是,只要我添加了pragma编译中断,因为该过程在我的项目中包含了未归类为PureRemote_Types的其他包。

所以我尝试将我需要的软件包标记为PureRemote_Types(dpeending,他们是否有状态)但这反过来会进一步破坏编译,因为事实证明你可以在Pure / Remote_Types包中甚至不使用基本系统类型,例如:你不能使用Vector,你不能使用Unbounded_String,你不能使用Map等等......由于我不能使用我用来构建它的数据结构,所以整个程序都会崩溃!

有解决方法吗?或者,如果我想分发我的应用程序,我必须严格限制自己最基本的类型,如整数和布尔和其他一点?我不明白我是否打击了语言的限制,或者我是不是错误地做了(不幸的是我在DSA上发现的教程都非常模糊,顺便说一句,如果有人有一些好的,可以随意链接它们!)

编辑:在ajb的答案之后让我指出特别令我讨厌的事情:在我想用pragma Remote_Call_Interface标记的包中我试图“使用”一些包不是pure / remote_types,但它只使用那些本地包中的类型,包含任何接受此类类型作为参数的过程,也不包含返回此类型的函数。这让我感到困扰:既然这些类型不必通过网络“旅行”,为什么我不能和他们一起?我只在本地使用它们...我不明白这一点,这就是为什么我试图制作那些类型的Pure / Remote_Types,但现在我已经阅读了ajb的解释(即:使用了Remote_Types以便对象这些类型可以通过网络传播)我更加困惑的是,如果我只在本地使用它们,为什么我不能使用它们。

1 个答案:

答案 0 :(得分:3)

我不是Ada分布式编程方面的专家,但这是我所知道的(或者我认为):

Annotated Ada参考手册,第E.2.3节说,“管理远程调用接口库单元的限制旨在确保远程调用中的实际参数值可以在两个活动分区之间有意义地发送“。例如,如果记录类型的字段是访问类型,则无法盲目地将其从一个分区发送到另一个分区,因为被调用的分区将无法访问指针指向的内存。 (Unbounded_StringMapVector是使用访问类型作为内部的一部分实现的。)用作参数或返回类型的所有类型都必须支持“外部流式传输”,这意味着必须使用是一种类型转换为字节流和从字节流转换的方式,以便参数值可以通过套接字传输。如果您有一个具有访问类型的记录,但是您提供了'Read'Write属性,以便可以在没有任何实际指针传输的情况下向字节流写入和读取类型,那么您可以放置您的记录类型在Remote_Types包中。

我不确定您的问题究竟是什么:是否有某些类型要传递作为远程调用的参数但不能;或者您是否只想在应用程序的其余部分中使用这些类型,但是它们会妨碍它们?

如果是第二个,那么我认为解决方案是重构您的包,以便所有“远程类型”与非远程类型分开。

但是,如果您真的希望在远程调用中将Unbounded_StringMapVector从一个分区传递到另一个分区,则会更棘手。 Unbounded_String确实应该支持外部流式传输,并且有人建议Unbounded_String Remote_TypesMap个包(请参阅AI05-0204),但是没有采取行动 - 我不知道不知道为什么。 Vectorprivate with Ada.Strings.Unbounded; package Remote_Types_Package is pragma Remote_Types; type My_Unbounded_String is private; private type My_Unbounded_String is record S : Ada.Strings.Unbounded.Unbounded_String; end record; end Remote_Types_Package; 会出现更大问题,因为它们是必须在任何类型上工作的通用包,包括那些不支持外部流式传输的包。在任何情况下,这些类型都不会被设置为自动转换为或通过套接字传递的字节。

但我认为你可以让它像这样工作:

Unbounded_String

private with包必须与My_Unbounded_String一起使用;见E.2.2(6)。您需要提供一个函数来创建My_Unbounded_String,并且您需要为'Read提供流读取和写入例程,并定义'WriteRead类型。您应该能够使用Write的{​​{1}}和Read属性来编写WriteUnbounded_String属性。如果你想使用Vector作为远程调用参数,那么类似的东西应该是可行的,尽管你可能需要做更多的工作来自己编组/解组该类型。

再一次,我没有尝试过,这个解决方案可能会有一些障碍。

编辑:因为现在看起来问题更简单 - 即。你有一些类型将在分区之间传递阻碍 - 解决方案应该更简单。您定义的任何要在分区之间进行通信的类型都需要位于Remote_Types包中,例如P1。其他类型应该在不同的包中,比如P2(或多个包)。如果P1中的类型取决于P2中的类型,您仍然可以让P1private with P2;,并确保您拥有编组和解组程序需要。如果遇到困难,我建议你在这里提出一个新问题。

我不知道为什么语言要求在Remote_Types包中隔离所有这些类型,而不是仅仅说Remote_Call_Interface包中使用的任何类型只有部分可以流式传输。可能存在一些实施问题。任何存在于Remote_Types包的代码都必须位于两个分区中的程序中,这可能是为了限制必须链接到多个分区的代码类型。但我只是在猜测。