可访问性级别和本地过程变量生命周期

Accessibility levels and local procedure variables lifetime

在观看 AdaCore 的教程视频时,我不了解可访问性级别,尤其是这个: https://youtu.be/nfBwXxAf7UE?t=1418

示例如下:

type An_Access is access all Integer;
procedure Proc is
    W : aliased Integer;
    X : An_Access := W'Access;
begin
    null;
end Proc;

教程说 "X is of accessibility level 0, W is of accessibility level 1. Allowing this declaration would permit reference to the object outside of the scope."

为什么声明访问类型的点会影响不同范围内的访问变量?我的意思是,WX 都是 Proc 的本地文件,并且会超出范围并且在 Proc 完成后将无法使用。那么,声明 X 类型的位置有何重要意义?

主要原因是简单。现有规则易于理解(您清楚地理解它)并且易于实施。所需的数据流分析(一般区分可接受和不可接受的使用)很复杂,编译器通常不需要,因此要求编译器进行分析被认为是个坏主意。

另一个考虑因素是 Ada 的编译规则。如果 ProcX 传递给另一个包中声明的另一个子程序,数据流分析将需要该子程序的主体,但 Ada 要求可以在没有主体的情况下编译 Proc另一个包裹。

最后,唯一一次*您需要访问对象类型的情况是您需要声明一个无法放入堆栈的大对象,在这种情况下您不需要access all'access,因此您无需处理此问题。

*作为一阶近似值是正确的(可能在二阶和三阶也是正确的)

在 Ada 中,当您尝试考虑可访问性时,您必须根据访问类型而不是变量来考虑。没有变量的生命周期分析(我认为这与 Rust 所做的相反)。那么,可能发生的最坏情况是什么?如果您的指针类型级别低于目标变量级别,可访问性检查将失败,因为指针 可能 比目标更长寿。

我不确定匿名访问类型会发生什么,但这与我在这里和那里选择的完全不同。有些人建议根本不要将它们用于变量。