Ada如何实施包裹?

问题描述 投票:2回答:2

Ada编程语言如何实现包?它使用结构吗?一个记录?如果可能的话,我在哪里可以找到这个实现的例子?

programming-languages ada
2个回答
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
投票

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

让我试着说明这一点。

阿达:

   ...
   A := B;
   ...

可能会发出如下代码:

...
CPY B, A
...

阿达:

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

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

一个包可以有初始化代码,它将像一个过程一样实现。通用包的实例化可以像记录(其组件包含通用参数)一样实现,或者可以就地扩展,在这种情况下,情况与非通用包相同。

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

© www.soinside.com 2019 - 2024. All rights reserved.