**Працэдурнае праграмаванне** - гэта парадыгма праграмавання, якая паходзіць ад структураванага праграмавання і заснаваная на канцэпцыі *выкліку працэдуры*. Працэдуры, таксама вядомыя як падпраграмы ці функцыі, проста ўтрымліваюць шэраг вылічальных этапаў, якія трэба выканаць. Любая працэдура можа быць выклікана ў любы момант падчас выканання праграмы, як непасрэдна, так і з іншых працэдур. Першыя істотныя працэдурныя мовы праграмавання ўпершыню з'явіліся каля 1960 года, уключаючы Fortran, ALGOL, COBOL і BASIC. Pascal і C з'явіліся бліжэй да 1970-х. 

Камп'ютарныя працэсары забяспечваюць апаратную падтрымку працэдурнага праграмавання праз рэгістр стэку і інструкцыі для выкліку працэдур і вяртання з іх. Апаратная падтрымка для іншых тыпаў праграмавання магчымая, але ніводная спроба іх рэалізацыі не была камерцыйна паспяховай (напрыклад, машыны Lisp або працэсары Java ).

Працэдуры і модульнасць
-----------------------

Модульнасць звычайна пажаданая, асабліва ў вялікіх, складаных праграмах. Зыходныя даныя звычайна пазначаюцца сінтаксічна ў выглядзе *аргументаў,* а вынікі перадаюцца ў выглядзе *вяртаемых значэнняў*. 

Абмежаванне зоны бачнасці - яшчэ адна методыка, якая дапамагае захоўваць працэдуры модульнымі. Яно не дае працэдуры атрымліваць доступ да пераменных іншых працэдур (і наадварот), у тым ліку папярэдніх выкананняў самой працэдуры, без наўмыснага дазволу. 

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

З-за магчымасці вызначэння простага інтэрфейсу, аўтаномнасці і паўторнага выкарыстання, працэдуры - зручны сродак для стварэння фрагментаў кода, напісаных рознымі людзьмі або рознымі групамі, у тым ліку праз бібліятэкі праграмавання .

Параўнанне з іншымі парадыгмамі праграмавання
---------------------------------------------

### Імператыўнае праграмаванне

Мовы працэдурнага праграмавання таксама з'яўляюцца імператыўнымі мовамі, таму што яны яўна спасылаюцца на стан асяроддзя выканання. Гэта можа быць што заўгодна: ад *пераменных* (якія могуць адпавядаць рэгістрам працэсараў) да чагосьці накшталт становішча "чарапахі" на мове праграмавання Logo. 

Часта тэрміны "працэдурнае праграмаванне" і "імператыўнае праграмаванне" выкарыстоўваюцца ў якасці сінонімаў. Аднак працэдурнае праграмаванне ў значнай ступені абапіраецца на блокі і зону бачнасці, у той час як імператыўнае праграмаванне ў цэлым можа як мець, так і не мець такіх функцый. Такім чынам, працэдурныя мовы звычайна выкарыстоўваюць зарэзерваваныя словы, якія ўтвараюць блокі, напрыклад, `if`, `while` і `for`, каб ажыццявіць кіраванне шляхам выканання, у той час як неструктураваныя імператыўныя мовы выкарыстоўваюць goto-аператары і табліцы пераходу з той жа мэтай. 

### Аб'ектна-арыентаванае праграмаванне

Асноўная ідэя працэдурнага праграмавання заключаецца ў разбіцці праграмы на набор пераменных, структур даных і падпраграм, у той час як у аб'ектна-арыентаваным праграмаванні праграма разбіваецца на аб'екты, якія даюць доступ да сваіх паводзін (метадаў) і даных (членаў альбо атрыбутаў) з выкарыстаннем інтэрфейсаў. Самае галоўнае адрозненне заключаецца ў тым, што ў той час, як працэдурнае праграмаванне выкарыстоўвае працэдуры для выканання дзеянняў са структурамі даных, аб'ектна-арыентаванае праграмаванне звязвае іх у адно, таму "аб'ект", які з'яўляецца экземплярам класа, выкарыстоўвае "сваю ўласную" структуру даных. 

Найменні адрозніваюцца паміж гэтымі двума парадыгмамі, хоць і маюць падобную семантыку: 

| Працэдурная | Аб'ектна-арыентаваная |
| --- | --- |
| працэдура | метад |
| запіс | аб'ект |
| модуль | клас |
| выклік працэдуры | паведамленне |

### Функцыянальнае праграмаванне

Прынцыпы модульнасці і паўторнага выкарыстання кода ў функцыянальных мовах, што ўжываюцца на практыцы, у аснове такія ж, як і ў працэдурных мовах, бо з'яўляюцца адгалінаваннем структураванага праграмавання. Так, напрыклад: 

* Працэдуры адпавядаюць функцыям. І першыя, і другія дазваляюць паўторна выкарыстоўваць адзін і той жа код у розных частках праграм і ў розных пунктах іх выканання.
* Паводле таго ж падыходу, выклікі працэдур адпавядаюць ужыванню функцый
* Функцыі і іх выклікі модульна аддзяляюцца адно ад аднаго гэткім жа чынам, пры дапамозе аргументаў функцый, вяртаемага значэння і зоны бачнасці пераменных.

Асноўная розніца паміж стылямі заключаецца ў тым, што функцыянальныя мовы праграмавання выдаляюць ці, прынамсі, прыглушваюць імператыўныя элементы працэдурнага праграмавання. Такім чынам, набор уласцівасцяў функцыянальных моў прызначаны для максімальнай падтрымкі напісання праграм з пункту гледжання чыстых функцый : 

* У той час, як працэдурныя мовы мадэліруюць выкананне праграмы ў выглядзе паслядоўнасці загадных каманд, якія могуць невідавочна змяняць супольна выкаростоўваемае асяроддзе, функцыянальныя мовы праграмавання мадэліруюць выкананне ў выглядзе вылічэння складаных выразаў, якія залежаць толькі адзін ад аднаго праз аргументы і вяртаемыя значэнні. З гэтай прычыны функцыянальныя праграмы могуць мець вольны парадак выканання кода, а мовы могуць мала забяспечваць кантроль над парадкам выканання розных частак праграмы. (Напрыклад, аргументы для выкліку працэдуры ў Scheme выконваюцца ў адвольным парадку.)
* Мовы функцыянальнага праграмавання падтрымліваюць (і шырока выкарыстоўваюць) функцыі першага класу, ананімныя функцыі і замкненні, але гэтыя паняцці дадаюцца і ў больш сучасныя працэдурныя мовы
* Мовы функцыянальнага праграмавання схільныя ўжываць аптымізацыю хваставой рэкурсіі і функцыі больш высокага парадку замест імператыўных цыклавых канструкцый.

Аднак, многія функцыянальныя мовы насамрэч не з'яўляюцца чыстымі і прапануюць імператыўныя / працэдурныя канструкцыі, якія дазваляюць праграмісту пісаць праграмы ў працэдурным стылі альбо ў спалучэнні абодвух стыляў. Нярэдка код уводу / вываду на функцыянальных мовах пішацца ў працэдурным стылі. 

Насамрэч існуе некалькі эзатэрычных функцыянальных моў (напрыклад, Unlambda ), якія адмаўляюцца ад структураваных падыходаў дзеля такго, каб быць складанымі ў праграмаванні (і гэтым прывабнымі). Гэтыя мовы з'яўляюцца выключэннем з агульнага пункту судакранання працэдурных і функцыянальных моў. 

### Лагічнае праграмаванне

У лагічным праграмаванні праграма ўяўляе сабой набор умоў, а вылічэнні праводзяцца шляхам спробы даказаць прапанаваную тэарэму. З гэтага пункту гледжання лагічныя праграмы з'яўляюцца дэкларатыўнымі, яны засяроджваюцца на тым, што ўяўляе сабой праблема, а не на тым, як яе вырашыць. 

Аднак методыка зваротнага вываду, якая рэалізуецца SLD-рэзалюцыяй, што выкарыстоўваецца для вырашэння праблем у мовах лагічнага праграмавання, такіх як Prolog, разглядае праграмы як працэдуры резалюцыі мэты. Напрыклад, такое правіла: 

H :- B1, …, Bn.
мае падвойную інтэрпрэтацыю, як працэдуры 

каб паказаць/вырашыць `H`, трэба паказаць/вырашыць `B1` і … і `Bn`
і як лагічнай імплікацыі: 

B1 і … і Bn азначае H.
Дасведчаныя праграмісты-логікі выкарыстоўваюць працэдурную інтэрпрэтацыю для напісання прадукцыйных і эфектыўных праграм, і дэкларатыўную інтэрпрэтацыю, каб пераканацца ў правільнасці праграм.

Глядзіце таксама
----------------

* Параўнанне парадыгм праграмавання
* Дэкларатыўнае праграмаванне
* Функцыянальнае праграмаванне (кантраст)
* Імператыўнае праграмаванне
* Лагічнае праграмаванне
* Аб'ектна-арыентаванае праграмаванне
* Парадыгмы праграмавання
* Мова праграмавання
* Структураванае праграмаванне
* Працэдурныя пашырэнні SQL

Літаратура
----------

1. ↑  Welcome to IEEE Xplore 2.0: Use of procedural programming languages for controlling production systems **(нявызн.)**.  ieeexplore.ieee.org. Праверана 6 красавіка 2008.
2. ↑  *Stevenson, Joseph*. Procedural programming vs object oriented programming **(нявызн.)**.  neonbrand.com. Праверана 19 жніўня 2013.