Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Safonov / AMPN_course_5.pptx
Скачиваний:
100
Добавлен:
16.04.2015
Размер:
127.89 Кб
Скачать

Архитектуры и модели программ и знаний

Лекция 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

Соседние файлы в папке Safonov