Н. Джехани - Язык Ада (1988) (1160771), страница 18
Текст из файла (страница 18)
Например, А может предшествовать В в типе Е так, что А < В есть Тзк()Е (для типа Е), в то время как А может следовать за В в типе Р так, что А < В есть ГАЕЧКЕ (для типа Р). Эта двусмысленность может быть разрешена при помощи квалификации А и В с их типами. Если А и В оба будут типа Е, тогда приведенное выше выражение можно недвусмысленно записать как Е'(А) < Е'(В) или даже Е'(А) < В. Капли(рицированное выршкение имеет вид Т'(выражение) ( Т'(агрегат), где Т есть имя типа или подтипа.
Выражение или агрегат должны иметь такой же тип, как и базовый тип Т. 2.7. Еще о типах Этот раздел содержит более подробные сведения о скалярных типах (в частности, целых и вещественных), именуемых н ссылочных типах. Использование ограничений в описании новых целых и вещественных типов иллюстрируется вместе с возможностями параметризации именуемых типов и описания рекурсивных типов. " ПЛ/! и Алгол-68 прилержнввютея противоположной точки зрения.
В Плу! любой тип можно неявно преобразовать в другой. 84 Гпннн г 2.7.1. Скалярные типы Ограничение диапазона определяет, что будет использоваться только подмножество значений типа. Говорят, что ограничение диапазона совместимо с предыдущим ограничением диапазона, если множество значений, определенных последующим ограничением диапазона, является подмножеством значений, определенных предыдущим ограничением диапазона.
Новое ограничение диапазона должно быть совместимо с его предшествующим ограничением. Говорят, что значение удовлетворяет ограничению диапазона, если оно принадлежит множеству значений, определенных с помощью ограничения диапазона. 2.7.1.1. Логический тип Логический тип является либо предопределенным типом ВООЬЕАХ, либо производным от логического типа. Предопределенные операции сравнения и принадлежности возвращают в качестве результата значение типа ВООЬЕАХ.
2.7.1.2. Целые типы Дополнительные целые типы могут быть описаны как Гуре ХЕ% 1ХТЕОЕК Ь гавйе Ь..К; где ХЕ% 1ХТЕОЕК есть имя описываемого типа, а Ь и К определяют наименьшее и наибольшее значения этого типа. Это описание типа эквивалентно следующему: гуре целый тип Ь пеп предопределенный целый тип; ввЫуре ХЕ% 1ХТЕОЕК Ь целый тип гапйе целый тип (Ь)..целый-тип (К); где предопределенный целый тип задается реализацией языка Ада как один из предопределенных целых типов, который включает значения в диапазоне от Ь до К. Несколько примеров: Гуре КАХК Ь гапйе 1..10; Гуре 1О Ь гапйе 1..1ХТЕОЕК'ЬАБТ; Гуре РК1ОК1ТУ Ь пенг 1ХТЕОЕК гапйе 1..10; ввЫуре ХАТ1)КАЬ Ь 1ХТЕОЕК гапйе 0..1ХТЕОЕК'ЬАБТ; — предопределенный подтип в языке Ада впЫуре РОБ1Т1ЧЕ Ь 1ХТЕОЕК гапйе 1..1ХТЕОЕК'ЬАБТ; — предопределенный подтип в языке Ада нпЫуре Н1ОН-РК1ОК!ТУ 1н РК1ОК1ТУ гапйе Н..10; — границы значений типов и подтипов — могут быть статическими или динамическими — выражениями.
Н должно быть <10 во — время выполнения, в противном — случае возбуждается исключение — СОХБТКА1ХТ ЕККОК гуре Р)ЬЕ 1Р Ь пезг 1Р; — производный подтип Типы Щ Р1ЬЕ 11) и подтип РОБ1Т1ЧЕ имеют одинаковое множество значе- ний, однако они все являются различными. 85 Е о гилях 2.7.2.
Вещественные типы Вещественные типы с любой желаемой точностью (зависяшей от ограничений реализации) могут быть определены при помощи спецификации ограничения точности. 2.7.2.1. Типы с плавающей точкой Ограничение точности для типов с плавающей точкой, называемое ограничением плавающего типа, представляется в виде й)я)ЫЭ 1гапйе 1... К1 где Р есть положительное статическое выражение целого типа, а 1.
и К являются статическими выражениями некоторого действительного типа. 1) представляет собой точность определяемого вещественного типа и показывает минимальное число цифр, которое должно запоминаться для мантиссы. Факультативное ограничение диапазона указывает, что значения будут находиться между Ь и К.
Новый тип с плаваюшей точкой определяется, как Гуре 1чЕ% РЬОАТ Ь в)р!я Р 1гапйе 1...К1; Это описание эквивалентно следующему: $уре плавающий тип !я пеи предопределенный плавающий тип; явЫуре )чЕ% Р ОАТ Ь плавающий тип й1811я Р 1гапяе плавающий тип (Ь)...плаваюший тип 1К)1; где предопределенный плаваюший-тип выбирается среди определенных при реализации языка Ада так, чтобы удовлетворять заданному ограничению плавающего типа. Значение удовлетворяет ограничению плаваюШего типа, если оно удовлетворяет любому ограничению диапазона. Ниже даны примеры типов с плавающей точкой: 1уре %Т КО Ь в)81)я 6; гуре ТЕМРЕКАТ1ЖЕ Ь п1811я 8 гапке 0.00..1000.00; япЫуре АРРКОХ ТЕМРЕКАТ1ЖЕ Ь ТЕМРЕКАТЫКЕ й1811я 6; 1уре %Т ЬВ Ь пезч %Т КО; — массы в двух различных единицах — измерения теперь нельзя — небрежно смешать 1уре МАББ 1я печк КЕА1.
й1811я 7 гапке 0.0..1.0Е10; Для подтипов, производных типов и описаний объектов можно задать либо ограничение плаваюшего типа, либо ограничение диапазона. В описании нового типа с плаваюшей точкой или подтипа с плаваюшей точкой Р ограничение плаваюшего типа должно быть совместимо с любым предшествуюшим ограничением плаваюшего типа на базовый или родительский тип, т. е. число цифр не должно превышать их число, определенное в предшесгвуюшем ограничении. Аналогично если оба типа Р и базовый или родительский типы имеют ограничения диапазона, то новое ограничение диапазона должно быть совместимо со всеми ограничениями, наложенными ранее.
глава г 2.7.2.2. Переносимость программ с объектами с плавающей точкой Различные реализации языка Ада могут поддерживать предопределенные типы с плавающей точкой, такие как РЬОАТ, с различной точностью. Переносимость программ с объектами с плавающей точкой может быть достигнута за счет использования типов с плавающей точкой, описанных с желаемой точностью. Например, пользователь может объявить новый тип с плавающей точкой КЕАЬ как Гуре КЕАЬ 1я й)й1(я 10; и использовать его вместо Н.ОАТ. Когда программа с таким типом переносится из одной реализации языка Ада в другую, она требует от реализации языка Ада поддержки типа КЕАЬ по крайней мере с указанной точностью (10 цифр в данном примере).
Эта стратегия намного лучше, чем используемая в других языках, скажем в языке Фортран. Фортран не позволяет. задавать точность при использовании действительного типа с плавающей точкой обычной точности; точность варьируется в обычных системах между 24 и 48 бит. Следовательно, пользователь должен выбирать между обычной и двойной точностью в соответствии с имеющейся реализацией [1)ОР796[. Например, при переносе программ на Фортране с 60-бит СРС/бб00 на 32-бит 1ВМ/370 пользователь должен заменить переменные с обычной точностью на двойную точность, чтобы получить примерно одинаковую степень точности.
Это может быть крайне неудобным. 2.7.3. Типы с 4иксированной Гпочкой Как отмечалось в гл. 1, ограничение точности для типов с фиксированной точкой, ограничение Фиксированного типа, имеет форму йейа РЕ1. гапке Ь..К; где (эЕЬ является максимальной ошибкой, допустимой в реализации типа с фиксированной точкой, а Ь н К есть выражения, определяющие диапазон значений. При описании подтипов с фиксированной точкой нли производных типов спецификация ограничения диапазона необязательна. Новый тип с фиксированной точкой описывается как гуре ХЕ% НХЕР (я йейа ОЕЬ гапке 1...К; Это описание эквивалентно следующему: гуре вуиксированный тип 1и пеп предопределенный (риксированный тип; ьнЬ(уре ХЕ%' НХЕР 1з (аиксированный тип йе!га РЕЬ гапке Фиксированный тип (Ь).. Фиксированный тип (К); где предопределенный Яиксированный тип выбирается среди определенных при реализации языка Ада так, чтобы удовлетворять заданному ограничению фиксированного типа.
Ниже даны примеры подтипов с фиксированной точкой и производных типов: епЬ(уре ЬО% РКЕС1$1ОХ 1я Н1ОН РКЕС1$10Х йейа 0.1; — тип Н)ОН РКЕС1310Х был определен в гл. 1 67 Е о гинях — как тип с фиксированной точкой с — дельтой 0.00001 1уре ООЫ.АКЯ 1з пезч С1)ККЕХСх'; — С13ККЕХСУ есть тип с плавающей точкой 1уре й1)РЕЕВ 1з пеи С1)йКЕМС1; Ограничение фиксированного типа должно быть совместимо с любым предыдущим ограничением фиксированного типа. Дельта более позднего ограничения должна быть не меньше, чем дельта более раннего ограничения. Если два типа имеют ограничения диапазона, то последующее ограничение должно быть совместимо с предыдущим ограничением.
2.7.4. Именуемые типы Объекты именуемого типа не обязательно должны иметь одинаковые число и типы компонент. Именуемые типы могут быть параметризованы для реализации объектов, которые в основном схожи, но различаются в некоторых деталях, таких как размер и число компонент. 2.7.4.1. Именуемые типы с дискриминантами [3.7.11 Дискриминанты используются для параметризации описаний именуемого типа. Это позволяет значениям именуемого типа иметь альтернативные формы.
Дискриминанты должны быть дискретного типа, и они определяются при описании именуемого типа. Дискриминант является именованной компонентой любого объекта такого именуемого типа. Внутри описания именуемого типа дискриминант может быть использован только: 1) как часть выражения по умолчанию, определяющего начальные значения компонент записи; 2) как дискриминант вариантной части; 3) в определении подтипа компоненты или как граница индекса, или как значение дискриминанта.
В последнем случае дискриминант должен быть использован сам по себе, а не как часть выражения. Дискриминант не должен использоваться внутри описания именуемого типа. Дискриминаитам могут быть заданы начальные значения по умолчанию. Начальные значения по умолчанию могут быть подавлены с помощью явного задания начальных значений во время описания объекта или в момент описания подтипа. Во время описания объекта дискриминанту должно быть задано явное начальное значение, если не было указано начальное значение по умолчанию.
Значение дискриминанта в объекте может быть изменено только в случае присваивания нового значения всему объекту, а не присваиванием значения только дискриминантузз. " Эти ограничения препятствуют изменению значения лискриминанта без соответствуюших изменений значений компонент. В случае записей с вариантами (обсуждаемых в слелуюшем разделе) изменение значения дискриминаита может приводить в результате к изменениям типа н числа компонент записи. Без этого ограничения было бы возможно нарушение принципа строгой типизации.