Языки программирования. Практический сравнительный анализ


Языки программирования. Практический сравнительный анализ - стр. 201


      type таблица is array (буква range <>) of INTEGER ;

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

Упражнение. Напишите соответствующую программу перекодировки.

Вернемся к типу вектор_любой_длины. Как объявлять конкретные объекты такого типа? Ведь объявление вида

Y : вектор_любой_длины ;

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

Поэтому само по себе такое объявление не позволяет ни обеспечить эффективность (нельзя распределить память при трансляции), ни настроить функцию на конкретный аргумент такого типа. И, конечно, раз длина вектора не объявлена, то нет оснований контролировать ее (например, в процессе присваивания). [Нарушен ли здесь принцип реальности абстракций?]

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

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

Упражнение. Докажите эту (неформальную) теорему.

 

4.11.5. Подтипы

Чтобы разрешить указанное противоречие, авторы Ады были вынуждены ввести концепцию ПОДТИПА (специально для квазистатического прогнозирования-контроля изменчивости объектов).

Подтип представляет собой сочетание ТИПА и ОГРАНИЧЕНИЯ на допустимые значения этого типа. Значения, принадлежащие типу, должны, во-первых, принадлежать классу значений ограничиваемого типа и, во-вторых, удовлетворять соответствующему ОГРАНИЧЕНИЮ.

Подтип можно указывать при объявлении объектов. Например,

       A : вектор_любой_длины (1..10) ;

объявляет десятиэлементный вектор A (причем использовано так называемое ОГРАНИЧЕНИЕ ИНДЕКСОВ);

       выходной : день_недели range сб..вс ;

объявляет объект типа день_недели, принимающий значение либо "сб", либо "вс" (причем применяется так называемое ОГРАНИЧЕНИЕ ДИАПАЗОНА).




- Начало -  - Назад -  - Вперед -