Парадигмы программирования Это определенный набор инстурентов абстракции и подходов к их применению
Структурное программирование 3 базовых блока: – последовательное выполнение – условное выражени – цикл GOTO считается вредным Процедурное программирование: модуляризация с помощью процедур и модулей (файлов)
Объектно-ориентированное программирование Принципы: – инкапсуляция – наследование – полиморфизм ОО-дизайн: – композиция, аггрегация – делегация, консультация – cohesion (единство), coupling (связность) – indirection
Наследование Наследование "свойств" и "функциональности". 12 видов! (Bertrand Meyer, Object-Oriented Software Construction) Для свойств основано на: – классе (от абстрактного к конкретному): C++, Java – прототипе (от конкретного к абстрактному): JavaScript, Self, Io
Наследование может пониматься как наследование реализации (семантическое) или как наследование интерфейса (синтаксическое) Сильное поведенческое наследование -- принцип замены Лисковой (IS-STRICTLY-EQUIVALENT-TO-A): пусть q(x) -- это свойство, доказываемое для объекта х типа T. Тогда q(y) должно быть справедливо для всех объектов y любого подтипа S типа T Прицип строгой эквивалентности Favor object composition over class inheritance WAS-A, HAS-A
Полиморфизм Наследование функциональности и полиморфизм это 2 стороны одной медали Родовые функции (Lisp): унифиция обоих концепций в рамках одной абстракции "Субъектно-ориентированное программирование" "Утиная типизация" (Duck typing): "When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck." (James Whitcomb Riley)
Передача сообщений Smalltalk Алан Кей: более важно, чем объекты Полностью динамическая диспетчиризация Модель акторов (Хьюит). Акторы – асинхронно принимают сообщения – отправляют конечное число сообщений другим акторам – создают конечное число новых акторов – Также: хвостовая рекурсия
Функциональное программирование Лямбда-исчисление Черча Принципы: – программирование без побочных эффектов (ссылочная прозрачность) – неизменяемые (немутируемые) данные – функции высших порядков Строгие и динамические ФЯ Ленивые вычисления Системы типов
Скриптоовые языки Опора на существующую платформу Фокус на реализации определенного круга задач Динамические Ad hoc
Метапрограммирование Расширение (growing) базового языка Многоуровневые системы Проектирование сверху-вниз Языко-ориентированное программирование (DSL) Макросистема Гомоиконность языка Мета-круговой интерпретатор Рефлексия
Конкурентное программирование Новая парадигма Варианты: – MapReduce – модель акторов (Erlang, Scala) – STM – Программная транзакционная память (Haskell, Clojure) – CSP (Golang) – Event-based Shared nothing
MapReduce Не язык, а фреймворк для написания распределенных програм.
Erlang Динамический функциональный язык, основанный на синтаксисе Prolog'а. Модель акторов. Примитивы процессов Pid spawn send (!) receive register
Типичные шаблоны Erlang Loop Rpc Timer
Беззамковая синхронихация в Clojure
Корутины и go-рутины Модель Communicating Sequential Processes