Ada 是如何实现 Packages 的?
How does Ada implement Packages?
Ada编程语言是如何实现包的?它使用结构吗?一个记录?如果可能,我在哪里可以找到此实现的示例?
该语言并未真正指定应如何完成底层实现。这留给了编译器供应商。我怀疑他们使用结构或记录。您找到的任何答案都是特定于供应商的,而不是特定于语言的。值得注意的是,最常见的编译器 GNAT 是开源的,因此可以查看源代码并尝试了解它们是如何工作的。同样,这只是一种可能的实施方式。其他编译器可能会有所不同。
如果您只是指一个包的示例可能看起来像什么:
空 my_package.ads:
package My_Package is
-- Empty package
end My_Package;
my_package.ads 带有 "class" 类型:
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 现在位于包内的事实不会更改发出的代码。
一个包可以有初始化代码,它的实现很像一个程序。通用包的实例化可以像记录一样实现(其组件包含通用参数),或者它可以就地扩展,在这种情况下,情况与非通用包相同。
有趣的问题!为什么这么问?
Ada编程语言是如何实现包的?它使用结构吗?一个记录?如果可能,我在哪里可以找到此实现的示例?
该语言并未真正指定应如何完成底层实现。这留给了编译器供应商。我怀疑他们使用结构或记录。您找到的任何答案都是特定于供应商的,而不是特定于语言的。值得注意的是,最常见的编译器 GNAT 是开源的,因此可以查看源代码并尝试了解它们是如何工作的。同样,这只是一种可能的实施方式。其他编译器可能会有所不同。
如果您只是指一个包的示例可能看起来像什么:
空 my_package.ads:
package My_Package is
-- Empty package
end My_Package;
my_package.ads 带有 "class" 类型:
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 现在位于包内的事实不会更改发出的代码。
一个包可以有初始化代码,它的实现很像一个程序。通用包的实例化可以像记录一样实现(其组件包含通用参数),或者它可以就地扩展,在这种情况下,情况与非通用包相同。
有趣的问题!为什么这么问?