
- •Архитектуры и модели программ и знаний
- •Роль рассматриваемых парадигм программирования
- •Абстрактные типы данных (АТД) – Метод надежной и безопасной обработки структур данных
- •АТД и их спецификация
- •Преимущества АТД
- •Проблемы АТД и методы их
- •Языки, поддерживающие АТД
- •Абстрактные типы данных. Язык CLU
- •Пример на языке CLU (1/3) – список
- •Пример на языке CLU (2/3) – список
- •Пример на языке CLU (3/3) – использование списка
- •Параметризованные типы (generics)
- •Вопросы и домашнее задание к лекции 5

Архитектуры и модели программ и знаний
Лекция 5
Абстрактные типы данных и их роль в современном программировании
Сафонов Владимир Олегович
Профессор кафедры информатики Заведующий лабораторией Java-технологии
(http://polyhimnie.math.spbu.ru/jtl)
Санкт-Петербургский государственный университет
Email: vosafonov@gmail.com
WWW: http://www.vladimirsafonov.org

Роль рассматриваемых парадигм программирования
Структурное программирование –
надежное и безопасное проектирование и реализация управляющих частей (операторов) программы
Пошаговая детализация – надежный и
безопасный метод пошагового проектирования и реализации программ сверху вниз и их быстрого прототипирования
Модульное программирование –
надежная и безопасная декомпозиция программы на относительно независимые части - модулиТакже весьма важной является проблема
создания надежных и безопасных методов обработки сложных(C) Сафонов В.Оструктур. 2012 данных

Абстрактные типы данных (АТД) – Метод надежной и безопасной обработки структур данных
Основатели (1970-е гг.):
- Ч. Хоар (Oxford University; Microsoft Research)
- Б. Лисков (MIT) – лауреат Тьюринговской премии (2009) - Д. Парнас (University of North Carolina at Chapel Hill
(U.S.), Technische Hochschule Darmstadt (Germany), University of Victoria (British Columbia, Canada), Queen's University (Ontario, Canada), University of Limerick, Ireland).
Основные принципы
- Тип = конкретное представление + набор абстрактных операций
- Доступ к конкретному представлению извне АТД не допускается
- Обработка значений (объектов) абстрактного типа T возможна только через его абстрактные операции P1, … Pn, т.е. тип T - инкапсулированный
АТД может рассматриваться как один из видов модульности
(модуль информационной связности; имя и сигнатуры операций – интерфейс; конкретное представление и реализации операций – реализацияПодобный подход применялся и до изобретения АТД, но
только к примитивным предопределенным типам:
VAR i: INTEGER; BEGIN … i := i+1; … END
(C) Сафонов В.О. 2012

АТД и их спецификация
“Типы – это не множества” (Ф. Моррис)Инкапсуляция – скрытие конкретного представления
данных внутри АТДНеобходима формализованная спецификация
семантики АТД
Метод Р. Флойда – Ч. Хоара: P { S } Q
Денотационная семантика АТД (Д. скотт, Дж.
Донахью): программа – преобразователь предикатов
вида P(X1, … Xu),
где Xi – набор переменных
Алгебраическая спецификация АТД (группа ADJ под
руководством Дж. Гогена, автора языка спецификаций OBJ):
тип – многосортная алгебра; S1, … Sk – сорта
(носитель); P1, …, Pm – операции (сигнатура);
семантика – набор тождеств вида: T1 = T2 где T1 и T2 -
термы
(C) Сафонов В.О. 2012

Преимущества АТД
МодульностьНадежностьОбработка ошибок
Возможность параметризации
АТД(generics)
Удобство определения коллекций –
агрегатов элементов одного типа (стеков, списков, деревьев и др.) и операций над ними в форме АТДВозможность формальной
спецификации и верификации АТДПовторная используемость(C) Саф нов В.О. 2012

Проблемы АТД и методы их
решения
“АТД неэффективны” (каждая
абстрактная операция – подпрограмма) -> использование макросов и inline-процедур; оптимизация программ (задача компилятора, а не пользователя)
“АТД слишком сложны”: многим кажется
“проще” кодирование “с нуля” последовательности сложных операций доступа, например:
P^.X [index]^.Y := something
-> такой подход к кодированию ведет к ошибкам и ненадежным программам. АТД
– удобный метод абстрагирования от лишних деталей:
SetMyProperty(P, something);
(C) Сафонов В.О. 2012

Языки, поддерживающие АТД
FORTRAN и PASCAL - примитивные типы
рассматриваются как АТД: инфиксная форма
операций - X+Y; функциональная - SIN(X)
CLU (B. Liskov) – первый язык, основанный на
концепции АТД. Сыграл выдающуюся роль во всем
последующем развитии языков программирования,
вплоть до Java и C#. Разработан в MIT (1974)
ALPHARD (M. Shaw, Carnegie-Mellon University) –
конкурирующий проект для CLU; основан на
сходных идеях, но в язык добавлены средства
формальной спецификации и верификации по Хоару. Современный аналог: Spec# (расширение C# средствами спецификации, Microsoft Research)
Ada (пакет, задача); Modula-3 (интерфейс); Java,
C# … -
все эти языки фактически содержат элементы
АТД, хотя в явном виде подобная терминология в них и не используется
В любом объектно-ориентированном языке любой
класс, поля которого специфицированы как private (скрытые), а среди методов есть методы,
специфицированные(C) СафоновкакВ.О.public,2012 следует концепции

Абстрактные типы данных. Язык CLU
Автор: проф. Барбара Лисков (Massachusetts Institute of |
||
Technology) |
|
|
Особенности и возможности CLU : |
|
|
- Тип = конкретное представление (rep) + набор абстрактных |
||
операций |
|
|
- |
Непосредственный доступ к конкретному представлению не |
|
допускается |
|
|
- Обработка объектов заданного типа T возможна только через |
||
его |
абстрактные операции P1, … Pn,: |
T$P(x1, …, xn) |
- Виды модулей в CLU: процедура, кластер и итератор |
||
- В современной терминологии, CLU – объектно-базированный |
||
(object-based language) – в нем нет наследования |
||
- Каждая сущность является объектом : int$add(i, k) – сложение |
||
целых чисел; |
(всего – порядка 20 соглашений |
|
|
“синтаксический сахар”: i+k |
|
такого вида, применимых и ко всем |
доопределениям операций для |
|
новых определяемых пользователям кластеров, например, Matrix |
||
- Параметризованные модули (generics): параметры-типы и |
||
параметры-константы (даже в Java или C# параметров-констант |
||
пока нет) |
|
|
- |
Сигнал – предшественник концепции исключения |
|
- |
Итератор – специальная разновидность модуля для |
поэлементного перебора (генерации) некоторой коллекции - Все указанные концепции (в объектно-ориентированной форме) нашли отражение в современных языках программирования
(C) Сафонов В.О. 2012

Пример на языке CLU (1/3) – список
list = cluster [t: type] is create, cons, car, cdr, elems;
rep = array [t];
create = proc () returns (cvt) return(rep$new()); end create;
cons = proc (x: t, l: cvt) returns (cvt) return (rep$addl(l, x))
end cons;
car = proc (l: cvt) returns (t) signals (empty) if l = nil
then signal empty
else return (rep$bottom(l)); end car;
(C) Сафонов В.О. 2012

Пример на языке CLU (2/3) – список
cdr = proc (l: cvt) returns (cvt) signals (empty) if l = nil
then signal empty
else return (rep$tail(l)); end cdr;
elems = iter (l: cvr) yields(t) for elt: t in rep$elements(t) do
yield(elt); end
end elems;
end list
(C) Сафонов В.О. 2012