Пакет - основной конструкт для определения именованного кон­текста (иногда говорят "логически связанной" совокупности объек­тов). Несколько расплывчатое "логически связанной" подразумевает возможность объединить в пакет все то, что автор пожелает видеть единым модулем, названным подходящим именем. Это может быть сделано потому, что все связанные в пакет объекты, во-первых, предполагается использовать совместно; во-вторых, необходимо или удобно совместно реализовывать; в-третьих, невозможно или неу­добно раздельно определять из-за ограничений на ВИДИМОСТЬ имен. Возможны и иные причины объединения в один пакет опреде­лений отдельных имен. Часть из них может быть при этом скрыта, ЗАЩИЩЕНА от непосредственного использования другими модуля­ми; доступ к таким именам строго регламентирован - только через имена, в спецификации пакета явно предназначенные для внешнего использования.

Задача - основной конструкт для определения асинхронного про­цесса, способного выполняться параллельно с другими процессами. Процессом называется определенным образом идентифицируемая последовательность действий исполнителя, линейно-упорядоченная во времени. В одном модуле-задаче можно определить один асинх­ронный процесс или совокупность аналогичных асинхронных процес­сов (так называемый ЗАДАЧНЫЙ ТИП). Асинхронность можно обеспечи­вать как отдельными процессорами для каждого процесса, так и "прерывистым" выполнением различных процессов на одном процессоре.

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