Rationale for Ada 2005: Predefined library

RUSTOP
BACKNEXT

ENG

8. Streams

@ Important improvements to the control of streams were described in the paper on the object oriented model where we discussed the new package Ada.Tags.Generic_Dispatching_Constructor and various changes to the parent package Ada.Tags itself. In this section we mention two other changes.

@ There is a problem with the existing stream attributes such as (see RM 13.13.2)

  1        procedure S'Write (Stream : access Root_Stream_Type'Class; Item : in T);

@ where S is a subtype of T. Note that for the parameter Item, its type T is in italic and so has to be interpreted according to the kind of type. In the case of integer and enumeration types it means that the parameter Item has type T'Base.

@ Given a declaration such as

  1        type Index is range 1 .. 10;

@ different implementations might use different representations for Index'Base – some might use 8 bits others might use 32 bits and so on.

@ Now stream elements themselves are typically 8 bits and so with an 8-bit base, there will be one value of Index per stream element whereas with a 32-bit base each value of Index will take 4 stream elements. Clearly a stream written by the 8-bit implementation cannot be read by the 32-bit one.

@ This problem is overcome in Ada 2005 by the introduction of a new attribute Stream_Size. The universal integer value S'Stream_Size gives the number of bits used in the stream for values of the subtype S. We are guaranteed that it is a multiple of Stream_Element'Size. So the number of stream elements required will be

  1        S'Stream_Size / Stream_Element'Size

@ We can set the attribute in the usual way provided that the value given is a static multiple of Stream_Element'Size. So in the case above we can write

  1        for Index'Stream_Size use 8;

@ and portability is then assured. That is provided that Stream_Element_Size is 8 anyway and that the implementation accepts the attribute definition clause (which it should).

@ A minor change is that the parameter Stream of the various atttributes now has a null exclusion so that S'Write is in fact

  1        procedure S'Write (Stream : not null access Root_Stream_Type'Class; Item : in T);

@ Perhaps surprisingly this does not introduce any incompatibilities since in Ada 95 passing null raises Constraint_Error anyway and so this change just clarifies the situation.

@ On this dullish but important topic here endeth the Rationale for Ada 2005 apart from various exciting appendices and an extensive subpaper on containers.

Rationale for Ada 2005: Predefined library

@ENGRUSTOPBACKNEXT

8. Потоки

@ Важные усовершенствования в управлении потоками были описаны в статье посвящённой объектно-ориентированной модели где мы обсуждали новый пакет Ada.Tags.Generic_Dispatching_Constructor а также различные изменения родительского пакета Ada.Tags. В этой секции мы рассмотрим два других изменения.

@ Имеется проблема с существующими потоковыми атрибутами такими как (см. RM 13.13.2)

  1        procedure S'Write (Stream : access Root_Stream_Type'Class; Item : in T);

@ где S - подтип T. Отметим, что для параметра Item, его тип T находится в курсиве и так должен быть интерпретирован согласно виду типа. В случае целого числа и типа перечисления это означает, что у параметра Item есть тип T'Base.

@ Учитывая объявление:

  1        type Index is range 1 .. 10;

@ различные реализации могли бы использовать различные представления для Index'Base - некоторые могли бы использовать 8 бит, другие 32 бита, и так далее.

@ Сейчас размер потокового элемента как правило - 8 бит и, таким образом, с 8-битной базой мы будем иметь одно значение Index на потоковый элемент, тогда как с 32-разрядной базой каждое значение Index займёт 4 потоковых элемента. Ясно что поток, записанный 8-битной реализацией не может читаться 32-разрядной.

@ Эта проблема преодолена в Аде 2005 введением нового атрибута Stream_Size. Универсальное целочисленное значение S'Stream_Size дает число бит, используемых в потоке для значений подтипа S. Нам гарантируется что оно является множителем для Stream_Element'Size. Таким образом, необходимое число потоковых элементов будет:

  1        S'Stream_Size / Stream_Element'Size

@ Мы можем установить атрибут обычным способом при условии, что данное значение является статическим множителем Stream_Element'Size. Так в случае рассмотренном выше мы можем написать:

  1        for Index'Stream_Size use 8;

@ и мобильность тогда гарантирована. Но только при условии, что Stream_Element_Size имеет значение 8 и что реализация принимает соответствующее определения атрибута.

@ Другое незначительное изменение состоит в том, что теперь у различных атрибутов параметра Stream есть нулевое исключение такое, что S'Write имеет вид:

  1        procedure S'Write (Stream : not null access Root_Stream_Type'Class; Item : in T);

@ Возможно удивительно что это не приводит к несовместимости с Адой 95 т.к. передача пустых указателей всё равно вызывает Constraint_Error и, таким образом, это изменение только разъясняет ситуацию.

@ Этой небольшой но важной темой мы почти заканчиваем Разяснение для Ады 2005 за исключением разного рода приложений и обширной темы о контейнерах которые будут рассматриваться в последующих статьях.

@ ENG RUS

TOP BACK NEXT

2010-10-24 00:26:59

. .