Сошников Дмитрий Валерьевич к.ф.-м.н., доцент Факультет инноваций и высоких технологий Московский физико-технический институт
2 Лекция 3 Парадигмы программирования
3
©2008 Сошников Д.В. 4 Императивное (алгоритмическое) Машина Тьюринга, Машина фон Неймана Pascal, C и т.д. Аппликативное (функциональное) λ-исчисление, рекурсивные функции F#, LISP / Scheme, ML и друзья, Haskell Декларативное (логическое) Логика предикатов 1-го порядка Prolog, … Объектное, компонентное, многоагентное (эмерджентое) Синергетика, теория сложных систем Ситуационное (продукционное) Нормальные алгоритмы МарковаРефал
©2008 Сошников Д.В. 5 Императивные языки Оперируют состоянием памяти. Выполнение операторов изменяет состояние. Функциональные языки Оперируют данными. Применение функции к аргументам изменяет данные. Подход, ориентированный на данные. Логические языки Оперируют пространством поиска решений.
©2008 Сошников Д.В. 6 программирование переключателей машинные коды язык ассемблера FORTRAN FP LISP С, Pascal С++ Java C# Haskell Prolog Mercury F# OCaml ML Miranda Python ? ?
©2008 Сошников Д.В. 7 C# - императивный (ОО) + элементы функциональности F# - функциональный с элементами императивности Mercury – функционально-логический Oz Python …
8
©2008 Сошников Д.В. 9 СЛОЖНОСТЬ - Сложность окружающего мира влияет на сложность программных систем - Параллелизм – необходимость писать параллельный код резко увеличивает сложность - Сложная система => большее количество ошибок, резко возрастает стоимость качественного кода + Сложность удается частично скрыть с помощью инструментов разработки (пример: языки высокого уровня) + Software Factories, Domain-Specific Languages Актуальность этих проблем быстро растет со временем
©2008 Сошников Д.В. 10 Множество способов комбинирования дает дополнительное преимущество в борьбе со сложностью Можно эксплуатировать как декомпозицию, так и функциональную абстракцию Отсутствие побочных эффектов резко снижает затраты на тестирование и отладку Декларативный стиль перекладывает существенную часть решения на компилятор (пример: суммирование четных эл-тов списка) Функциональный код явно описывает зависимости по данным, позволяя более эффективно распараллеливать код (пример: суммирование четных эл-тов списка)