Парадигма программирования

Материал из Википедии — свободной энциклопедии
Это старая версия этой страницы, сохранённая 178.95.23.163 (обсуждение) в 23:45, 21 августа 2011. Она может серьёзно отличаться от текущей версии.
Перейти к навигации Перейти к поиску
Парадигмы программирования

Паради́гма программи́рования — это совокупность идей и понятий, определяющих стиль написания программ. Парадигма в первую очередь определяется базовой программной единицей и самим принципом достижения модульности программы. В качестве этой единицы выступают определение (декларативное, функциональное программирование), действие (императивное программирование), правило (продукционное программирование), диаграмма переходов (автоматное программирование) и др. сущности. В современной индустрии программирования очень часто парадигма программирования определяется набором инструментов программиста, а именно, языком программирования и используемыми библиотеками.

Парадигма программирования определяет то, в каких терминах программист описывает логику программы. Например, в императивном программировании программа описывается как последовательность действий, а в функциональном программировании представляется в виде выражения и множества определений функций (слово определение (англ. definition) следует понимать в математическом смысле). В популярном объектно-ориентированном программировании (в дальнейшем ООП) программу принято рассматривать как набор взаимодействующих объектов. ООП, в основном[1], есть по сути императивное программирование, дополненное принципом инкапсуляции данных и методов в объект (принцип модульности) и наследованием (принципом повторного использования разработанного функционала).

Важно отметить, что парадигма программирования не определяется однозначно языком программирования — многие современные языки программирования являются мультипарадигменными, то есть допускают использование различных парадигм. Так на языке Си, который не является объектно-ориентированным, можно писать объектно-ориентированным образом, а на Ruby, в основу которого в значительной степени положена объектно-ориентированная парадигма, можно писать согласно стилю функционального программирования.

Приверженность определённого человека какой-то одной парадигме иногда носит настолько сильный характер, что споры о преимуществах и недостатках различных парадигм относятся в околокомпьютерных кругах к разряду так называемых «религиозных» войн — холиваров.

История термина

Своим современным значением в научно-технической области термин «парадигма» обязан, по-видимому, Томасу Куну и его книге «Структура научных революций» (см. парадигма). Кун называл парадигмами устоявшиеся системы научных взглядов, в рамках которых ведутся исследования. Согласно Куну, в процессе развития научной дисциплины может произойти замена одной парадигмы на другую (как, например, геоцентрическая небесная механика Птолемея сменилась гелиоцентрической системой Коперника), при этом старая парадигма ещё продолжает некоторое время существовать и даже развиваться благодаря тому, что многие её сторонники оказываются по тем или иным причинам неспособны перестроиться для работы в другой парадигме.

Термин «парадигма программирования» впервые применил Роберт Флойд в своей лекции[2] лауреата премии Тьюринга.

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

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

Таким образом, по мнению Роберта Флойда, в отличие от парадигм в научном мире, описанных Куном, парадигмы программирования могут сочетаться, обогащая инструментарий программиста.

Различные определения

Далеко не все авторы, использующие термин «парадигма программирования», решаются дать интенсиональное определение данному термину. Однако и те определения, которые удаётся найти, серьёзно отличаются друг от друга.

Диомидис Спинеллис даёт следующее определение[3]:

Слово «парадигма» используется в программировании для определения семейства обозначений (нотаций), разделяющих общий способ (методику) реализаций программ. (В оригинале: The word paradigm is used in computer science to talk about a family of notations that share a common way for describing program implementations)

Для сравнения тот же автор приводит определения из других работ. В статье Дэниела Боброва[4] парадигма определяется как «стиль программирования как описания намерений программиста». Брюс Шрайвер (Bruce Shriver) определяет парадигму программирования как «модель или подход к решению проблемы»[5], Линда Фридман (Linda Friedman) — как «подход к решению проблем программирования».[6]

Памела Зейв (Pamela Zave) даёт определение парадигмы как «способа размышления о компьютерных системах» (в оригинале «way of thinking about computer systems»).[7]

Питер Вегнер (Peter Wegner) предлагает другой подход к определению термина парадигмы программирования. В его работе «Concepts and paradigms of object-oriented programming»[8]парадигмы определяются как «правила классификации языков программирования в соответствии с некоторыми условиями, которые могут быть проверены».

Тимоти Бадд предлагает понимать термин «парадигма» как «способ концептуализации того, что значит „производить вычисления“, и как задачи, подлежащие решению на компьютере, должны быть структурированы и организованы».[9]

Парадигма программирования как исходная концептуальная схема постановки проблем и их решения является инструментом грамматического описания фактов, событий, явлений и процессов, возможно, не существующих одновременно, но интуитивно объединяемых в общее понятие.

Основные модели программирования

Подходы и приёмы

См. также

Примечания

  1. ООП — прежде всего это стиль программирования. Поддержка ООП со стороны языка развита в императивных языках, в следствии их популярности, но это не означает, что нельзя писать ООП программы на языках логической (например, на Прологе), функциональной (например, на Лиспе) и других парадигм.
  2. R. W. Floyd. The Paradigms of Programming Communications of the ACM, 22(8):455—460, 1979. Русский перевод см. в кн.: Лекции лауреатов премии Тьюринга за первые двадцать лет (1966—1985), М.: МИР, 1993.
  3. D. D. Spinellis. Programming paradigms as object classes: a structuring mechanism for multiparadigm programming. PhD thesis, University of London, London SW7 2BZ, United Kingdom, February 1994.
  4. D. G. Bobrow. If Prolog is the answer, what is the question. // Fifth Generation of Computer Systems, pages 138—145, Tokyo, Japan, November 1984. Institute for New Generation Computer Technology (ICOT), North-Holland.
  5. B. D. Shriver. Software paradigms. IEEE Software, 3(1):2, January 1986.
  6. L. W. Friedman. Comparative programming languages: generalizing the programming function. Prentice Hall, 1991, page 188.
  7. P. Zave. A compositional approach to multiparadigm programming. IEEE Software, 6(5): 15—25, September 1989.
  8. P. Wegner. Concepts and paradigms of object-oriented programming. {OOPS} messenger}, 1(1): 7—87, August 1990.
  9. T. A. Budd. Multy-Paradigm Programming in LEDA. Addison-Wesley, Reading, Massachusets, 1995.