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

методологія проєктування та реалізація програм з використанням ключових функцій та будівельних блоків мови програмування

Паради́гма програмува́ння є способом класифікації мов програмування на основі їхніх особливостей. Мови можна класифікувати за кількома парадигмами.

Деякі парадигми стосуються головним чином наслідків для моделі виконання мови, наприклад дозволу побічних ефектів або того, чи послідовність операцій визначається моделлю виконання. Інші парадигми в основному стосуються способу організації коду, наприклад, групування коду в одиниці разом із станом, який змінюється кодом. Інші мають відношення головним чином до стилю синтаксису та граматики.

Загальні парадигми програмування:

Символічні методи (наприклад, рефлексія), які дозволяють програмі посилатися на себе, також можна розглядати як парадигму програмування. Однак вони сумісні з основними парадигмами і тому не є самостійною парадигмою.

Наприклад, мови, які відповідають імперативній парадигмі, мають дві основні особливості:

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

Зв'язок між одиницями коду не є явним. Тим часом в об’єктно-орієнтованому програмуванні код організовано в об’єкти, які містять стан, який змінюється лише кодом, який є частиною об’єкта. Більшість об'єктно-орієнтованих мов також є імперативними мовами. Мови, які відповідають декларативній парадигмі, не визначають порядок виконання операцій. Натомість вони надають ряд доступних операцій у системі разом із умовами, за яких кожну з них дозволено виконувати. Реалізація моделі виконання мови відстежує, які операції можна вільно виконувати, і самостійно вибирає порядок.

Детальніше в Порівняння багатопарадигмальних мов програмування.

Кожну окрему парадигму програмування характеризує наявність у ній методу та зв'язок із моделлю життєвого циклу. Спільним для різних парадигм програмування є загальні принципи проєктування програмного продукту. Користувач може вибирати ту або іншу парадигму програмування з позицій зручності застосування для задач у ПрО та виготовлення конкретного програмного продукту[1].

Огляд

ред.
 
Огляд різних парадигм програмування за Пітером Ван Роєм[2][3]

Подібно до того, як розробка програмного забезпечення (як процес) визначається різними методологіями, так і мови програмування (як моделі обчислень) визначаються різними парадигмами. Деякі мови розроблені для підтримки однієї парадигми (Smalltalk підтримує об'єктно-орієнтоване програмування, Haskell підтримує функціональне програмування), тоді як інші мови програмування підтримують кілька парадигм (такі як Object Pascal, C++, Java, JavaScript, C#, Scala, Visual Basic, Common Lisp, Scheme, Perl, PHP, Python, Ruby, Oz, і F#). Наприклад, програми, написані на C++, Object Pascal або PHP, можуть бути чисто процедурними, суто об'єктно-орієнтованими або можуть містити елементи обох або інших парадигм. Розробники програмного забезпечення та програмісти вирішують, як використовувати ці елементи парадигми.

В об'єктно-орієнтованому програмуванні програми розглядаються як набір взаємодіючих об'єктів. У функційному програмуванні програми розглядаються як послідовність оцінок функції без стану. Під час програмування комп’ютерів або систем із багатьма процесорами в процесно-орієнтованому програмуванні програми розглядаються як набори одночасних процесів, які діють на логічні спільні структури даних.

Багато парадигм програмування добре відомі техніками, які вони забороняють та дозволяють. Наприклад, чисте функційне програмування забороняє використання побічних ефектів, тоді як структурне програмування забороняє використання оператора goto. Частково з цієї причини нові парадигми часто вважаються доктринними або занадто жорсткими для тих, хто звик до попередніх стилів. Тим не менш, уникання певних методів може полегшити розуміння поведінки програми та доведення теорем про її коректність. Парадигми програмування також можна порівняти з моделями програмування, які дозволяють викликати модель виконання за допомогою лише API. Моделі програмування також можна розділити на парадигми на основі особливостей моделі виконання.

Для паралельних обчислень використання моделі програмування замість мови є звичайним. Причина полягає в тому, що деталі паралельного апаратного забезпечення просочуються в абстракції, які використовуються для програмування апаратного забезпечення. Це змушує програміста відображати шаблони в алгоритмі на шаблони в моделі виконання (які були вставлені через витік апаратного забезпечення в абстракцію). Як наслідок, жодна з паралельних мов програмування не відповідає всім проблемам обчислення. Таким чином, зручніше використовувати базову послідовну мову та вставляти виклики API до моделей паралельного виконання через модель програмування. Такі моделі паралельного програмування можна класифікувати відповідно до абстракцій, які відображають апаратне забезпечення, наприклад, спільної пам’яті, розподіленої пам’яті з передачею повідомлень, уявлення про місце, видиме в коді, і так далі. Це можна вважати різновидами парадигми програмування, які застосовуються лише до паралельних мов і моделей програмування.

Критика

ред.

Деякі дослідники мов програмування критикують поняття парадигм як класифікацію мов програмування, напр. Харпер і Крішнамурті. Вони стверджують, що багато мов програмування не можуть бути строго класифіковані в одній парадигмі, а радше включають функції кількох парадигм. Див. Порівняння багатопарадигмальних мов програмування.

Історія терміна

ред.

Своїм сучасним значенням у науково-технічній галузі термін «парадигма» зобов'язаний, вочевидь, Томасу Куну та його книзі «Структура наукових революцій». Кун називав парадигмами усталені системи наукових поглядів, у межах яких ведуться дослідження, відтак, у процесі розвитку наукової дисципліни може відбуватися заміна однієї парадигми на іншу[4], при цьому стара парадигма ще продовжує якийсь час існувати, ба навіть розвиватися завдяки тому, що багато її прихильників виявляються з тих чи інших причин нездатними перебудуватися до праці в іншій парадигмі.

Власне термін «Парадигма програмування» вперше застосував Роберт Флойд у своїй лекції[5] лауреата премії Тюрінга, відзначаючи, що в програмуванні можна спостерігати явище, подібне парадигмам Куна, але, на відміну від таких, парадигми програмування не є взаємовиключними:

  Якщо прогрес мистецтва програмування в цілому вимагає постійного винаходу і вдосконалення парадигм, то вдосконалення мистецтва окремого програміста вимагає, щоб він розширював свій репертуар парадигм.  

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

Основні парадигми програмування

ред.

Мультипарадигмова мова програмування

ред.

Мультипарадигмова мова програмування — це мова програмування, яка підтримує кілька парадигм. Наприклад на Python можна писати як імперативні та об'єктно-орієнтовані, так і програми в функціональному стилі.

Примітки

ред.
  1. Лавріщева К. М. Програмна інженерія [Архівовано 4 березня 2016 у Wayback Machine.] — К.: Академперіодика, 2008.- 319 с.
  2. Peter Van Roy (12 травня 2009). Programming Paradigms: What Every Programmer Should Know (PDF). info.ucl.ac.be. Процитовано 27 січня 2014.
  3. Peter Van-Roy; Seif Haridi (2004). Concepts, Techniques, and Models of Computer Programming. MIT Press. ISBN 978-0-262-22069-9.
  4. Наприклад, геоцентрична небесна механіка Птолемея змінилася геліоцентричної системою Коперника.
  5. R.W. Floyd. The Paradigms of Programming Communications of the ACM, 22(8):455—460, 1979. — Російською див.: Лекции лауреатов премии Тьюринга за первые двадцать лет (1966—1985) — М.: МИР, 1993.

Див. також

ред.