Уровни доступности и время жизни локальных переменных процедуры - PullRequest
2 голосов
/ 27 марта 2020

Я не понимаю уровни доступности, когда смотрю обучающие видео от 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 имеет уровень доступности 0, W имеет уровень доступности 1. Разрешение этого объявления разрешит ссылку на объект вне области действия».

Зачем нужна точка, в которой тип доступа заявлено, влияют ли переменные доступа в разных областях? Я имею в виду, что W и X являются локальными по отношению к Proc и будут go вне области и не будут использоваться после завершения Proc. Так почему это важно, где объявлен тип X?

Ответы [ 2 ]

3 голосов
/ 27 марта 2020

Основная причина - простота. Существующее правило легко понять (вы его четко понимаете) и легко реализовать. Требуемый анализ потока данных (чтобы отличить guish между приемлемым и недопустимым использованием в целом) сложен и обычно не требуется для компилятора, поэтому было сочтено плохой идеей требовать его от компиляторов.

Еще одним соображением являются правила компиляции Ады. Если Proc передает X в другую подпрограмму, объявленную в другом пакете, для анализа потока данных потребуется тело этой подпрограммы, но Ada требует, чтобы была возможность скомпилировать Proc без тела другого пакета.

Наконец, единственный раз, * когда вам понадобятся типы доступа к объектам, - это если вам нужно объявить большой объект, который не помещается в стек, и в этом случае вам не понадобится access all или 'access, так что вам не придется иметь с этим дело.

* Истинно как приближение 1-го порядка (вероятно, верно также и во 2-м и 3-м порядке)

2 голосов
/ 29 марта 2020

В Аде, когда вы пытаетесь думать о доступности, вы должны делать это с точки зрения типов доступа, а не переменных. Там нет анализа жизни переменных (в отличие от того, что делает Rust, я думаю). Итак, что самое худшее, что может случиться? Если ваш уровень типа указателя меньше уровня целевой переменной, проверки доступности завершатся неудачно, потому что указатель может пережить цель.

Я не уверен, что происходит с анонимными типами доступа, но это совсем другой беспорядок от того, что я выбираю здесь и там. Некоторые люди рекомендуют вообще не использовать их для переменных.

...