Rationale for Ada 2005: Introduction

RUSTOP
BACKNEXT

ENG

3.6 Standard library

@ There are significant improvements to the standard library in Ada 2005. One of the strengths of Java is the huge library that comes with it. Ada has tended to take the esoteric view that it is a language for constructing programs from components and has in the past rather assumed that the components would spring up by magic from the user community. There has also perhaps been a reluctance to specify standard components in case that preempted the development of better ones. However, it is now recognized that standardizing useful stuff is a good thing. And moreover, secondary ISO standards are not very helpful because they are almost invisible. Ada 95 added quite a lot to the predefined library and Ada 2005 adds more.

@ First, there are packages for manipulating vectors and matrices already mentioned in Section 3.5 when discussing formal package parameters. There are two packages, Ada.Numerics.Generic_Real_Arrays for real vectors and matrices and Ada.Numerics.Generic_Complex_Arrays for complex vectors and matrices. They can be instantiated according to the underlying floating point type used. There are also nongeneric versions as usual.

@ These packages export types for declaring vectors and matrices and many operations for manipulating them. Thus if we have an expression in mathematical notation such as

  1        y = Ax + z

@ where x, y and z are vectors and A is a square matrix, then this calculation can be simply programmed as

  1        X, Y, Z : Real_Vector (1 .. N);
  2        A : Real_Matrix (1 .. N, 1 .. N);
  3        ...
  4        Y := A * X + Z;

@ and the appropriate operations will be invoked. The packages also include subprograms for the most useful linear algebra computations, namely, the solution of linear equations, matrix inversion and determinant evaluation, plus the determination of eigenvalues and eigenvectors for symmetric matrices (Hermitian in the complex case). Thus to determine X given Y, Z and A in the above example we can write

  1        X := Solve (A, Y - Z);

@ It should not be thought that these Ada packages in any way compete with the very comprehensive BLAS (Basic Linear Algebra Subprograms). The purpose of the Ada packages is to provide simple implementations of very commonly used algorithms (perhaps for small embedded systems or for prototyping) and to provide a solid framework for developing bindings to the BLAS for more demanding situations. Incidentally, they are in the Numerics annex.

@ Another (but very trivial) change to the Numerics annex is that nongeneric versions of Ada.Text_IO.Complex_IO have been added in line with the standard principle of providing nongeneric versions of generic predefined packages for convenience. Their omission from Ada 95 was an oversight.

@ There is a new predefined package in Annex A for accessing tree-structured file systems. The scope is perhaps indicated by this fragment of its specification

  1        with ...
  2        package Ada.Directories is
  3                -- Directory and file operations
  4                function Current_Directory return String;
  5                procedure Set_Directory (Directory : in String);
  6                ...
  7                -- File and directory name operations
  8                function Full_Name (Name : in String) return String;
  9                function Simple_Name (Name : in String) return String;
 10                ...
 11                -- File and directory queries
 12                type File_Kind is (Directory, Ordinary_File, Special_File);
 13                type File_Size is range 0 .. implementation-defined;
 14                function Exists (Name : in String) return Boolean;
 15                ...
 16                -- Directory searching
 17                type Directory_Entry_Type is limited private;
 18                type Filter_Type is array (File_Kind) of Boolean;
 19                ...
 20                -- Operations on directory entries
 21                ...
 22        end Ada.Directories;

@ The package contains facilities which will be useful on any Unix or Windows system. However, it has to be recognized that like Ada.Command_Line it might not be supportable on every environment.

@ There is also a package Ada.Environment_Variables for accessing the environment variables that occur in most operating systems.

@ A number of additional subprograms have been added to the existing string handling packages. There are several problems with the Ada 95 packages. One is that conversion between bounded and unbounded strings and the raw type String is required rather a lot and is both ugly and inefficient. For example, searching only part of a bounded or unbounded string can only be done by converting it to a String and then searching the appropriate slice (or by making a truncated copy first).

@ In brief the additional subprograms are as follows

@ As well as these additions there is a new package Ada.Text_IO.Unbounded_IO for the input and output of unbounded strings. This again avoids unnecessary conversion to the type String. Similarly, there is a generic package Ada.Text_IO.Bounded_IO; this is generic because the package Strings.Bounded has an inner generic package which is parameterized by the maximum string length.

@ Finally, two functions Get_Line are added to Ada.Text_IO itself. These avoid difficulties with the length of the string which occurs with the existing procedures Get_Line.

@ In Ada 83, program identifiers used the 7-bit ASCII set. In Ada 95 this was extended to the 8-bit Latin-1 set. In Ada 2005 this is extended yet again to the entire ISO/IEC 10646:2003 character repertoire. This means that identifiers can now use Cyrillic and Greek characters. Thus we could extend the animal example by

  1        _T____ : access Pig renames Napoleon;
  2        Конь_Тыгыдымский : Horse;

@ In order to encourage us to write our mathematical programs nicely the additional constant

  1        p : constant := Pi;

@ has been added to the package Ada.Numerics in Ada 2005.

@ In a similar way types Wide_String and Wide_Character were added to Ada 95. In Ada 2005 this process is also extended and a set of wide-wide types and packages for 32-bit characters are added. Thus we have types Wide_Wide_Character and Wide_Wide_String and so on.

@ A major addition to the predefined library is the package Ada.Containers and its children plus some auxiliary child functions of Ada.Strings. These are very important and considerable additions to the predefined capability of Ada and bring the best in standard data structure manipulation to the fingers of every Ada programmer. The scope is perhaps best illustrated by listing the units involved.

@ Ada.Containers - this is the root package and just declares types Hash_Type and Count_Type which are an implementation-defined modular and integer type respectively.

@ Ada.Strings.Hash - this function hashes a string into the type Hash_Type. There are also versions for bounded and unbounded strrings.

@ Ada.Containers.Vectors - this is a generic package with parameters giving the index type and element type of a vector plus "=" for the element type. This package declares types and operations for manipulating vectors. (These are vectors in the sense of flexible arrays and not the mathematical vectors used for linear algebra as in the vectors and matrices packages mentioned earlier.) As well as subprograms for adding, moving and removing elements there are also generic subprograms for searching, sorting and iterating over vectors.

@ Ada.Containers.Doubly_Linked_Lists - this is a generic package with parameters giving the element type and "=" for the element type. This package declares types and operations for manipulating doubly-linked lists. It has similar functionality to the vectors package. Thus, as well as subprograms for adding, moving and removing elements there are also generic subprograms for searching, sorting and iterating over lists.

@ Ada.Containers.Hashed_Maps - this is a generic package with parameters giving a key type and an element type plus a hash function for the key, a function to test for equality between keys and "=" for the element type. It declares types and operations for manipulating hashed maps.

@ Ada.Containers.Ordered_Maps - this is a similar generic package for ordered maps with parameters giving a key type and an element type and "<" for the key type and "=" for the element type.

@ Ada.Containers.Hashed_Sets - this is a generic package with parameters giving the element type plus a hash function for the elements and a function to test for equality between elements. It declares types and operations for manipulating hashed sets.

@ Ada.Containers.Ordered_Sets - this is a similar generic package for ordered sets with parameters giving the element type and "<" and "=" for the element type.

@ There are then another six packages with similar functionality but for indefinite types with corresponding names such as Ada.Containers.Indefinite_Vectors.

@ Ada.Containers.Generic_Array_Sort - this is a generic procedure for sorting arrays. The generic parameters give the index type, the element type, the array type and "<" for the element type. The array type is unconstrained.

@ Finally there is a very similar generic procedure Ada.Containers.Generic_Constrained_Array_Sort but for constrained array types.

@ It is hoped that the above list gives a flavour of the capability of the package Containers. Some examples of the use of the facilities will be given in a later paper.

@ Finally, there are further packages for manipulating times (that is of type Ada.Calendar.Time and not Ada.Real_Time.Time and thus more appropriate in a discussion of the predefined library than the real-time features). The package Ada.Calendar has a number of obvious omissions and in order to rectify this the following packages are added.

@ Ada.Calendar.Time_Zones - this declares a type Time_Offset describing in minutes the difference between two time zones and a function UTC_Time_Offset which given a time returns the difference between the time zone of Calendar at that time and UTC (Coordinated Universal Time which is close to Greenwich Mean Time). It also has an exception which is raised if the time zone of Calendar is not known (maybe the clock is broken).

@ Ada.Calendar.Arithmetic - this declares various types and operations for coping with leap seconds.

@ Ada.Calendar.Formatting - this declares further types and operations for dealing with formatting and related matters.

@ Most of the new calendar features are clearly only for the chronological addict but the need for them does illustrate that this is a tricky area. However, a feature that all will appreciate is that the package Ada.Calendar.Formatting includes the following declarations

  1        type Day_Name is (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday);
  2        function Day_Of_Week(Date: Time) return Day_Name;

@ There is also a small change in the parent package Ada.Calendar itself. The subtype Year_Number is now

  1        subtype Year_Number is Integer range 1901 .. 2399;

@ This reveals confidence in the future of Ada by adding another three hundred years to the range of dates.

Rationale for Ada 2005: Introduction

ENGRUSTOP
BACKNEXT

3.6 Стандартная библиотека.

@ Есть существенные усовершенствования к стандартной библиотеке Ады 2005. Одно из приемуществ языка Java - огромная библиотека, которая идет вместе с ним. Разработчики Ады наивно полагали, что Ада - язык для того, чтобы создавать программы из компонентов и предполагали, что компоненты возникнут сами собой из пользовательского семейства. Также возможно, было нежелание определять стандартные компоненты из опасения что это исключило бы разработку лучших. Однако, теперь понятно, что стандартизация полезного материала является хорошей вещью. И кроме того, вторичные стандарты Международной организации по стандартизации не очень полезны, потому что они почти невидимы. Ада 95 добавила довольно много к предопределенной библиотеке Ады, которую Ада 2005 добавляет ещё больше.

@ Во-первых, есть пакеты для обработки векторов и матриц уже упомянутые в разделе 3.5, при обсуждении формальных параметров пакетов. Это пакет Ada.Numerics.Generic_Real_Arrays для векторов и матриц с элементами типа Real и пакет Ada.Numerics.Generic_Complex_Arrays для комплексных чисел. Они могут быть конкретизированы согласно основному типу с плавающей запятой. Имеется также nongeneric версия.

@ Эти пакеты экспортируют типы для объявления векторов и матриц и набор операций для их обработки. Таким образом, если у нас есть выражение в математическом виде:

  1        y = Ax + z

@ где x, y и z - векторы, и A - квадратная матрица, тогда это вычисление может быть просто запрограммировано как:

  1        X, Y, Z : Real_Vector (1 .. N);
  2        A : Real_Matrix (1 .. N, 1 .. N);
  3        ...
  4        Y := A * X + Z;

@ и будут вызваны соответствующие операции. Пакеты также включают подпрограммы для самых полезных вычислений линейной алгебры, а именно, решения линейных уравнений, матричной инверсии и определяющей оценки, плюс определение собственных значений и собственных векторов для симметричных матриц (Hermitian в сложном случае). Таким образом, чтобы определить X данных Y, Z и в вышеупомянутом примере мы можем написать:

  1        X := Solve (A, Y - Z);

@ Нельзя считать, что эти пакеты Ады в любом случае конкурируют с очень всесторонним пакетом BLAS (Основные Линейные Подпрограммы Алгебры). Цель пакетов Ады состоит в том, чтобы обеспечить простые реализации наиболее используемых алгоритмов (возможно для маленьких внедренных систем или для того, чтобы моделировать) и служить твердой основой для того, чтобы разработать связывания к BLAS для более требовательных ситуаций. Случайно, они находятся в приложении Численных данных.

@ Другое (но очень тривиальное) изменение на приложение Численных данных, состоит в том, что неуниверсальные версии пакета Ada.Text_IO.Complex_IO были добавлены в соответствии со стандартным принципом обеспечения неуниверсальных версий универсальных предопределенных пакетов для удобства. Их вычеркивание от ada было оплошностью.

@ Есть новый предопределенный пакет в Приложении A для работы с файловыми системами с древовидной структурой. Область применения возможно обозначена этим фрагментом ее спецификации:

  1        with ...
  2        package Ada.Directories is
  3                -- Directory and file operations
  4                function Current_Directory return String;
  5                procedure Set_Directory (Directory : in String);
  6                ...
  7                -- File and directory name operations
  8                function Full_Name (Name : in String) return String;
  9                function Simple_Name (Name : in String) return String;
 10                ...
 11                -- File and directory queries
 12                type File_Kind is (Directory, Ordinary_File, Special_File);
 13                type File_Size is range 0 .. implementation-defined;
 14                function Exists (Name : in String) return Boolean;
 15                ...
 16                -- Directory searching
 17                type Directory_Entry_Type is limited private;
 18                type Filter_Type is array (File_Kind) of Boolean;
 19                ...
 20                -- Operations on directory entries
 21                ...
 22        end Ada.Directories;

@ Пакет содержит средства, которые будут полезны в любой Unix или Windows системе. Однако, он как и пакет Ada.Command_Line не может быть приемлем в любой другой среде.

@ Есть также пакет Ada.Environment_Variables для того, чтобы обратиться к переменным среды, которые имеются в большинстве операционных систем.

@ Много дополнительных подпрограмм было добавлено к существующим пакетам обработки строк. Есть несколько проблем с пакетами ada. Одна из них, это преобразование между ограниченными и неограниченными строками, и необработанный тип String требует слишком много возни, он уродлив и неэффективен. Например, поиск фрагмента ограниченной или неограниченной строки может быть сделан, преобразовывая её в String и затем ища в соответствующем секторе (или делая обрезанную копию сначала).

@ Вкратце дополнительные подпрограммы следующие:

@ Так же добавлен новый пакет Ada.Text_IO.Unbounded_IO для ввода и вывода неограниченных строк. Он так же избегает ненужного преобразования в тип String. Точно так же есть универсальный пакет Ada.Text_IO.Bounded_IO; Он является универсальным потому что пакет String.Bounded имеет внутренний универсальный пакет, который параметризуется максимальной строковой длиной.

@ Наконец, две функции Get_Line добавлены в пакет Ada.Text_IO непосредственно. Они избегают трудностей с длиной строки, которая происходит с существующими процедурами Get_Line.

@ В Аде 83 идентификаторы программы использовали 7-битный набор ASCII. В Аде 95 это было расширено на 8-битный набор Latin-1. В Аде 2005 это расширено на весь ISO/IEC 10646:2003 символьный набор. Это означает, что идентификаторы могут теперь использовать кириллические и греческие символы. Таким образом, мы могли бы теперь расширить пример про животных:

  1        _T____ : access Pig renames Napoleon;
  2        Конь_Тыгыдымский : Horse;

@ Чтобы поощрить нас писать математические программы дополнительная константа:

  1        <font face="Symbol" size=+1>p</<code>font><font face="Courier New"> : constant := Pi;</<code>font>

@ была добавлена к пакету Ada.Numerics в Аде 2005.

@ Подобные типы Wide_String и Wide_Character были добавлены к Аде 95. В Аде 2005 этот процесс был продолжен добавлением набора wide-wide типов и пакетов для 32-разрядных символов. Таким образом, у нас есть типы Wide_Wide_Character и Wide_Wide_String и так далее.

@ Главное добавление к предопределенной библиотеке - пакет Ada.Containers и его дочерние записи плюс некоторые вспомогательные дочерние функции к пакету Ada.Srings. Они - очень важное и значительное добавление к предопределенной библиотеке Ады и вкладывают лучшие средства для стандартной манипуляции структурами данных в руки каждого Ада программиста. Область охвата нововедений лучше всего проиллюстрировать, перечисляя вовлеченные модули:

@ Ada.Containers - корневой пакет, который только объявляет типы Hash_Type и Count_Type, которые являются определяемым реализацией модульным и целочисленным типом соответственно.

@ Ada.Strings.Hash - эта функция крошит строку в типа Hash_Type. Есть также версии для bounded и unbounded strings.

@ Ada.Containers.Vectors - универсальный пакет с параметрами, дающими индексный тип и тип элемента вектора плюс "=" для типа элемента. Этот пакет объявляет типы и операции для того, чтобы управлять векторами. (Под векторами понимаются массивы с переменными границами, а не математические векторы, используемые для линейной алгебры как в векторах и пакетах матриц упоминаемых ранее). Так же как подпрограммы для того, чтобы добавить, двигать и удалять элементы есть также универсальные подпрограммы для того, чтобы искать, сортировать и выполнять итерации с векторами.

@ Ada.Containers.Doubly_Linked_Lists - универсальный пакет с параметрами, дающими тип элемента и "=" для типа элемента. Этот пакет объявляет типы и операции для управления двунаправленно-связанными-списками. У него есть функциональные возможности подобные векторному пакету. Таким образом, так же как подпрограммы для того, чтобы добавить, двигать и удалять элементы есть также универсальные подпрограммы для того, чтобы искать, сортировать и выполнять итерации со списками.

@ Ada.Containers.Hashed_Maps - универсальный пакет с параметрами, дающими key тип и element тип плюс хеш-функцию для key, функцию для проверки на равенство между keys и "=" для типа элемента. Он объявляет типы и операции для управления HASH картами.

@ Ada.Containers.Ordered_Maps - подобный универсальный пакет для ordered карт с параметрами, дающими key тип и element тип и "<" для ключевого типа и "=" для типа элемента.

@ Ada.Containers.Hashed_Sets - универсальный пакет с параметрами, дающий тип элемента плюс хеш-функцию для элементов и функции для проверки на равенство между элементами. Он объявляет типы и операции для управления HASH наборами.

@ Ada.Containers.Ordered_Sets - подобный универсальный пакет для ordered наборов с параметрами, дающий тип элемента и "<" и "=" для типа элемента.

@ Есть еще шесть пакетов с подобными функциональными возможностями, но для неопределенных типов с соответствующими названиями, такими как Ada.Containers.Indefinite_Vectors.

@ Ada.Containers.Generic_Array_Sort - это - универсальная процедура для того, чтобы сортировать массивы. Универсальные параметры дают индексный тип, тип элемента, тип массива и "<" для типа элемента. Тип массива является неограниченным.

@ Наконец, есть очень похожая универсальная процедура Ada.Containers.Generic_Constrained_Array_Sort, но для constrained типов массива.

@ Надеемся, что вышеупомянутый список дает общее представление возможностей пакета Containers. Некоторые примеры использования его средств будут даны в более поздней публикации.

@ Наконец, есть новые пакеты для того, чтобы управлять временем (которое имеет тип Ada.Calendar.Time, а не Ada.Real_Time.Time и, таким образом, более соответствующее предопределенной библиотеке чем особенности в реального времени). У пакета Ada.Calendar есть много очевидных исправлений на этот счёт.

@ Ada.Calendar.Time_Zones - объявляет тип Time_Offset в минутах отражающий различие между двумя часовыми поясами и функцией UTC_Time_Offset, которая возвращает различие между часовым поясом и UTC (Координированное Среднее Гринвичское время). У него также есть исключение, которое возбуждается, если часовой пояс Календаря не известен (возможно, тактовый генератор сломан).

@ Ada.Calendar.Arithmetic - объявляет различные типы и операции для того, чтобы манипулировать секндами.

@ Ada.Calendar.Formatting - объявляет новые типы и операции для того, чтобы управлять форматированием представления времени и даты.

@ Большинство новых календарных возможностей понятны только для хронологического наркомана, но потребность в них действительно иллюстрирует то это - хитрая область. Однако, особенность, которую все будут ценить это то, что пакет Ada.Calendar.Formatting включает следующие объявления:

  1        type Day_Name is (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday);
  2        function Day_Of_Week (Date : Time) return Day_Name;

@ Имеется также небольшое изменение непосредственно в родительском пакете Ada.Calendar:

  1        subtype Year_Number is Integer range 1901 .. 2399;

@ Это показывает уверенность в будущем Ады, добавляя еще в 300 лет к диапазону дат.

ENG RUS

TOP BACK NEXT

2010-10-24 00:26:52

купить ps3 . .