Яка різниця між імперативним, процедурним та структурованим програмуванням?


85

Досліджуючи (книги, Вікіпедія, подібні запитання щодо ІП тощо), я зрозумів, що імперативне програмування - одна з головних парадигм програмування, де ви описуєте серію команд (або висловлювань) для комп'ютера, який потрібно виконати (так що ви симпатичні значною мірою наказують йому робити конкретні дії, звідси назва "імператив"). Все йде нормально.

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

Перше питання : чи існує імперативна мова програмування, яка не є процедурною? Іншими словами, чи можна мати імперативне програмування без процедур?

Оновлення : на це перше питання, здається, є відповідь. Мова МОЖНА бути імперативною, не будучи процедурною чи структурованою. Приклад - чиста мова монтажу.

Потім у вас є також Структуроване програмування, яке, здається, є іншим типом (або підмножиною) імперативного програмування, яке з'явилося, щоб зняти залежність від оператора GOTO.

Друге питання : Яка різниця між процедурним та структурованим програмуванням? Чи можете ви мати одне без іншого, і навпаки? Чи можна сказати, що процедурне програмування - це підмножина структурованого програмування, як на зображенні?

введіть тут опис зображення

Відповіді:


52

Багато мов можуть бути повторно використані (часто неправильно використовуються) щодо мов програмування, особливо тих, що не є об'єктно-орієнтованими.

Ось кілька невеликих описів термінів.

  1. Імперативне програмування - У старі добрі часи, коли програмування було широко в зборі, код мав би тонни GOTO. Навіть мови вищого рівня, такі як FORTRAN та BASIC, почали використовувати ті самі примітиви. У цій парадигмі програмування вся програма є єдиним алгоритмом або повною функціональністю, записаною лінійно - покроково. Це імперативний стиль . Зрозумійте, що справді можна написати абсолютно погану імперативну роботу навіть у сучасній мові С, але організувати код на мовах вищого рівня досить просто.

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

    • Структуроване програмування - це будь-яке програмування, коли функціональність поділяється на одиниці, такі як for loop, while loop, if... thenблокова структура тощо.
    • Також тут фрагмент коду (функції) можна повторно використовувати.
    • У модульному програмуванні можна створити фізичну форму пакету - тобто шматок коду, який можна відправити; які мають загальне призначення та можуть бути повторно використані. Це називається модулями елементів, складених разом.
    • Тому навряд чи можна побачити модульні програми, які не структуровані, і навпаки; технічне визначення дещо інше, але в основному структурований код може бути зроблений модульним та іншим способом.
  3. Потім з'явилося "об'єктно-орієнтоване програмування", яке добре визначено в літературі. Зрозумійте, що об'єктно-орієнтоване програмування є формою структурованого програмування за визначенням. Нове ім'я для всіх тих функціональних кодів, який структурований кодом, але НЕ орієнтований на об'єкти, часто називають процедурним програмуванням.

    • Таким чином, в основному структурований код, де функції (або процедури) домінують над даними, називається процедурним, тоді як представлення на основі класів і об'єктів називається об'єктно-орієнтованим. Обидва за визначенням також є модульними.

Багато хто вважає - все структуроване програмування (можливо, пропуск на основі об'єкта) як імперативне програмування; Я думаю, це лише через відсутність чіткого визначення імперативного програмування - але це неправильно. Ви займаєтесь структурованим програмуванням, коли не виконуєте особливих обов'язкових! Але я все ще можу написати безліч функцій, а також безліч goto-заяв всередині програми C або FORTRAN для змішування.

Щоб конкретно відповідати на ваші запитання:

Перше запитання : Чиста мова збірки - це імперативна мова, яка НЕ ​​є структурованою чи процедурною. (Покроковий інтерпретаційний потік управління не означає процедурний, але поділ функціональності на функції - це те, що робить мову процедурною).

  • виправлення * Більшість сучасних форм складання DO підтримують використання функцій. Насправді все, що можливо в коді високого рівня, МАЄ існувати на низькому рівні для роботи. Хоча для створення процесуального кодексу набагато краща практика, можна написати як процедурний, так і імперативний код. На відміну від останнього, це більш ретельне і простіше зрозуміти (уникаючи жахливого коду спагетті). Я думаю, що існують сценарії shell / bash, які краще відповідають визнанню того, що вони є суто необхідними, але навіть тоді більшість з них мають функції, розробники напевно розуміють, яке значення вони мають.

Друге питання : Процедурне програмування - ФОРМА структурованого програмування.


БОНУС


1
Так ви б сказали, що процедурне програмування обов'язково є також структурованим програмуванням, тоді як навпаки не вірно (хоча це часто буває)?
Даніель Скокко

2
Так, я б сказав так.
Діпан Мехта

1
У своїй відповіді я визначив імператив проти структурованих - де імперативне програмування записується з покроковим виконанням і не структурується. Однак за деяким визначенням існує інша класифікація; це класифікація між декларативною (або функціональною мовою) проти імперативної. Декларативні мови дозволяють проводити обчислення, не описуючи керуючий потік, де як імперативний, де визначається чіткий потік управління (покроковий). Виходячи з цієї класифікації, імперативне програмування для деяких може бути суперкомплектної структури. Деякі не зовсім дотримуються цього визначення.
Діпан Мехта

У мене інша думка щодо визначення структурованого програмування. Структурне програмування та модульне програмування - це не одне і те ж. Будь ласка, дивіться визначення в кінці цієї примітки. Це ж посилання говорить про те, що Assembler ** є ** структурованою мовою програмування! Довідка для визначення STP: en.wikipedia.org/wiki/Structured_programming - Emmad Kareem
NoChance

Це "фізична форма пакету" ... файл чи каталог / архів файлів? (Або це не так, і це щось інше.)
n611x007

4

Перше запитання: Так, багато чистих об'єктно-орієнтованих мов є кваліфікованими. Хоча у них є методи, які дуже близькі до функцій, вони розглядають ці методи як повідомлення, так і не надають їм достатньої ваги, щоб викликати мову процедурною.

Друге питання: Різниця часто в іншому масштабі. Ви можете мати функцію з операторами goto повсюдно, яка буде в процедурному стилі, але не структурованою програмуванням. З іншого боку, більшість мов OO підтримують та заохочують структуроване програмування, але не процедурне програмування.

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

Таким чином, ці дві властивості є неоднорідними, ви можете мати одне без іншого.


1
Єдиний лакмусовий тест на те, що він є процедурним - це те, що мова містить процедури (функції або методи ) та є імперативними, тобто. недеклараційний. Це означає, що більшість мов OO, які не є чистими функціональними, були б процедурними.
дієтабудда

1
@dietbuddha: За цим визначенням Haskell буде кваліфікуватися як процедурна мова через використання монад. Мені потрібно певна покладатися на процедури, щоб зробити мову мовою процедурною.
титон

Я так добре не знаю Haskell, але я подумав, що Haskell є чистою функціональною мовою, оскільки він приховує побічні ефекти в Monads.
дієтабудда

2
Ну, деякі люди стверджують , Haskell не є чисто функціональним , оскільки вона дозволяє будь-якому взаємодії із зовнішнім світом (або тому , що в GHC розширення , unsafePerformIOдозволяє Wreaking Havok). Інші жартують, що Haskell - їх улюблена імперативна мова програмування. Але справа в тому, що дуже велика ступінь коду Haskell живе чисто відокремленою IO, не використовує нестандартні лазівки для прокрадання побічних ефектів і є чисто функціональною.

1
@thiton Я не згоден. Монади теж функціональні конструкції; вони виглядають вкрай необхідними лише через синтаксис цукрів Хаскелла ("do notation"). Коли ви десугар монадів, їх функціональна природа стає очевидною. Навпаки, мови ОО є справді необхідними: в основі їх основи - послідовне виконання висловлювань.
Андрес Ф.

2

Більшість популярних мов за останні 50 років були розроблені навколо поширеної комп’ютерної архітектури, що отримала назву архітектури Фон Ноймана , після одного з її авторів - Джона фон Неймана.

Ці мови називаються імперативними мовами.

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


1
+1 не впевнений, що це стосується питання, але це цікава відповідь.
Чак Конвей

2
Що? Де частина про імператив проти процедурного процесу тощо?
bbqchickenrobot

Я думаю, що справа тут у тому, що капризи щодо структури програми (імперативні, декларативні, процедурні, об’єктно-орієнтовані, функціональні тощо) - це мовні конструкції, і всі програми в кінцевому підсумку обробляються на машинах архітектури Von Neumann. Це схоже на те, що всі мови Turing Complete є рівнозначними.
ChuckCottrill

2

Боюся, що жодна з наведених відповідей поки що не дуже добре захоплює суть концепцій.

Імперативні, процедурні та структуровані не є взаємовиключними властивостями, вони просто зосереджені на одному аспекті логіки моделювання.

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

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

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

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

Декларативне програмування все ще не є звичайним явищем, головним чином тому, що воно завжди буде доменним, принаймні певною мірою. Ви не можете мати декларативну мову загального призначення. Ось чому ми все ще тримаємось так званих мов третього покоління, де декларативне програмування чи «моделювання» вважатиметься 4-м поколінням.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.