Працэдурнае праграмаванне

**Працэдурнае праграмаванне** — гэта парадыгма праграмавання, якая паходзіць ад структураванага праграмавання і заснаваная на канцэпцыі *выкліку працэдуры* . Працэдуры, таксама вядомыя як падпраграмы ці функцыі, проста ўтрымліваюць шэраг вылічальных этапаў, якія трэба выканаць. Любая працэдура можа быць выклікана ў любы момант падчас выканання праграмы, як  непасрэдна, так і з іншых працэдур. Першыя істотныя працэдурныя мовы праграмавання ўпершыню з’явіліся каля 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 

## Літаратура 

Катэгорыя:Парадыгмы праграмавання