Ada 如何实现软件包?



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

该语言并没有真正指定应该如何完成底层实现。 这由编译器供应商决定。 我怀疑他们使用结构或记录。 您找到的任何答案都将是特定于供应商的,而不是特定于语言的。 值得注意的是,最常见的编译器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等类型相反)。 因此,您可以在包中包含私有类型和操作,但不能执行任何传统的面向对象编程。

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

让我试着说明这一点。

艾达:

...
A := B;
...

可能会发出如下代码:

...
CPY B, A
...

艾达:

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

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

包可以有初始化代码,其实现方式非常类似于过程。泛型包的实例化可以像记录(其组件包含泛型参数)一样实现,也可以就地扩展,在这种情况下,情况与非泛型包相同。

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

最新更新