Пакет - основной конструкт для определения именованного контекста (иногда говорят "логически связанной" совокупности объектов). Несколько расплывчатое "логически связанной" подразумевает возможность объединить в пакет все то, что автор пожелает видеть единым модулем, названным подходящим именем. Это может быть сделано потому, что все связанные в пакет объекты, во-первых, предполагается использовать совместно; во-вторых, необходимо или удобно совместно реализовывать; в-третьих, невозможно или неудобно раздельно определять из-за ограничений на ВИДИМОСТЬ имен. Возможны и иные причины объединения в один пакет определений отдельных имен. Часть из них может быть при этом скрыта, ЗАЩИЩЕНА от непосредственного использования другими модулями; доступ к таким именам строго регламентирован - только через имена, в спецификации пакета явно предназначенные для внешнего использования.
Задача - основной конструкт для определения асинхронного процесса, способного выполняться параллельно с другими процессами. Процессом называется определенным образом идентифицируемая последовательность действий исполнителя, линейно-упорядоченная во времени. В одном модуле-задаче можно определить один асинхронный процесс или совокупность аналогичных асинхронных процессов (так называемый ЗАДАЧНЫЙ ТИП). Асинхронность можно обеспечивать как отдельными процессорами для каждого процесса, так и "прерывистым" выполнением различных процессов на одном процессоре.
2.3.2. Объявления и операторы
В теле модуля в общем случае две части - ОБЪЯВЛЕНИЯ и ОПЕРАТОРЫ.
Объявления вводят новые знаки (ИМЕНА) и связывают их с денотатами (ОБЪЕКТАМИ). Эта связь имени с определенным объектом (знаковая ситуация) сохраняет силу в пределах ОБЛАСТИ ДЕЙСТВИЯ имени. Таким образом, формально объект - это то, что можно именовать. Вместе с тем авторы языка Ада стремились к тому, чтобы ада-объектами было удобно представлять содержательные объекты решаемой задачи. Ада-объектами могут быть, в частности, ПОСТОЯННАЯ, ПЕРЕМЕННАЯ, ТИП, ИСКЛЮЧЕНИЕ, ПОДПРОГРАММА, ПАКЕТ, ЗАДАЧА и РОДОВОЙ модуль.
Операторы предписывают действия, которые выполняются в порядке следования операторов в тексте программы (если только операторы ВЫХОДА из конструкта (exit), ВОЗВРАТА (return), ПЕРЕХОДА по метке (go to) или возникновение исключения (исключительной ситуации) не заставят продолжить исполнение с другого места).
Оператор ПРИСВАИВАНИЯ изменяет значение переменной.
ВЫЗОВ ПРОЦЕДУРЫ активизирует исполнение соответствующей процедуры после связывания каждого фактического параметра (АРГУМЕНТА) с соответствующим формальным параметром (ПАРАМЕТРОМ).
УСЛОВНЫЙ (if) и ВЫБИРАЮЩИЙ (case) операторы позволяют выбрать одну из возможных вложенных последовательностей операторов в зависимости от значения УПРАВЛЯЮЩЕГО ВЫРАЖЕНИЯ (условия).
Оператор ЦИКЛА - основной конструкт для описания повторяющихся действий. Он предписывает повторять указанные в его теле действия до тех пор, пока не будет выполнен оператор выхода, явно указанный в теле цикла, или не станет истинным условие окончания цикла.
Блочный оператор (БЛОК) соединяет последовательность операторов с непосредственно предшествующими ей объявлениями в единую ОБЛАСТЬ ЛОКАЛИЗАЦИИ. Объявленные в ней объекты считаются ЛОКАЛЬНЫМИ в этой области.
Имеются операторы, обслуживающие взаимодействие асинхронных процессов.
При исполнении модуля могут возникать ошибочные ситуации, в которых нельзя нормально продолжать работу. Например, возможно арифметическое переполнение или попытка получить доступ к компоненте массива с несуществующим индексом. Для обработки таких ИСКЛЮЧЕНИЙ (исключительных ситуаций) в конце сегментов можно разместить специальные операторы РЕАКЦИИ на исключение (exception). Имеются и явные операторы ВОЗБУЖДЕНИЯ исключений (raise). Они включают в действие аппарат обработки возбужденного исключения.
2.3.3. Типы данных
Среди объектов языка Ада можно выделить ОБЪЕКТЫ ДАННЫХ (т. е. объекты, которым разрешено играть роль данных по отношению к каким-либо операциям). Каждый объект данных в Аде характеризуется определенным ТИПОМ. Своеобразие этого языка в значительной степени связано именно с системой типов. Для тех, кто работал только с Фортраном, Алголом и Бейсиком, многое в этой системе окажется совершенно незнакомым. В частности, возможность определять новые типы, отражающие особенности решаемой задачи. Для освоивших Паскаль адовские типы привычнее, но система адовских типов полнее и строже.
Тип, с одной стороны, - важнейшая компонента аппарата прогнозирования-контроля. Приписывая объекту данных определенный тип, ограничивают его возможное поведение. С другой стороны, зная тип, получают возможность это поведение контролировать. Наконец, зная ограничения на возможное поведение, можно рационально выделять память и другие ресурсы. С типом в Аде связывают три основных ограничения.
Тип ограничивает, во-первых, ОБЛАСТЬ ЗНАЧЕНИЙ объекта; во-вторых, НАБОР ОПЕРАЦИЙ, в которых объекту разрешено фигурировать; в-третьих, набор допустимых для него ролей в этих операциях (второй операнд, результат и т. п.).
Имеется четыре категории типов: СКАЛЯРНЫЕ (в том числе ПЕРЕЧИСЛЯЕМЫЕ и ЧИСЛОВЫЕ), СОСТАВНЫЕ (в том числе РЕГУЛЯРНЫЕ (массивы) и КОМБИНИРОВАННЫЕ (записи, структуры)), ССЫЛОЧНЫЕ (указатели) и ПРИВАТНЫЕ (закрытые, защищенные - их представление для пользователя невидимо).
Скалярные типы. Когда определяют перечисляемый тип, явно указывают перечень лексем, которые и составляют область возможных значений объектов вводимого типа. Такой перечень может быть списком дней недели (пн, вт, ср, чт, пт, сб, вс), списком символов некоторого алфавита ('A','B',...,'Z') и т. п. Перечисляемые типы избавляют программиста от необходимости кодировать содержательные объекты целыми числами. Перечисляемые типы BOOLEAN (логический) и CHARACTER (символьный) считаются ПРЕДОПРЕДЕЛЕННЫМИ, т. е. встроенными в язык и действующими без предварительного явного объявления в программе. Набор символов типа CHARACTER соответствует алфавиту ASCII - Американскому стандартному коду для обмена информацией.
Числовые типы обеспечивают точные и приближенные вычисления. В точных вычислениях пользуются ЦЕЛЫМИ типами. Область возможных значений для таких типов - конечный диапазон целых чисел. В приближенных вычислениях пользуются либо АБСОЛЮТНЫМИ типами (задается абсолютная допустимая погрешность), либо ОТНОСИТЕЛЬНЫМИ типами (задается относительная погрешность). Абсолютная погрешность задается явно и называется ДЕЛЬТОЙ, относительная погрешность вычисляется по заданному допустимому количеству значащих цифр в представлении числа. Подразумевается, что абсолютные типы будут представлены машинной арифметикой с фиксированной точкой, а относительные - с плавающей. Числовые типы INTEGER (целый), FLOAT (плавающий) и DURATION (временные задержки для управления задачами) считаются предопределенными.
Составные типы. Скалярные типы (и перечисляемые, и числовые) выделяются тем, что объекты этих типов считаются атомарными (не имеющими составляющих). Составные типы в отличие от скалярных позволяют определять структурированные объекты (массивы и записи). Массивы служат значениями регулярных типов - компоненты массивов доступны по индексам. "Регулярность" массивов проявляется в том, что все компоненты должны быть одного типа. Записи (структуры) служат значениями комбинированных типов - их компоненты могут быть различных типов; компоненты записей доступны по именам-селекторам. Имена компонент одной и той же записи должны быть различны; компоненты называются также ПОЛЯМИ записи.
Строение записей одного типа может зависеть от значений выделенных полей, называемых ДИСКРИМИНАНТАМИ. Дискриминанты играют роль параметров комбинированного типа - задавая набор дискриминантов, выбирают определенный вариант структуры объектов этого типа. Поэтому типы с дискриминантами называют также ВАРИАНТНЫМИ типами.
Ссылочные типы. Если структура объектов составных типов (в случае вариантных типов - все варианты такой структуры) фиксируется статически (т. е. до начала выполнения программы), то ссылочные типы позволяют создавать и связывать объекты динамически (при исполнении программы, точнее, при исполнении ГЕНЕРАТОРОВ). Тем самым появляется возможность динамически создавать сколь угодно сложные конгломераты объектов. Генератор создает объект указанного (статически известного) типа и обеспечивает доступ к вновь созданному объекту через переменную соответствующего ссылочного типа. Передавая (присваивая) ссылки, можно организовывать произвольные структуры. Важно, что и элементы, и связи в таких динамических структурах можно менять при исполнении программы.
Приватные типы. Доступ к ПРИВАТНЫМ объектам (их называют также абстрактными объектами, а соответствующие типы - абстрактными типами данных (АТД)) находится под полным контролем автора приватного типа. Такой тип всегда определяется в пакете, который называется ОПРЕДЕЛЯЮЩИМ пакетом для этого типа.
Спецификация определяющего пакета фиксирует полный набор операций и тех ролей в этих операциях, в которых могут фигурировать объекты нового типа. В определяющем пакете фиксируется и реализация приватного типа, однако в использующих этот пакет модулях она непосредственно недоступна - только через явно перечисленные автором пакета допустимые операции. Поэтому реализацию можно изменять, не заставляя переделывать использующие модули.
Концепция типа в Аде дополнена аппаратом ПОДТИПОВ (они ограничивают область значений, не затрагивая допустимых операций), а также аппаратом ПРОИЗВОДНЫХ типов (они образуются из уже известных типов, наследуя связанные с ними значения и операции).
Поговорим об остальных средствах языка. Посредством УКАЗАТЕЛЯ ПРЕДСТАВЛЕНИЯ можно уточнить требования к реализации определенных типов на целевой машине. Например, можно указать, что объекты такого-то типа следует представить заданным количеством битов, что такие-то поля записи должны располагаться с такого-то адреса. Можно указать и другие детали реализации, вплоть до прямой вставки машинных команд. Ясно, что, с одной стороны, подробное описание представления мешает переносу программы в другую операционную обстановку. С другой стороны, оно может оказаться исключительно важным для качества и даже работоспособности программы. Явное указание представления помогает отделять машинно-независимые части модулей от машинно-зависимых. В идеале только указатели представления и потребуется менять при переносе программы.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |


