Rationale for Ada 2005: Predefined library

RUSTOP
BACKNEXT

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

  1        pragmas thus
  2        pragma Pure ( ... );
  3        pragma Shared_Passive ( ... );
  4        pragma Remote_Types ( ... );
  5        pragma Remote_Call_Interface ( ... );

@ Each category imposes restrictions on what the unit can contain. An important rule is that a unit can only depend on units in the same or higher categories (the bodies of the last two are not restricted).

@ The pragmas Shared_Passive, Remote_Types, and Remote_Call_Interface concern distributed systems and thus are rather specialized. A minor change made in the 2001 Corrigendum was that the pragma Remote_Types was added to the package Ada.Finalization in order to support the interchange of controlled types between partitions in a distributed system.

@ Note that the pragma Preelaborate does not fit into this hierarchy. In fact there is another hierarchy thus

  1        pragma Pure ( ... );
  2        pragma Preelaborate ( ... );

@ and again we have the same rule that a unit can only depend upon units in the same or higher category. Thus a pure unit can only depend upon other pure units and a preelaborable unit can only depend upon other preelaborable or pure units.

@ A consequence of this dual hierarchy is that a shared passive unit cannot depend upon a preelaborable unit – the units upon which it depends have to be pure or shared passive and so on for the others. However, there is a separate rule that a unit which is shared passive, remote types or RCI must itself be preelaborable and so has to also have the pragma Preelaborate.

@ The categorization of individual predefined units is intended to make them as useful as possible. The stricter the category the more useful the unit because it can be used in more circumstances.

@ The categorization was unnecessarily weak in Ada 95 in some cases and some changes are made in Ada 2005.

@ The following packages which had no categorization in Ada 95 have pragma Preelaborate in Ada 2005

@ The following which had pragma Preelaborate in Ada 1995 have been promoted to pragma Pure in Ada 2005

@ These changes mean that certain facilities such as the ability to analyse exceptions are now available to preelaborable units. Note however, that Wide_Maps and Wide_Maps.Wide_Constants stay as preelaborable because they may be implemented using access types.

@ Just for the record the following packages (and functions, Hash is a function) which are new to Ada 2005 have the pragma Pure

@ And the following new packages and functions have the pragma Preelaborate

@ plus the indefinite containers as well.

@ A problem with preelaborable units in Ada 95 is that there are restrictions on declaring default initialized objects in a unit with the pragma Preelaborate. For example, we cannot declare objects of a private type at the library level in such a unit. This is foolish for consider

  1        package P is
  2                pragma Preelaborate (P);
  3                X : Integer := 7;
  4                B : Boolean := True;
  5        end;

@ Clearly these declarations can be preelaborated and so the package P can have the pragma Preelaborate. However, now consider

  1        package Q is
  2                pragma Preelaborate (Q); -- legal
  3                type T is private;
  4        private
  5                type T is
  6                        record
  7                                X : Integer := 7;
  8                                B : Boolean := True;
  9                        end record;
 10        end Q;
 11        with Q;
 12        package P is
 13                pragma Preelaborate (P); -- illegal
 14                Obj : Q.T;
 15        end P;

@ The package Q is preelaborable because it does not declare any objects. However, the package P is not preelaborable because it declares an object of the private type T – the theory being of course that since the type is private we do not know that its default initial value is static.

@ This is overcome in Ada 2005 by the introduction of the pragma Preelaborable_Initialization. Its syntax is

  1        pragma Preelaborable_Initialization (direct_name);

@ We can now write

  1        package Q is
  2                pragma Preelaborate (Q);
  3                type T is private;
  4                pragma Preelaborable_Initialization (T);
  5        private
  6                type T is
  7                        record
  8                                X : Integer := 7;
  9                                B : Boolean := True;
 10                        end record;
 11        end Q;

@ The pragma promises that the full type will have preelaborable initialization and the declaration of the package P above is now legal.

@ The following predefined private types which existed in Ada 95 have the pragma Preelaborable_Initialization in Ada 2005

@ Wide and wide-wide versions also have the pragma as appropriate. Note that it was not possible to apply the pragma to Ada.Strings.Bounded.Generic_Bounded_Length.Bounded_String because it would have made it impossible to instantiate Generic_Bounded_Length with a non-static expression for the parameter Max.

@ The following private types which are new in Ada 2005 also have the pragma Preeleborable_Initialization

@ and similarly for the indefinite containers.

@ A related change concerns the definition of pure units. In Ada 2005, pure units can now use access to subprogram and access to object types provided that no storage pool is created.

@ Finally, we mention a small but important change regarding the partition communication subsystem System.RPC. Implementations conforming to the Distributed Systems annex are not required to support this predefined interface if another interface would be more appropriate – to interact with CORBA for example.

Rationale for Ada 2005: Predefined library

@ENGRUSTOPBACKNEXT

7. Классификация библиотечных модулей

@ Библиотечные модули в Аде 95 категоризированы в следующую иерархию:

  1        pragmas thus
  2        pragma Pure ( ... );
  3        pragma Shared_Passive ( ... );
  4        pragma Remote_Types ( ... );
  5        pragma Remote_Call_Interface ( ... );

@ Каждая категория вводит ограничения для того, что может содержать модуль. Важное правило состоит в том, что модуль может зависеть только от модулей в той же самой или более высокой категории (тела последних двух не ограничены).

@ Прагмы Shared_Passive, Remote_Types, и Remote_Call_Interface относящиеся к распределённым системам и являются скорее узкоспециализированными. Незначительное изменение, упомянутое в 2001 Corrigendum, состояло в том, что прагма Remote_Types была добавлена к пакету Ada.Finalization для поддержки обмена контролируемыми типами между частями в распределённой системе.

@ Отметим, что прагма Preelaborate не вписывается в эту иерархию. Фактически имеется другая иерархия:

  1        pragma Pure ( ... );
  2        pragma 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. Например, мы не можем объявить объекты частного типа на библиотечном уровне в таком модуле. Это весьма глупо для в случае:

  1        package P is
  2                pragma Preelaborate (P);
  3                X : Integer := 7;
  4                B : Boolean := True;
  5        end;

@ Ясно что эти объявления могут быть preelaborated и, таким образом, у пакета P может быть прагма Preelaborate. Однако, теперь рассмотрим:

  1        package Q is
  2                pragma Preelaborate (Q); -- legal
  3                type T is private;
  4        private
  5                type T is
  6                        record
  7                                X : Integer := 7;
  8                                B : Boolean := True;
  9                        end record;
 10        end Q;
 11        with Q;
 12        package P is
 13                pragma Preelaborate (P); -- illegal
 14                Obj : Q.T;
 15        end P;

@ Пакет Q является preelaborable, потому что он не объявляет объектов. Однако, пакет P не является preelaborable, потому что он объявляет объект частного типа T, т.к. тип является частным, мы не знаем, что его заданное по умолчанию начальное значение является статическим.

@ Эта проблема преодолена в Аде 2005 введением прагмы Preelaborable_Initialization. Её синтаксис:

  1        pragma Preelaborable_Initialization (direct_name);

@ Теперь мы можем написать:

  1        package Q is
  2                pragma Preelaborate (Q);
  3                type T is private;
  4                pragma Preelaborable_Initialization (T);
  5        private
  6                type T is
  7                        record
  8                                X : Integer := 7;
  9                                B : Boolean := True;
 10                        end record;
 11        end Q;

@ Прагма обещает, что у полного типа будет 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.

@ ENG RUS

TOP BACK NEXT

2010-10-24 00:26:58

. .