ada - Ada:pragma Pure/Remote_Types和系统类型

标签 ada pragma

我正在编写一个需要分发的Ada应用程序,并且尝试使用DSA进行此操作,但是我在“允许”使用“什么”和“不使用”什么方面发现了很大的限制。

我不会发布源代码,因为它很复杂,而且无论如何这都是一个通用的问题,我只想对我不正确理解的内容提出一些建议,所以请忍着并纠正我,如果我错了。

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

因此,我尝试将我需要的软件包标记为PureRemote_Types(无论它们是否具有状态都在此范围之内),但这反过来又进一步破坏了编译,因为事实证明,您甚至无法在Pure /中使用基本系统类型Remote_Types软件包,例如:您不能使用Vector,您不能使用Unbounded_String,您不能使用Map,等等...整个程序崩溃了,因为我不能使用数据结构用来建造它了!

有没有解决的办法?或者,如果我想分发我的应用程序,我必须严格限制自己使用最基本的类型,例如Integers和booleans以及其他类型?我不明白我是在遇到语言限制还是在错误地使用它(不幸的是,我在DSA上发现的教程都非常模糊,顺便说一句,如果有人有好的话,可以随意链接它们!)

编辑:ajb回答后的让我指定特别令我烦恼的事情:在我想用pragma Remote_Call_Interface标记的软件包中,我试图与某些非pure / remote_types软件包一起使用,但是它仅使用其中的类型这些软件包本地,它确实而不是包含任何接受此类参数(例如参数)的过程,也不包含返回此类类型的函数。这就是困扰我的地方:由于这些类型不必通过网络进行“旅行”,为什么我不能使用它们呢?我只是在本地使用它们...我不明白这一点,这就是为什么我试图将这些类型设置为Pure / Remote_Types的原因,但是现在我已经阅读了ajb的说明(即:使用Remote_Types以便对象这些类型的数据可以通过网络传播),我什至更困惑为什么仅在本地使用它们就不能使用它们。

最佳答案

我不是Ada分布式编程的专家,但是我确实知道(或认为我知道):

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

我不确定您的问题到底是什么:是否要将某些类型作为参数传递给远程调用,但是不能?还是只想在应用程序的其余部分中使用某些类型,但是会妨碍您使用?

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

但是,如果您确实希望通过远程调用将Unbounded_StringMapVector从一个分区传递到另一个分区,则比较麻烦。 Unbounded_String确实应该支持外部流传输,并且有人提议将Unbounded_String变成Remote_Types包(请参阅AI05-0204),但未采取任何行动-我不知道为什么。但是,MapVector会是更大的问题,因为它们是通用软件包,必须适用于任何类型,包括不支持外部流传输的软件包。无论如何,这些类型都不设置为自动转换为字节或通过套接字传递。

但我认为您可以使它像这样工作:

private 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一起使用;见E.2.2(6)。您需要提供一个函数来创建My_Unbounded_String,并且需要为My_Unbounded_String提供流读写例程,并为该类型定义'Read'Write。通过使用ReadWriteRead属性,您应该能够编写WriteUnbounded_String属性。如果您想使用Vector作为远程调用参数,则应该可以执行类似的操作,尽管您可能需要做更多的工作来自己编组/解组该类型。

再一次,我没有尝试过,这种解决方案可能会遇到一些麻烦。

编辑:因为现在看起来问题是一个简单的问题-即您会遇到一些不会在分区之间传递的类型的情况-解决方案应该更简单。您定义的将在分区之间通信的任何类型都必须在Remote_Types包中,例如P1。其他类型应放在不同的包中,例如P2(或多个包)。如果P1中的类型取决于P2中的类型,您仍然可以通过让P1private with P2;并确保您具有所需的编组和解组过程来使它起作用。如果您遇到困难,我鼓励您在这里提出一个新问题。

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

关于ada - Ada:pragma Pure/Remote_Types和系统类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24971222/

相关文章:

linux - 在 linux 终端运行 Ada 程序

ada - 使用 GtkAda 发出信号

java - SQLite JDBC PRAGMA 设置

c++ - 我可以更改 C++ 中的静态变量初始化顺序吗?

AWS for Ada 的安装问题

ada - 如何使用 GNAT 制作的可执行文件更小?

c - __pragma(已弃用) 和 __declspec(已弃用) 之间的区别

c# - 禁用自动生成的代码/文件夹/命名空间的警告

Ada程序检测行尾

c++ - 如何检查在哪个专用模板中编译