Rationale for Ada 2005: Predefined library
RUSTOPBACKNEXT
ENG |
7. Categorization of library units
@ It will be recalled that library units in Ada 95 are categorized into a hierarchy by a number of
|
|
|
|
|
|
Rationale for Ada 2005: Predefined library
@ENGRUSTOPBACKNEXT7. Классификация библиотечных модулей
@ Библиотечные модули в Аде 95 категоризированы в следующую иерархию:
|
@ Каждая категория вводит ограничения для того, что может содержать модуль. Важное правило состоит в том, что модуль может зависеть только от модулей в той же самой или более высокой категории (тела последних двух не ограничены).
@ Прагмы Shared_Passive, Remote_Types, и Remote_Call_Interface относящиеся к распределённым системам и являются скорее узкоспециализированными. Незначительное изменение, упомянутое в 2001 Corrigendum, состояло в том, что прагма Remote_Types была добавлена к пакету Ada.Finalization для поддержки обмена контролируемыми типами между частями в распределённой системе.
@ Отметим, что прагма Preelaborate не вписывается в эту иерархию. Фактически имеется другая иерархия:
|
@ и снова у нас есть то же самое правило, что модуль может только зависеть от модулей в той же самой или более высокой категории. Таким образом, pure модуль может зависеть только от других pure модулей, а preelaborable модуль может зависеть только от других preelaborable или pure модулей.
@ Следствием этой двойной иерархии является то, что общедоступный пассивный модуль не может зависеть от preelaborable модуля - модули, от которых это зависит, должны быть чистыми или общедоступными пассивными и так далее для других. Однако, есть отдельное правило по которому модуль, который разделен пассивно, отдаленные типы или RCI, должен самостоятельно быть preelaborable и так должен также иметь прагму Preelaborate.
@ Классификация индивидуальных предопределенных модулей предназначена для того чтобы сделать их настолько полезными насколько возможно. Более строгая категоризация более полезна, потому что может использоваться при большем количестве обстоятельств.
@ Классификация была излишне слаба в Аде 95 в некоторых случаях, и поэтому в Аде 2005 были сделаны соостветствующие изменения.
@ У следующих пакетов, у которых не было никакой классификации в Аде 95 теперь в Аде 2005 есть прагма Preelaborate:
@ В следующих пакетов у которых в Аде 1995 была прагма Preelaborate в Аде 2005 была продвинута на прагму Pure:
@ Эти изменения означают, что определенные средства, такие как возможность анализировать исключения теперь доступны для preelaborable модулей. Отметим однако, что Wide_Maps и Wide_Maps.Wide_Constants остаются как preelaborable, потому что они могут быть осуществлены использованием ссылочных типов.
@ Только для отчета, у следующих пакетов (и функций, Hash - функция), которые появились в Аде 2005 теперь есть прагма Pure:
@ Также следующие новые пакеты и функции имеют прагму Preelaborate:
@ плюс неопределенные контейнеры также.
@ Проблема с preelaborable модулями в Аде 95 состоит в том, что есть ограничения на объявление объектов инициализируемых по умолчанию в модуле с прагмой Preelaborate. Например, мы не можем объявить объекты частного типа на библиотечном уровне в таком модуле. Это весьма глупо для в случае:
|
@ Ясно что эти объявления могут быть preelaborated и, таким образом, у пакета P может быть прагма Preelaborate. Однако, теперь рассмотрим:
|
@ Пакет Q является preelaborable, потому что он не объявляет объектов. Однако, пакет P не является preelaborable, потому что он объявляет объект частного типа T, т.к. тип является частным, мы не знаем, что его заданное по умолчанию начальное значение является статическим.
@ Эта проблема преодолена в Аде 2005 введением прагмы Preelaborable_Initialization. Её синтаксис:
|
@ Теперь мы можем написать:
|
@ Прагма обещает, что у полного типа будет preelaborable инициализация, и объявление пакета P выше является теперь корректным.
@ У следующих предопределенных частных типов, которые существовали в Аде 95, есть прагма Preelaborable_Initialization в Аде 2005:
@ У Wide и Wide-Wide версий также есть соответствующая прагма. Отметим, что не было возможности применить прагму к пакету Ada.Strings.Bounded.Generic_Bounded_Length.Bounded_String потому что это лишило бы возможности иллюстрировать Generic_Bounded_Length с нестатическим выражением для параметра Max.
@ У следующих частных типов которые появились в Аде 2005 также имеется прагма Preeleborable_Initialization:
@ и так же для неопределенных контейнеров.
@ Связанное с этим изменение касается определения чистых (pure) модулей. В Аде 2005 чистые модули теперь могут использовать ссылку на подпрограмму и ссылку к типу объекта когда никакакого пула динамической памяти не создано.
@ В заключении упомянем маленькое, но важное изменение относительно подсистемы коммуникации частей System.RPC. Реализации, соответствующие Распределённым Системам теперь не обязаны поддерживать этот предопределенный интерфейс если другой интерфейс является более соответствующим для взаимодействия, например с CORBA.
2010-10-24 00:26:58
. .