Ада-95. Компилятор GNAT


         

Управление порядком элаборации - часть 2


Данная директива требует, чтобы элаборация тела модуля была осуществлена сразу после элаборации спецификации.

Предположим, что модуль A содержит данную директиву, а модуль B указывает в спецификаторе with модуль A.

Напомним, что стандартные правила требуют, чтобы элаборация спецификации модуля A

была выполнена перед элаборацией модуля, который указывает модуль A в спецификаторе with.

Указание этой директивы компилятора в модуле A

говорит о том, что элаборация тела модуля A

будет выполнена перед элаборацией B.

Таким образом, обращения к модулю A будут безопасны и не нуждаются в дополнительных проверках.

Примечательно, что в отличие от директив Pure и Preelaborate

использование директивы Elaborate_Body не гарантирует, что программа свободна от проблем связанных с элаборацией, поскольку возможно наличие ситуации, которая не удовлетворяет требования порядка элаборации.

Вернемся к примеру с модулями Unit_1 и Unit_2.

Если поместить директиву Elaborate_Body в Unit_1, а модуль Unit_2 оставить без изменений, то порядок элаборации будет следующий:

Spec of Unit_2 Spec of Unit_1 Body of Unit_1 Body of Unit_2

В этом случае подразумевается, что нет необходимости проверять вызов Func_1 из модуля Unit_2

поскольку он должен быть безопасным.

Вызов Func_2 из модуля Unit_1, когда результат вычисления выражения Expression_1 равен 1, может быть ошибочным.

Следовательно, ответственность за отсутствие подобной ситуации возлагается на программиста.

Когда все модули содержат директиву компилятора Elaborate_Body, то проблемы порядка элаборации отсутствуют, кроме случаев когда вызовы подпрограмм осуществляются из тела, забота о котором в любом случае возлагается на программиста.

Следует заметить, что повсеместное использование этой директивы не всегда возможно.

В частности, для показанного ранее примера с модулями Unit_1 и Unit_2, когда оба модуля содержат директиву Elaborate_Body, отсутствие возможности определить правильный порядок элаборации очевидно.

Показанные выше директивы компилятора позволяют гарантировать клиентам безопасное использование серверов, и такой подход является предпочтительным.




Содержание  Назад  Вперед