Главная » Просмотр файлов » В.Ш. Кауфман - Языки программирования - концепции и принципы (1990)

В.Ш. Кауфман - Языки программирования - концепции и принципы (1990) (1160787), страница 23

Файл №1160787 В.Ш. Кауфман - Языки программирования - концепции и принципы (1990) (В.Ш. Кауфман - Языки программирования - концепции и принципы (1990)) 23 страницаВ.Ш. Кауфман - Языки программирования - концепции и принципы (1990) (1160787) страница 232019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 23)

играл сам тип в ранних ЯП - ведь подтип затрагивает только совокупность

значений объектов, не касаясь применимых к ним операций. Кроме присваивания,

как было показано совсем недавно.]

4.6.7. Объявление подтипа

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

объявлять именованные подтипы. Естественно делать это тогда, когда одни и те

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

Вот несколько примеров именованных подтипов.

subtype рабочий_день is день_недели range пн..пт ;

subtype натуральный is INTEGER range 0..INTEGER'последний ;

subtype положительный is INTEGER range 1..INTEGER'последний ;

subtype буква is CHARACTER range `A'..`Z' ;

subtype цифра is CHARACTER range `0'..`9' ;

В качестве простого упражнения объявите подтип весенний_месяц,

выходной_день, восьмеричная_цифра и т.п.

По внешнему виду объявление подтипа похоже на объявление производного

типа. Однако это конструкты совершенно разного назначения. Разберемся с этим

подробнее.

4.6.8. Подтипы и производные типы. Преобразования типа

Формально отличие производных типов от подтипов должно быть уже

известно. Производный тип - это именно новый тип, характеризуемый классом

значений и набором базовых операций.

По сравнению с родительским типом класс значений производного типа

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

набор базовых операций - расширен (за счет объявлений базовых операций в

определяющем производный тип пакете).

А для подтипа по сравнению с базовым типом набор базовых операций может

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

Кроме того, производный тип в общем случае несовместим по присваиванию

и передаче параметров как с родительским типом, так и с другими производными

типами одного родительского типа. Например:

type год is new INTEGER range 0..2099 ;

type этаж is new INTEGER range 1..100 ;

A: год ;

B: этаж ;

...

A := B ; -- недопустимо! Несовместимость типов, хотя

-- значения заведомо попадут в нужный диапазон.

Имя подтипа служит сокращением для сочетания ограничиваемого типа

(назовем его БАЗОВЫМ ТИПОМ) и ограничения. Когда такое имя используется при

объявлении объекта, считается, что объявлен соответственно ограниченный

объект базового типа. Когда такое имя применяется в спецификации параметра

процедуры или функции, то аргументом может быть любой объект базового типа,

удовлетворяющий соответствующему ограничению. Объектам различных подтипов

одного и того же базового типа можно присвоить любое значение базового типа,

лишь бы оно было из подкласса, выделяемого подтипом левой части.

Содержательные роли, которые призваны играть в программе объекты

различных подтипов одного базового типа (при квалифицированном использовании

ЯП) должны быть аналогичными, взаимозаменяемыми (с точностью до ограничений

на значения).

Другое дело - содержательные роли производных типов одного и того же

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

было контролировать, применяются ли они точно по назначению. Поэтому объекты

различных производных типов в общем случае не считаются взаимозаменяемыми, и

по присваиванию (а также сравнениям) несовместимы (компилятор обязан это

контролировать). Содержательная роль различных типов, производных от одного

и того же родительского типа выражается в том, что им соответствуют

совершенно различные наборы операций.

Вместе с тем при необходимости между такими (родственными) типами

допустимы явные преобразования типа.

Лес типов. Назовем лесом типов ориентированный граф, вершинами которого

служат типы, а дуги соединяют родительский тип с производным (рис.4.2).

INTEGER месяц

/ \ / \

год этаж летний_месяц весенний_месяц

|

нижний_этаж

Рис. 4.2

где

type нижний_этаж is new этаж range 1..3 ;

type летний_месяц is new месяц range июнь..август ;

type весенний_месяц is new месяц range март..май ;

Как видите, лес типов в программе может состоять из отдельных деревьев.

Родственные типы и преобразования между ними. Типы из одного дерева в

лесу типов называются РОДСТВЕННЫМИ. В Аде допустимы явные преобразования

между родственными типами, которые указываются с помощью имени так

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

данное. Каждое определение производного типа автоматически (по умолчанию)

вводит и операции преобразования родственных типов (но применять эти

операции нужно явно!). Например, можно написать

A := год(B);

а также

B := этаж(A);

Обе эти операции (и "год", и "этаж") введены по умолчанию указанными

выше объявлениями производных типов, но применены явно, когда потребовалось

присвоить объект одного родственного типа другому. Во втором присваивании

потребуется проверить попадание в диапазон допустимых значений.

Преобразования родственных типов (с учетом различных содержательных

ролей объектов разных типов) далеко не всегда оправданы. Именно поэтому и

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

сознательно. Так надежность согласуется с гибкостью. По существу в таких

случаях программист явно говорит, что полученное значение должно в

дальнейшем играть другую содержательную роль.

Например, в задаче моделирования учреждения может появиться тип

"сотрудник", характеризуемый целой анкетой атрибутов и набором базовых

операций ("загружен_ли", "выполнить_задание", "включить_в_группу" и т.п.).

Есть и

type рук_группы is new сотрудник ;

со своими базовыми операциями ("дать_задание", "подготовить_план_работы",

"где_сотрудник" и т.п.).

Пусть объявлены объекты

A: сотрудник ;

B: рук_группы ;

Тогда присваивание

B := рук_группы(A) ;

содержательно может означать "повышение" сотрудника A. Ясно, что

"автоматически" такое преобразование не делается!

4.6.9. Ссылочные типы (динамические объекты)

До сих пор в наших примерах встречались лишь статические и

квазистатические объекты. Время существования статических объектов совпадает

с полным временем выполнения всей программы. Время существования

квазистатических объектов согласуется с временем очередного исполнения их

статически определимой области действия.

[Область действия объекта - это часть текста программы, при выполнении

которой объект считается доступным (например, для чтения или записи его

значения, для передачи объекта в качестве параметра и т.п.).]

Например, в Паскале область действия (локальной) переменной - процедура

или функция, где эта переменная объявлена. В Аде (квази)статические объекты

создаются при исполнении объявлений и исчезают в момент завершения

исполнения соответствующей области действия.

Так как квазистатические объекты создаются и исчезают синхронно с

исполнением фиксированных компонент текста программы (областей действия этих

объектов), то в каждой из них легко явно назвать все квазистатические

объекты индивидуальными именами, фигурирующими непосредственно в тексте

программы (т.е. также квазистатическими). Это еще один признак

квазистатического объекта - такие и только такие объекты могут иметь

квазистатические имена.

Но имена содержательных обрабатываемых объектов далеко не всегда удобно

фиксировать в тексте программы. Ведь эти объекты могут находиться во внешней

для программы среде или возникать динамически как во внешней среде, так и в

самой программе при обработке других объектов. Такие динамически возникающие

объекты называют динамическими объектами. Иногда динамическими объектами

называют и (квази)статические объекты с динамически изменяющимися размерами

или структурой.

Обычный прием, обеспечивающий доступ к динамическим объектам, состоит в

том, что ссылки на такие объекты служат значениями квазистатических

объектов, явно фигурирующих в программе. Когда ЯП не предоставляет

адекватных выразительных средств, динамические объекты приходится

моделировать с помощью квазистатических объектов или их частей. Например, на

Фортране динамические очереди, списки, таблицы, стеки приходится

моделировать (квази)статическими массивами.

Таким образом, возникает технологическая потребность в категории так

называемых ССЫЛОЧНЫХ ТИПОВ, т.е. типов данных, класс значений которых -

ссылки на динамические объекты.

Динамические объекты отличаются от статических или квазистатических,

во-первых, тем, что создаются при выполнении так называемых ГЕНЕРАТОРОВ, а

не при обработке объявлений; во-вторых, тем, что доступ к ним осуществляется

через объекты ссылочных типов.

Поэтому и время существования динамических объектов в общем случае

связано не с местом их первого упоминания в программе, а с временем

существования ссылки. Ссылку можно передавать от одного ссылочного объекта

другому, сохраняя динамический объект даже при исчезновении ранее

ссылавшихся на него квазистатических объектов.

Чтобы сохранить возможность квазистатического прогнозирования-контроля

поведения динамических объектов, необходимо классифицировать ссылочные

объекты в соответствии с типом динамических объектов, на которые им

разрешено ссылаться. Однако концепция типа не обязана различать динамические

и квазистатические объекты, так как с точки зрения класса значений и

применимых операций динамический объект не отличается от квазистатического

(кроме операции создания и, возможно, уничтожения).

Так и сделано в Аде (как и в Паскале), где объекты одного и того же

типа могут быть как статическими, так и динамическими в зависимости от того,

объявлены они или созданы генератором. Вместе с тем с каждой ссылкой жестко

связан тип, на объекты которого ей разрешено ссылаться.

4.7. Типы как объекты высшего порядка. Атрибутные функции

Когда тип данных легко обозначать и определять, естественно появляется

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

операнда различных операций без каких-либо априорных ограничений.

4.7.1. Статическая определимость типа

Однако одно ограничение касается всех статических ЯП (в том числе и ЯП

Ада) - его можно назвать статической определимостью типа: тип каждого

объекта должен быть определим по тексту программы. Ведь только при этом

условии тип может играть роль основного средства статического

прогнозирования-контроля.

Из статической определимости следует, что тип объектов, связанных с

какой-либо операцией, определяемой пользователем, не может быть ее

динамическим параметром (а значит, и аргументом), а также не может быть

результатом некоторой нетривиальной операции.

Вопрос. Почему?

Подсказка. Все определяемые пользователем операции работают в период

исполнения программы.

Формально сказанное не исключает операций над типами как значениями,

однако содержательно этими операциями нельзя воспользоваться динамически при

соблюдении принципа статической определимости типа.

4.7.2. Почему высшего порядка?

Статическая определимость типа - необходимое условие статического

контроля типов. Но контролировать типы - значит применять к ним

"контролирующие" операции (при статическом контроле - в период компиляции!).

Так что с точки зрения потребности в контроле тип следует считать объектом

высшего порядка (метаобъектом), который служит для характеристики "обычных"

объектов низшего порядка.

4.7.3. Действия с типами

Что же можно "делать" с таким объектом высшего порядка, как тип данных?

Во-первых, можно (и нужно) получать из одних типов другие, т.е.

преобразовывать типы (не объекты данных, а именно типы). Преобразователями

типов служат конструкторы типов. Так, конструктор производного типа

преобразует родительский тип в новый тип, в общем случае ограничивая класс

значений и сохраняя набор базовых операций. Конструктор регулярного и

Характеристики

Тип файла
Документ
Размер
1,26 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6363
Авторов
на СтудИзбе
310
Средний доход
с одного платного файла
Обучение Подробнее