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

Эта статья входит в число готовых статей
Эта статья прошла проверку экспертом
Материал из «Знание.Вики»

Парадигмы программирования — это совокупность методов, концепций, принципов, техник и инструментов, которые определяют способ организации программы на языке программирования и ход её выполнения[1].

Ещё парадигмами называют запрет на определённые действия внутри кода программы. Его придумал Роберт Мартин — международный консультант в области разработки, известный среди разработчиков как «дядя Боб». С его точки зрения, парадигмы — это ограничения на определённые языковые конструкции, которые вынуждают использовать определённый стиль. Например, процедурное программирование накладывает запрет на прыжки по коду программы, а функциональное — на прямое изменение памяти компьютера[2].

Понятие

Парадигма программирования является концептуальной моделью, на основе которой организуется структура кода и происходит решение задач в программировании. Каждая парадигма определяет свой набор правил и подходов к написанию программ, поэтому разработчик выбирает парадигму в зависимости от требований задачи и уровня её сложности[3].

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

История возникновения

В числе четырёх основных парадигм перечисляют процедурное программирование, структурное программирование, объектно-ориентированное программирование, функциональное программирование. Первым возникло функциональное программирование (Алонзо Чёрч, 1936 год), затем процедурное программирование (Фон Нейман, 1940-х годы), за ним объектно-ориентированное (Оле-Йохан Даль, Кристен Нюгор, начало 1960-х годов, Алан Кэй, 1967 год), последним — структурное программирование (Эдсгер Дейкстра, 1968 год)[4].

Эволюция парадигм программирования

Знаменитый гуру программирования Гради Буч в 2001 году сделал важное признание в статье Through the Looking Glass: «Я был неправ: все-таки есть нечто более глубокое, нечто поистине более богатое возможностями, чем объекты». Этими словами Буч представил аспектно-ориентированное программирование (АОП) — на тот момент новейшую парадигму программирования.

История индустрии программного обеспечения началась с огромных машин и машинного кода — ни о чём не говорящих человеку рядов чисел, поэтому решение вычислительных задач с точки зрения проектирования и программирования было чрезвычайно трудоёмким. Требовались простые, удобные механизмы абстракции для упрощения процессов моделирования и программирования. Машинные языки сменил ассемблер, который в 1960-х — начале 1970-х уступил место структурным и процедурным языкам, позднее вытесненным объектно-ориентированным с его принципами инкапсуляции, наследования и полиморфизма.

Эволюция парадигм программирования происходила в связи с потребностью в разделении ответственности (separation of concerns): артефактов, концепций или особенностей, интересующих участников проекта разработки программного обеспечения. Зона ответственности может быть функциональной (например, добавление элемента к списку) или нефункциональной (например, быстродействие, безопасность и т. д.) либо относиться к этапам жизненного цикла разработки программного обеспечения, например к проектированию.

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

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

Типичная программа представляет собой набор взаимосвязанных друг с другом компонентов (например, отвечающих за управление транзакциями), обычно имеющих взаимозависимости по тем или иным функциям. Такое взаимосоединение называется сквозной функциональностью (cross-cutting concern), и аспектно-ориентированное программирование занимается её систематизацией, преобразованием в отдельные модули и их управлением.

Основным инструментом АОП являются аспекты — модули, реализующие сквозную функциональность. На сегодня существует несколько аспектно-ориентированных языков и инструментов — например, AspectJ и PostSharp.

С появлением АОП возникло немало вопросов о нужности и сферах применения новых парадигм, поэтому продуманный стандарт, предоставляющий логическую и систематизированную базу оценки и классификации парадигм, мог бы стать ценным подспорьем для участников разработки программного обеспечения[5].

Разнообразие парадигм программирования

1. Процедурное программирование — это стиль программирования, при котором программа структурируется в виде набора процедур (функций или подпрограмм), которые выполняют конкретные задачи и могут вызываться из других частей программы; в процедурном программировании данные и функции обычно разделены, и данные передаются в процедуры в качестве параметров[6].

2. Объектно-ориентированное программирование (ООП) — это стиль программирования, который основан на понятии объектов, включающих в себя данные и методы, которые манипулируют этими данными; ООП позволяет создавать программы, которые легко масштабировать и поддерживать, путем организации кода в виде объектов, которые взаимодействуют друг с другом[7].

3. Функциональное программирование — это стиль программирования, в котором программа представляет собой набор функций, которые преобразуют данные.; функции являются основными строительными блоками программы, и они выполняют преобразования данных без побочных эффектов и изменения состояния программы[8].

4. Логическое программирование — это стиль программирования, основанный на логике и математике; программы, написанные в логическом стиле, состоят из набора правил и фактов, которые позволяют вывести нужный результат из базы знаний[9].

5. Исполнительное программирование — это стиль программирования, при котором программа создается напрямую в исполнимый код, без промежуточного этапа компиляции или интерпретации; в исполнительном программировании код программы создается напрямую в машинный код, который может быть выполнен процессором[10].

6. Реактивное программирование — это стиль программирования, при котором программа реагирует на изменения внешних условий или внутренних состояний, путем автоматического запуска реакции на эти изменения; в реактивном программировании, программа организуется в виде потоков данных, которые передаются между различными компонентами программы, каждый из которых является отдельным потоком[11].

7. Декларативное программирование — это стиль программирования, при котором программа описывает желаемый результат, а не последовательность команд для достижения этого результата; в декларативном программировании программист описывает, что программа должна делать, а не как её следует выполнить[12].

8. Параллельное программирование — это стиль программирования, при котором задачи выполняются параллельно, одновременно на нескольких процессорах или ядрах процессора, чтобы ускорить работу программы; в параллельном программировании, задачи могут быть разделены на независимые подзадачи, которые выполняются параллельно[13].

9. Аспектно-ориентированное программирование — это стиль программирования, который позволяет разделять код на модули, называемые аспектами, и внедрять эти аспекты в различные места кода; аспекты в аспектно-ориентированном программировании представляют собой модули, которые являются пересекающимися областями функциональности в приложении[14].

10. Структурное программирование — это стиль программирования, в основе которого лежит представление программы в виде иерархической структуры блоков[15].

11. Аппликативное программирование — это стиль программирования, в котором написание программы состоит в систематическом осуществлении применения одного объекта к другому[16].

12. Обобщённое программирование — это стиль программирования, заключающийся в таком описании данных и алгоритмов, которое можно применять к различным типам данных, не меняя само это описание[17].

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

14. Агентно-ориентированное программирование — это стиль программирования, в котором основополагающими концепциями являются понятия агента и его ментальное поведение, зависящее от среды, в которой он находится[18].

15. Контрактное программирование — это стиль программирования, который предполагает, что проектировщик должен определить формальные, точные и верифицируемые спецификации интерфейсов для компонентов системы.

16. Автоматное программирование — это стиль программирования, при использовании которого программа или её фрагмент осмысливается как модель какого-либо формального автомата[19].

17. Событийно-ориентированное программирование — это стиль программирования, в котором выполнение программы определяется событиями — действиями пользователя (клавиатура, мышь, сенсорный экран), сообщениями других программ и потоков, событиями операционной системы (например, поступлением сетевого пакета)[20].

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

См. также

Литература

  1. Панов С. А. Объектно-ориентированное программирование: Курс лекций / Панов С. А., Ганджа Т. В. — Томск: ТУСУР, 2015. — 110 с.
  2. Федотов А. М. Парадоксы информационных технологий // Вестник НГУ. Серия: Информационные технологии. — 2008. — Т. 6. — Вып. 2. — С. 3-14.
  3. Пальмер С. З., Фелсинг Дж. М. Практическое руководство по функционально-ориентированной разработке ПО: Пер. с англ. — М.: Вильямс, 2002. — 304 с. ISBN 5-8459-0365-3.
  4. Роганов Е. А. Основы информатики и программирования / Учебное пособие — М.: МГИУ, 2001. — 315 с., ил. ISBN 5-276-00187-1.

Примечания

  1. Чистая архитектура. Часть II - Парадигмы программирования (рус.) ?. Habr (26.04.2021). Дата обращения: 18 апреля 2023.
  2. Что такое парадигмы программирования и зачем они нужны (рус.) ?. Блог "Яндекс.Практикум" (18.01.2023). Дата обращения: 26 августа 2023.
  3. Себеста, Р. Концепции языков программирования. 9-е изд.. — Москва: ДМК Пресс, 2013. — 688 с. — ISBN 978-5-94074-806-2..
  4. Хариди, С. Язык программирования Оз: Введение в программирование.. — Москва: Символ-Плюс, 2008. — 400 с. — ISBN 978-5-93286-142-9..
  5. Эволюция парадигмы программирования (рус.) ?. Открытые системы (01.08.2012). Дата обращения: 26 августа 2023.
  6. Лафоре, Р. Объектно-ориентированное программирование в С++. — Санкт-Петербург: Питер, 2002. — 1040 с. — ISBN 5-318-00156-5.
  7. ООП в картинках. Habr (16.08.2019). Дата обращения: 18 апреля 2023.
  8. Функциональное программирование (рус.) ?. GitHub. Дата обращения: 18 апреля 2023.
  9. Павловский М. Логическое программирование. — Санкт-Петербург: БХВ-Петербург, 2005. — 368 с. — ISBN 5-94157-379-1.
  10. Шилдт Г. Java 9. Руководство для начинающих. — Москва: Диалектика, 2018. — 816 с. — ISBN 978-5-8459-2089-5.
  11. Реактивное программирование со Spring, часть 1 Введение (рус.) ?. Habr (30.06.2021). Дата обращения: 18 апреля 2023.
  12. Декларативный UI: определение, история и необходимость (рус.) ?. Habr (17.11.2022). Дата обращения: 18 апреля 2023.
  13. Введение в параллелизм (рус.) ?. Habr (21.10.2021). Дата обращения: 18 апреля 2023.
  14. Аспектно-ориентированное программирование: изучи и сделай сам! (рус.) ?. Habr (28.10.2013). Дата обращения: 18 апреля 2023.
  15. Дал У., Дейкстра Э., Хоор К. Структурное программирование. — М.: Мир, 1975. — 247 с.
  16. Бэкус Дж. Можно ли освободить программирование от стиля фон Нейманна? Функциональный стиль и соответствующая алгебра программ / под ред. Р. Эшенхерста. — М.: Мир, 1993. — С. 84—158. — (Лекции лауреатов премии Тьюринга).
  17. Степанов А. А., Роуз Д. Э. От математики к обобщённому программированию. — М.: ДМК Пресс, 2016. — 264 с. — ISBN 978-5-97060-379-6.
  18. Зайцев И. М., Федяев О. И. Агентно-ориентированный подход к моделированию интеллектуальных распределённых систем. — Донецк: ДонНТУ, 2008. — С. 337—338.
  19. Поликарпова Н. И., Шалыто А. А. Автоматное программирование. — СПб.: Питер, 2009. — 176 с. — ISBN 978-5-388-00692-9.
  20. Непейвода Н. Н. 13. Лекция: Событийное программирование // Стили и методы программирования. Курс лекций. Учебное пособие. — М.: Интернет-университет информационных технологий, 2005. — С. 213—222. — 316 с. — ISBN 5-9556-0023-X.

Ссылки