Н. Джехани - Язык Ада (1988) (1160771), страница 21
Текст из файла (страница 21)
Альтернативно могут быть заданы след тела или прагма 1[к]ТЕКРАСЕ. В спецификации пакета могут появляться два типа объявлений. Первый тип составляет видимую часть пакета. Объекты, объявленные здесь, доступны с использованием нотации именованных компонент (т. е.
с помощью указания перед объектом имени пакета и точки) или непосредственно с использованием спецификатора использования. Второй тип объявлений следует за ключевым словом рпуаге; он является невидимым вне пакета. Эти объявления содержат детали структуры и реализации личных типов, которые были объявлены в видимой части пакета. Эти детали, которые не имеют отношения к пользователю пакета, предусмотрены в спецификации пакета только для помощи компилятору при реализации видимой части пакета (например, представление личных типов, описанных в видимой части пакета, должно быть задано в личной части так, чтобы компилятор смог определить, какой объем памяти необходим для того, чтобы разместить объекты этого типа). Все, что объявлено в теле пакета, является невидимым вне тела.
Это ограничение на видимость вместе с ограничением, предусмотренным в личной части спецификации пакета, поддерживает скрытие информации, поддерживаемое пакетами. Приведем теперь несколько примеров спецификаций пакетов. Первый пример представляет собой пакет Р1 ОП!]ч]О РАТА, который состоит только из набора обычных переменных и не имеет соответствующего тела пакета [РОР83]. рас]гайе Р] ОТТ![ч]О РАТА ]к РЕ]ч[ (]Р: ВОО(.ЕА[ч[; СО[ч[ЧЕКЯ]0]х[ РАСТОК, Х ОРР8ЕТ, У ОРРЯЕТ, Х М]]к[, Х МАХ, У М1]ч[, У МАХ: НОАТ; Х ЧАШЕ: аггау (1..500) оу НОАТ; У ЧАШЕ: аггау (1..500) о1' Н.ОАТ; епй Р[.ОП!]к[О РАТА; Эти объявления могут быть использованы в более чем одной подпрограмме".
Второй пример представляет пакет ОКРЕКЕР ЯЕТ, который реализует множество, чьи элементы упорядочиваются в соответствии со связанной с ними величиной времени. Элементы имеют дискретный тип ]Р, а значения времени— предопределенный тип Р(ЗКАТ10]ч[. Элементы идентифицируют работы, а значение времени представляет время выполнения работы в секундах. Тип 1Р определен как гуре 1Р Ь ганйе 1..100; и это описание непосредственно видимо в контексте, в котором описан пакет ОКРЕКЕР ЯЕТ. Спецификация пакета ОКРЕКЕР ЯЕТ следующая: " Использование этих описаний данных параллельными процессами, так называемыми задачами, будет создавать проблему параллельного обновления [Вк!73], если этому не уделено предельное внимание.
4-797 Глава 3 98 раскайе ОК))ЕЛО ЯЕТ 1в ргосепвге 1ХБЕКТ(ЮВ: !п 1Р; Т: 1п 1НЗКАТ1ОХ); — добавить работу ЮВ к множеству; — ЮВ представляет собой работу, которая — требует Т секунд времени выполнения ргосейвге БМАЬЬЕБТ(ЗОВ: овг 1Р); — запомнить в 1ОВ ту работу, которая — представляет собой работу из упорядоченного — множества с наименьшим — временем выполнения; эта работа — удаляется из набора; процедура — ЯМАЬЬЕЯТ будет вызвана в случае, — если множество не пусто. — ЯМАЬЬЕБТ не реализована в виде — функции, так как она имеет — побочный эффект — уничтожение — элементов. Функции не должны — иметь никаких побочных — эффектов. — Функция должна всегда возвращать — одинаковое значение, -- если она вызывается с одинаковыми — действительными — параметрами.
— Эти соглашения соответствуют — математическому смыслу — функции. 1впс11оп ЕМРТг' геГпгп ВООЬЕАХ; епй ОК1ЭЕКЕВ БЕТ; Описания, заданные в спецификации пакета, видимы вне пакета в данной точке программы, только если имя пакета является видимым в этом месте. Идентификаторы в видимой части спецификации пакета могут указываться с использованием нотации именованных компонент — перед именем элемента ставятся имя пакета и точка.
Например, ОКзэЕКЕ1э БЕТ.ЕМРТ г' Элементы можно сделать непосредственно видимыми посредством спецификатора использования. Если встретился сдецификатор взе: пзе ОКОЕКЕ1Э ЯЕТ; то функцию ЕМРТг' можно вызвать непосредственно как ЕМРТ г' прн условии, что никакой другой логической функции без параметров с этим же именем не существует; в этом случае ЕМРТ'г' — это обращение к описанной в пакете функции. Аналогично если два одинаковых идентификатора сделать видимыми с помощью фразы использования, то в результате можно получить двусмысленность. Для того чтобы избежать двусмысленности, эти идентификаторы должны быть квалифицированы.
Паквты 3.3. Тела пакетов (7.3] Тело пакета имеет форму расйайе Ьойу идентификатор В описания (Ьея)п последовательность операторов (ехсерйоп обработка исключенийЦ епй идентификатор; Тело пакета представляет собой реализацию пакета. Оно содержит локальные описания и тела подпрограмм, пакетов и задач, спецификации которых были заданы в спецификации пакета. Все элементы, описанные в спецификации пакета, являются видимыми в соответствующем теле пакета. Однако реализация этих элементов, заданная в теле пакета, является невидимой вне его. Элементы, описанные локально в теле пакета, аналогично невидимы вне тела пакета. Тело пакета может также содержать последовательность операторов, которые выполняются в момент выполнения тела пакета. Эти операторы могут использоваться для инициализации объектов, описанных в спецификации и теле пакета. Исключительные ситуации, возбуждаемые во время выполнения операторов„обрабатываются с помощью обработчика исключительных ситуаций, заданного в теле пакета.
Если обработчик исключительных ситуаций не предусмотрен в теле пакета, тогда при возникновении исключительной ситуации она распространяется на ту часть программы, которая содержит тело пакета (это будет обсуждено в гп. 5). В качестве примера опишем тело пакета ОКРЕКЕР БЕТ, который реализует определенное ранее упорядоченное множество. Он использует массив 1Х БЕТ с компонентами типа ВООЬЕАХ для указания работ, которые присутствуют во множестве, а также массив КАИК, содержащий их времена выполнения. Значение 1Х БЕТ(1) есть ТЮЗЕ, если работа 1 представлена во множестве, и РАЬБЕ в противном случае.
Значение КАХК(1) содержит время выполнения, связанное с работой 1 (когда она присутствует во множестве). Множество пусто, когда значения всех элементов массива 1Х БЕТ есть РАЬЯЕ. Когда множество не пусто, определяется работа БМАЬЬ с наименьшим временем выполнения, и она удаляется из множества по следующему алгоритму: Т:= максимально возможное время выполнения; !ог всех работ 1 во множестве !пор Сделать ЯМАЬЬ работой 1, если ее время выполнения КАХК(1) < Т; в этом случае сделать Т равной КАХК(1).
епп 1оор Удалить БМАЬЬ из множества Элементы, представленные во множестве, не могут быть непосредственно созданы, как показано в приведенном заголовке цикла. Все элементы, которые могут быть во множестве, должны быть созданы, а те, которые реально не представлены во множестве, должны быть отсеяны с помошью явной проверки в те- Глава 3 ле цикла. Следовательно, алгоритм для нахождения наименьшей работы усовершенствуется следующим образом: 1ог всех работ 1, которые могут быть во множестве !оор Сделать ЯМАЬЬ работой 1, если она есть во множестве и если ее время выполнения КАХК(1) < Т; в этом случае Т сделать равным КАХК(1). епг! !оор Пакет ОК)зЕКЕП ЯЕТ реализуется в виде — тип 1О доступен в данном окружении рас)саке Ьог!у ОКВЕКЕО ЯЕТ !и 1Х БЕТ: аггау (11)) о1 ВООЬЕАХ:= (Ю = ) РАЬЯЕ); — сначала множество пусто КАХК: аггау (11)) о1 1И)КАТ1ОХ; ргосег!пге !СЕКТ(ЮВ: !п 1О; Т: !п 1Н)КАТ1ОХ) !з — если элемент представлен во множестве, то — его добавление к множеству — не будет иметь эффекта, как и — в случае множества в математике Ьей!п 1Х БЕТ(ЮВ): = ТК(ЗЕ; КАХК()ОВ): = Т; епд 1ХЯЕКТ; ргоееонге БМАЬЬЕЯТ()ОВ: оп! !О) !з — БМАЬЬЕБТ должна быть вызвана, — если множество не пусто Т: 1Н)КАТ1ОХ:= 1НЗКАТ1ОХ'ЬАЯТ; ЯМАЬЬ: 1О; Ьеа!п 1ог 1 !п 11Э 1оор — поиск работы с наименьшим рангом !1 1Х БЕТ(1) апд гйеп КАХК(1) <= Т ()геп БМАЬЬ:= 1; Т:= КАХК(1); епг! !1.„ епд !оор; 1Х ЯЕТ(ЯМАЬЬ): = РАЬВЕ; — удаление работы — из множества ЮВ:= ЯМАЬЬ„ епо БМАЬЬЕВТ; 1ппсбоп ЕМРТУ гегпгп ВООЬЕАХ !в Ьеа!п уог 1 )п 1Р !оор !1 1Х БЕТ(1) !!геп ге!пгп РАЬЯЕ; епд № епй !оор; ге!игл ТКЫЕ; епд ЕМРТг'; епд ОК(ЗЕКЕ1) ЯЕТ; Пакеты В качестве задания для читателя предлагается изменить тело пакета, используя упорядоченные списки для хранения элементов множества".
3.4. Личные типы !7.41 Детали реализации типов, объявленных в спецификации пакета, могут быть скрыты от пользователя пакета при помощи описаний типов, являющихся личными. Тип описывается как личный путем указания либо атрибута рпча!е (личный), либо атрибута 1!т!!ег! рича!е (лимитируемый личный).
Лимитируемый личный тип также называется лимитируемым типом. Личный тип описывается с использованием описания личного тина, задаваемого в вщгимой части спецификации пакета, например !уре ЯЕТ 1я рпча!е; !уре Ок!) ВЕТ !я Ипн!ей рг!ча!е; !уре (Н)Е!)Е !я 1!т!!ей рпча!е; Полное описание типа задается позднее в личной части спецификации пакета вместо тела пакета. Полное описание типа задается в самой спецификации пакета для гарантии того, что спецификация содержит достаточно информации для компиляции единиц, использующих пакет. Объекты личных типов могут быть описаны, переданы как параметры, проверены на равенство и неравенство и им могут быть присвоены значения других объектов такого же типа.
Объекты лимитируемого личного типа, однако, могут быть только описаны и переданы как параметры. Описание личного типа и соответствующее полное описание типа часто представляют собой две различные точки зрения на личный тип, одна из которых — взгляд извне, а другая — изнутри пакета. Вие пакета, в котором определен личный тип, объекты этого личного типа можно использовать только ограниченным образом; с другой стороны, внутри этого пакета объекты личного типа подобны объектам любых обычных (т.
е. не личных) типов. Константы личного типа могут быть описаны в видимой части пакета, но их значения должны быть заданы только в личной части с использованием пол- " Когда максимальная мощность множества станет намного больше, чем его мощность лля любого заданного времени, тогда более эффективным будет использование списочного представления лля множества, чем представление в виде массива с элементами типа ВООьЕАН. Память, используемая при списочном представлении множества, пропорциональна числу элементов в множестве н она отводится и освобождается во время добавления и удаления элемента из множества. При представлении в виде логического массива память для всех возможных элементов должна быть отведена независимо от того, представлен ли элемент во множестве или иет. Операции над множеством, такие как добавление, уничтожение и проверка на принадлежность к элементам множества, происходят быстрее, когда используется представление в виде массива с элементами типа ВООЬЕАН, причем их скорость не зависит от мощности множества.