Ada如何实现Packages?

时间:2019-03-31 15:12:34

标签: programming-languages ada

Ada编程语言如何实现软件包?它使用结构吗?一个记录?在哪里可以找到这种实现的示例?

2 个答案:

答案 0 :(得分:4)

该语言并没有真正指定底层实现的方式。这由编译器供应商决定。我怀疑他们使用结构还是记录。您找到的任何答案都是特定于供应商的,而不是特定于语言的。值得注意的是,最常见的编译器GNAT是开源的,因此可以查看和尝试确定源代码的方式来使用源代码。同样,那只是一种潜在的实现。其他编译器可能会有所不同。

如果您只是想说说一个软件包的示例可能是什么样的话,

空的my_package.ads:

package My_Package is
    -- Empty package
end My_Package;

my_package.ads,其类型如下:

package My_Package is

   type My_Type is tagged private;

   function Get_Value(Self : My_Type) return Integer;

private

   type My_Type is tagged record
      Value : Integer := 2;
   end record;

end My_Package;

my_package.adb,其中包含操作定义:

package body My_Package is

   function Get_Value(Self : My_Type) return Integer is
   begin
      return Self.Value;
   end Get_Value;

end My_Package;

如您所见,软件包可以为空。它们可以具有类型和/或操作。包是处理封装的地方(与C ++和Java这样的类型相反)。因此,您可以在包中包含私有类型和操作,但不能进行任何传统的面向对象编程。

答案 1 :(得分:1)

Ada包主要只是一个名称空间,因此对编译器发出的可执行代码没有影响。

让我尝试说明一下。

Ada:

   ...
   A := B;
   ...

可能会发出如下代码:

...
CPY B, A
...

Ada:

   package P is
      B: Integer;
      ...
   end;
   ...
   A := P.B;
   ...

可能会发出完全相同的代码。 B现在位于包装内的事实不会更改发出的代码。

一个包可以具有初始化代码,该初始化代码将非常像一个过程一样实现。通用包的实例化可以像一条记录(其组件保留通用参数)那样实现,也可以就地扩展,在这种情况下,情况与非通用包相同。

有趣的问题!你为什么要问?