1.4. ОБЗОР СВОЙСТВ ЯЗЫКА

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

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

Ада-программа обычно будет использовать библиотеку программных модулей общего назначения.

Язык предоставляет средства, с помощью которых отдельные организации могут создавать свои собственные библиотеки. В тексте раздельно компилируемого программного модуля должны быть указаны имена библиотечных модулей, которые ему требуются.

Программные модули. Подпрограмма является основным модулем для представления алгоритма. Существует два вида подпрограмм: процедуры и функции. Процедура — это средство вызова последовательности действий. Например, она может считывать данные, изменять значения переменных или выводить информацию. Процедура может иметь параметры для управления механизмом передачи информации между процедурой и точкой вызова.

Функция — это средство вызова действий по вычислению значения. Она подобна процедуре, но в результате выполнения еще и возвращает значение.

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

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

Описания и операторы. Тело программного модуля, как правило, содержит две части: раздел описаний, который определяет логические понятия, используемые в программном модуле, и последовательность операторов, определяющую выполнение этого программного модуля.

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

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

Оператор присваивания изменяет значение переменной. Вызов процедуры инициирует выполнение процедуры после сопоставления каждого фактического параметра, заданного в вызове, соответствующему формальному параметру.

Оператор выбора и условный оператор позволяют выполнить одну из входящих в них последовательностей операторов, определяемую значением выражения или значением условия.

Оператор цикла обеспечивает основной итерационный механизм в языке. Оператор цикла задает повторение выполнения некоторой последовательности операторов по заданной итерационной схеме или до выполнения оператора выхода.

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

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

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

Типы данных. Каждый объект языка имеет тип, характеризующий множество значений и множество применимых к ним операций. Основные классы типов — это скалярные типы (включающие перечислимые и числовые типы), составные, ссылочные и личные типы.

Перечислимый тип определяет упорядоченное множество различных литералов перечисления, например список состояний или перечень символов. Перечислимые типы BOOLEAN и CHARACTER предопределены.

Числовые типы обеспечивают средства выполнения точных или приближенных числовых вычислений. Для точных вычислений используются целые типы, которые обозначают множества последовательных целых чисел. В приближенных вычислениях используются либо фиксированные типы (типы чисел с фиксированной точкой), представимые с абсолютной погрешностью, либо плавающие типы (типы чисел с плавающей точкой), представимые с относительной погрешностью. Числовые типы INTEGER, FLOAT и DURATION предопределены.

Составные типы допускают определения структурных объектов из сгруппированных компонент. Составные типы в языке представлены массивами и записями. Массив — это объект с индексируемыми компонентами одного и того же типа. Запись — это объект с именованными компонентами, возможно, различных типов. Индексируемый тип STRING предопределен.

Запись может иметь специальные компоненты, называемые дискриминантами. В записях можно определить альтернативные структуры, зависящие от значений дискриминантов.

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

Личные типы могут быть определены в пакете, скрывающем внутреннюю структуру, несущественную вне пакета. Пользователю таких типов видны логически существенные их свойства (включая дискриминанты).

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

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

Ввод-вывод в языке определен средствами предопределенных библиотечных пакетов. Предоставляются средства для ввода-вывода значений типов, определенных пользователем, а также значений предопределенных типов; обеспечивается представление изображений значений в стандартной форме.

Наконец, язык предоставляет мощные средства параметризации программных модулей, называемых настраиваемыми программными модулями. Параметрами настройки могут быть типы и подпрограммы (а также объекты), и, таким образом, допустимы общие алгоритмы, применимые для всех типов данного класса.