«Забуті» парадигми програмування

    
 
Вийшло так, що ті парадигми, які раніше потом і кров'ю пробивалися у світ через орди прихильників традиційних методів поступово забуваються. Ці парадигми виникли на зорі програмування і те, чому вони виникали, які переваги вони давали і чому використовуються досі корисно знати будь-якому розробнику.
 
Гаразд. Введення це дуже весело, але ви його все одно не читаєте, так що кому цікаво — ласкаво просимо під кат!
 
 Імперативне програмування
 
Історично склалося так, що переважна більшість обчислювальної техніки, яку ми програмуємо має стан і програмується інструкціями, тому перші мови програмування в основному були чисто імперативними, тобто не підтримували ніяких парадигм крім імперативною.
 
Це були машинні коди, мови асемблера і ранні високорівневі мови, начебто Fortran.
 
 

Ключові моменти:

У цій парадигмі обчислення описуються у вигляді інструкцій, крок за кроком змінюють стан програми.
 
У низькорівневих мовах (таких як мова асемблера) станом можуть бути пам'ять, регістри і прапори, а інструкціями — ті команди, що підтримує цільової процесор.
 
У більш високорівневих (таких як Сі) стан — це тільки пам'ять, інструкції можуть бути складніше і викликати виділення і звільнення пам'яті в процесі своєї роботи.
 
У зовсім високорівневих (таких як Python, якщо на ньому програмувати імперативно) стан обмежується лише змінними, а команди можуть являти собою комплексні операції, які на асемблері займали б сотні рядків.
 
 

Основні поняття:

 - Інструкція
 - Стан
 
 

Породжені поняття:

 - Присвоєння
 - Перехід
 - Пам'ять
 - Покажчик
 
 

Мови підтримують дану парадигму:

 
Як основну:
 - Мови асемблера
 - Fortran
 - Algol
 - Cobol
 - Pascal
 - C
 - C + +
 - Ada
 
 
Як допоміжну:
 - Python
 - Ruby
 - Java
 - C #
 - PHP
 - Haskell (через монади)
 
Варто зауважити, що більша частина сучасних мов в тій чи іншій мірі підтримує імперативне програмування. Навіть на чистому функціональному мовою Haskell можна писати імперативно.
 
 Структурне програмування
 
Структурне програмування — парадигма програмування (також часто зустрічається визначення — методологія розробки), яка була першим великим кроком у розвитку програмування.
 
Основоположниками структурного програмування були такі знамениті люди як Е. Дейкстра і Н. Вірт.
 
Мовами-першопрохідцями в цій парадигмі були Fortran, Algol і B, пізніше їх приймачами стали Pascal і C.
 
 

Ключові моменти:

Ця парадигма вводить нові поняття, що об'єднують часто використовувані шаблони написання імперативного коду.
 
У структурному програмуванні ми по колишньому оперуємо станом і інструкціями, проте вводиться поняття складовою інструкції (блоку), інструкцій розгалуження і циклу.
 
Завдяки цим простим змінам можливо відмовитися від оператора goto в більшості випадків, що спрощує код.
 
Іноді goto все-таки робить код читабельнее, завдяки чому він досі широко використовується, незважаючи на всі заяви його супротивників.
 
 

Основні поняття:

 - Блок
 - Цикл
 - Галуження
 
 

Мови підтримують дану парадигму:

  
Як основну:
 - C
 - Pascal
 - Basic
 
 
Як допоміжну:
 - C #
 - Java
 - Python
 - Ruby
 - JavaScript
 
Підтримують частково:
 - Деякі макроассемблера (через макроси)
 
Знову-таки більша частина сучасних мов підтримують структурну парадигму.
 
 Процедурне програмування
 
Знову-ж зростаюча складність програмного забезпечення змусила програмістів шукати інші способи описувати обчислення.
 
Власне ще раз були введені додаткові поняття, які дозволили по-новому поглянути на програмування.
 
Цим поняттям цього разу була процедура.
 
У результаті виникла нова методологія написання програм, яка вітається і донині — вихідна завдання розбивається на менші (за допомогою процедур) і це відбувається до тих пір, поки рішення всіх конкретних процедур не опиниться тривіальним.
 
 

Ключові моменти:

Процедура — самостійний ділянку коду, який можна виконати як одну інструкцію.
 
У сучасному програмуванні процедура може мати кілька точок виходу (return в C-подібних мовах), кілька точок входу (за допомогою yield в Python або статичних локальних змінних в C + +), мати аргументи, повертати значення як результат свого виконання, бути перевантаженою за кількістю або типом параметрів і багато чого ще.
 
 

Основні поняття:

 - Процедура
 
 

Породжені поняття:

 - Виклик
 - Аргументи
 - Повернення
 - Рекурсія
 - Перевантаження
 
 

Мови підтримують дану парадигму:

  
Як основну:
 - C
 - C + +
 - Pascal
 - Object Pascal
 
 
Як допоміжну:
 - C #
 - Java
 - Ruby
 - Python
 - JavaScript
 
Підтримують частково:
 - Ранній Basic
 
Варто відзначити, що кілька точок входу з усіх цих мов підтримуються тільки в Python.
 
 Модульне програмування
 
Який раз збільшується складність програм змусила розробників розділяти свій код. На цей раз процедур було недостатньо і цього разу було введено нове поняття — модуль.
 
Забігаючи вперед скажу, що модулі теж виявилися нездатні стримати з неймовірною швидкістю зростаючу складність ПЗ і надалі з'явилися пакети (це теж модульне програмування), класи (це вже ООП), шаблони (узагальнене програмування).
 
Програма описана в стилі модульного програмування — це набір модулів. Що всередині, класи, імперативний код або чисті функції — не важливо.
 
Завдяки модулям вперше в програмуванні з'явилася серйозна інкапсуляція — можливо використовувати будь сутності всередині модуля, але не показувати їх зовнішнього світу.
 
 

Ключові моменти:

Модуль — це окрема іменована сутність програми, яка об'єднує в собі інші програмні одиниці, близькі за функціональністю.
 
Наприклад файл List.mod що включає в себе клас List
і функції для роботи з ним — модуль.
 
Папка Geometry, що містить модулі Shape, Rectangle і Triangle — теж модуль, хоч і деякі мови поділяють поняття модуля і пакета (в таких мовах пакет — набір модулів і / або набір інших пакетів).
 
Модулі можна імпортувати (підключати), для того, щоб використовувати оголошені в них сутності.
 
 

Основні поняття:

 - Модуль
 - Імпортування
 
 

Породжені поняття:

 - Пакет
 - Інкапсуляція
 
 

Мови підтримують дану парадигму:

  
Як основну:
 - Haskell
 - Pascal
 - Python
 
 
Як допоміжну:
 - Java
 - C #
 - ActionScript 3
 
Підтримують частково:
 - C / C + +
 
У деяких мовах для модулів введені окремі абстракції, в інших же для реалізації модулів можна використовувати заголовні файли (в C / C + +), простору імен, статичні класи та / або спільні бібліотеки.
 
 Замість висновку
У даній статті я не описав популярні зараз об'єктно-орієнтоване, узагальнене і функціональне програмування. Просто тому, що у мене є своє, досить радикальну думку на цей рахунок і я не хотів розводити холівар. Принаймні зараз. Якщо тема виявиться корисною для спільноти я планую написати кілька статей, виклавши основи кожної з цих парадигм докладно.
 
Також я нічого не написав про екзотичні парадигми, начебто автоматного, аплікативного, аспект / агент / компонент-орієнтованого програмування. Я не хотів робити статтю сильно великий і знову-ж якщо тема буде затребувана, я напишу і про ці парадигмах, можливо більш детально і з прикладами коду.
    
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.