Диалект языка программирования Ada

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

Предыдущий пересмотр состоялся в 1995г и внес в язык Ада
такие возможности, как объектно-ориентированное программирование путем
расширений типов, иерархические библиотеки и защищенные объекты. Целью
нового пересмотра стандарта является утверждение языка Ада
в таких качествах, как надежность, производительность, гибкость,
переносимость, взаимодействие с другими языками и поддержка
программирования задач реального времени.

К расширениям в области ООП относятся: интерфейсы, новая нотация
вызовов операций, вложенные расширения типов, родовой конструктор.

  • Кроме обычных (процедурных) интерфейсов вводятся также
    синхронные. Синхронные интерфейсы могут быть реализованы только
    задачными и защищенными типами.
  • Введен новый тип описаний процедур - пустые (null).
    Они эквивалентны процедурам с телом из одной пустой инструкции. Кроме
    применения при спецификации интерфейсов, пустые процедуры также могут
    быть использованы как параметры по умолчанию в настраиваемых модулях.
    Такие параметры могут быть опущены при конкретизации модуля.
  • Теперь в языке поддерживается новая нотация вызова
    операций, часто используемая в других ООП языках. Вызов может быть
    записан в форме Объект.Операция(Аргументы).

  • По правилам языка Ада 95
    расширение типа (подкласс в терминологии других ОО языков) должно
    находиться на том же лексическом уровне, что и описание родительского
    типа. В новом стандарте это ограничение ослаблено, и введены
    необходимые проверки, чтобы нельзя было вернуть объект нового типа (или
    указатель на него) из подпрограммы, где этот тип описан.

  • Ссылочные типы делятся на именованные и анонимные. В языке Ада 95
    существует заметная асимметричность между этими типами. Например, для
    анонимных типов нельзя задать пустое значение, или ограничить
    указываемые объекты константами. В новом стандарте ссылочные типы, как
    именованные, так и анонимные, стали более выразительными. Любой
    ссылочный тип можно ограничить так, что он не будет иметь пустых
    значений (null). Можно ограничить анонимные типы ссылками на константы.
  • Введены анонимные ссылки на подпрограммы.
    Использование анонимных ссылок на подпрограммы решает проблему с
    ограничением уровня вложенности. Например, при использовании
    именованных ссылочных типов нельзя присвоить ссылку на процедуру,
    находящуюся на более вложенном уровне, чем сам ссылочный тип. Вместо
    этого можно использовать анонимный тип. Этот прием широко используется
    в новой библиотеке контейнеров.
  • Анонимные типы теперь могут использоваться не только
    в параметрах и дискриминантах, но и в компонентах сложных типов, как
    результат, возвращаемый функцией, и в переименованиях. Широкое
    использование анонимных типов позволяет избежать явного преобразования
    типов, сохраняя при этом контроль над областью видимости. Отпадает
    необходимость в неполных описаниях типов при построении ссылок объекта
    на самого себя.
  • Циклическое определение типов между пакетами. Новый
    спецификатор видимости "limited with" позволяет внутри модуля иметь
    доступ к ограниченному виду другого модуля, не создавая синтаксической
    зависимости между модулями. В этот вид входят только неполные описания
    (incomplete) типов и дочерние пакеты. Таким образом, несколько пакетов
    могут иметь ссылки на типы друг друга, формирующие циклическую
    структуру, если хотя бы один пакет имеет спецификатор "limitied with".
  • Благодаря новой форме спецификатора видимости
    "private with" появилась возможность использовать определения из
    приватных пакетов в приватной части обычных пакетов. В Аде 95 приватные пакеты могли использоваться только в телах и спецификациях других приватных пакетов.

  • Основное назначение лимитированных типов - обеспечить невозможность
    копирования объектов данного типа. В то же время в языке Ада 95
    лимитированные типы обладают рядом ограничений, напрямую не связанных с
    невозможностью копирования. В новом стандарте эти ограничения
    ослаблены, теперь для инициализации объектов лимитированных типов можно
    использовать агрегаты и вызовы функций.
  • Для конструирования объектов, возвращаемых функцией,
    расширен синтаксис инструкции return. Расширенная форма представляет
    собой составную инструкцию return-do-end return, которая явно
    определяет возвращаемый объект и выполняет произвольные действия для
    его инициализации.

  • В новом стандарте была значительно расширена и доработана стандартная библиотека языка.

  • Векторы и матрицы. Введены настраиваемые пакеты для работы с векторами
    и матрицами. Пакеты поддерживают арифметические операции,
    транспонирование и обращение матриц, нахождение детерминанта, решение
    системы линейных уравнений.
  • Расширен диапазон символьных типов. Введены новые
    типы Wide_Wide_Character и Wide_Wide_String, позволяющие хранить
    32-битные Unicode. В лексике языка также произошли изменения. Теперь
    правила формирования идентификаторов взяты из стандарта Unicode. В
    итоге, мы можем свободно писать идентификаторы на любом языке. В пакет
    Ada.Numerics введена константа с именем "греческая пи".
  • Библиотека контейнеров Ada.Containers содержит
    настраиваемые типы векторов, связных списков, хешей и множеств. Она
    включает алгоритмы итераций, поиска и сортировки.

  • Расширена работа с датой/временем, введены временные зоны, форматирование и арифметические операции.

  • Появилась возможность явного контроля перегрузки операций. При описании
    примитивной операции можно указать фразу "overloading" и компилятор
    проверит, что операция действительно перегружает унаследованную
    операцию родительского типа. При указании "not overloading" перегрузка
    не произойдет даже, если родительский тип имел соответствующую
    операцию. Эта возможность особенно важна для настраиваемых модулей,
    когда заранее не известен родительский тип и набор его примитивных
    операций.

  • Стандартизованы директивы компилятору Assert, Assertion_Policy, Unsuppress, No_Return.

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




Конструктор сайтов - uCoz
Copyright MyCorp © 2017