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

       

Контекст и видимость


Ошибочное понимание разницы между контекстом (scope) и видимостью (visibility) может вызвать трудности у многих программистов, которые знакомятся с языком программирования Ада.

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

Спецификатор совместности контекста with

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

Это является основным различием от директивы #include семейства языков C

или директивы uses в реализации Паскаль-системы фирмы Borland.

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

Разделение контекста и видимости является важным концептом разработки программного обеспечения.

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

Примечательно также, что идея пространства имен namespace, принятая в C++, подобна концепции контекста и видимости Ады.

Каждая инструкция и/или каждая конструкция языка имеет объемлющий контекст.

Обычно, контекст легко увидеть в исходном тексте, поскольку контекст имеет какую-либо точку входа (описательная часть declare, идентификатор подпрограммы, идентификатор составного типа, идентификатор пакета...) и какую-либо явную точку завершения.

Как правило, явная точка завершения контекста обозначается с помощью соответствующей инструкции end.



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

Контекст может быть вложенным.

Например, одна процедура может быть описана внутри другой процедуры.

Несколько иначе выглядит ситуация, когда спецификатор совместности контекста with

помещает в контекст какой-либо библиотечный модуль.

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




не делает эти ресурсы непосредственно видимыми.

В Аде, какой-либо ресурс может находиться в контексте (scope) и при этом он не будет непосредственно видимым.

Эта концепция больше характерна для Ады чем для других хорошо известных языков программирования.

Для того чтобы соответствующие ресурсы были непосредственно видимыми, необходимо использовать соответствующие средства:

спецификатор использования
use
делает непосредственно видимыми все публично доступные ресурсы пакета
спецификатор использования
use type
 -  делает непосредственно видимыми все публично доступные знаки операций для указанного типа
полная точечная нотация  -  ресурс указанный с помощью полной точечной нотации становится непосредственно видимым
локальное переименование операций и знаков операций  -  обычно, является лучшим средством обеспечения непосредственной видимости для операций и знаков операций
В процессе разработки, сообщения об ошибках, получаемые от Ада-компилятора, могут указывать, что некоторые ресурсы не видимы в том месте где они используются.

Следует заметить, что подобные проблемы видимости наиболее часто возникают со знаками операций.

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


Содержание раздела