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

**Працэду́рнае праграмава́ньне** — парадыгма праграмаваньня, аснаваная на канцэпцыі *выкліку працэдуры*.

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

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

* Магчымасьць паўторна выкарыстоўваць тай самы код у розных месцах праграмы безь неабходнасьці яго капіяваць.
* Больш просты спосаб кантраляваць выкананьне праграмы, чым набор *GOTO* і *JUMP* (якія могуць ператварыць вялікую, складаную праграму у так званы «код-спагеці»).
* Магчымасьць быць моцна модульным ці структурным.

## Працэдуры і модульнасьць
Асабліва ў вялікіх, складаных праграмах модульнасць — гэта часта патрэбная мажлівасьць. Яе можна рэалізаваць, выкарыстоўваючы працэдуры з строга ўстаноўленымі каналамі ўводу/вываду, і, звычайна, зь яснымі правіламі пра тое, якія тыпы ўводу дазволеныя ці чаканыя. Увод, як правіла, указваецца сынтаксычна ў форме *аргумэнтаў* і вывад вяртаецца як *вяртаемае значэньне*.

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

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

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

## Параўнаньне з імпэратыўным праграмаваньнем
Большасьць ці ўсе ўжываныя працэдурныя мовы праграмаваньня зьяўляюцца таксама імпэратыўнымі мовамі, бо яны робяць яўныя спасылкі на стан акружэньня. Яны могуць быць чым заўгодна, ад *зьменных* (якія могуць суадносіцца з рэгістрам працэсара) да нечага накшталт пазыцыі «чарапахі» ў мове праграмаваньня *[[Logo]]* (якая таксама можа быць чым заўгодна, ад курсора на экране да сапраўднай прылады, які рухаецца па падлозе пакою).

Частка формаў імпэратыўнага праграмаваньня, такія як аб’ектна-арыентаванае праграмаваньне, не абавязкова працэдурныя.

## Параўнаньне з аб’ектна-арыентаваным праграмаваньнем
Болей пасьлядоўныя формы модульнасьці мажлівыя з аб’ектна-арыентаваным праграмаваньнем, якое было створана пазьней. Замест выкарыстаньня працэдураў, увода і вываду, ААП выкарыстоўвае *аб’екты* Пры вылічэньнях выкарыстоўваюцца ўнутраныя працэдуры аб’екта (ці працэдуры, якія ён атрымаў ад аб’ектаў-продкаў).

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

## Працэдурныя мовы праграмаваньня
Працэдурныя мовы праграмаваньня садзейнічаюць жаданьню праграміста выкарыстоўваць працэдурнае праграмаваньне. Кананічны прыклад працэдурнага праграмаваньня — мова *[[Algol]]*. Сярод іншых — *[[Fortran]]*, *[[PL/I]]*, *[[Modula-2]]* і *[[Ada]]*. Заўважце, што гэты сьпіс зьмяшчае ня толькі выключна працэдурныя мовы, як, напрыклад, *Java*, якая была створана спэцыяльна для аб’ектна-арыентаванага праграмаваньня.

* *[[Ada]]* — шматмэтавая мова
* *[[BASIC]]* — у ім мала модульнасьці, асабліва да вэрсіяў 1990-х гадоў
* *[[C (мова праграмаваньня)|C]]*
* *[[C++]]* — C з аб’ектамі і шмат чым яшчэ
* *[[C Sharp|C#]]* — створаны «Майкрасофтам», частка .NET, якая ставіцца ў працідзею *[[Java]]*
* *[[ColdFusion]]*
* *[[COBOL]]*
* *[[Component Pascal]]* — варыянт мовы *Oberon-2*
* *[[D (мова праграмаваньня)|D]]*
* *[[Delphi (мова праграмаваньня)|Delphi]]*
* *[[ECMAScript]]* a.k.a. *[[JavaScript]]*, *[[JScript]]*
* *[[Fortran]]* — большая модульнасьць у апошніх стандартах
* *[[FPC Pascal]]* — дыялект мовы *Pascal*
* *[[Java]]*
* *[[Modula-2]]* — фундамэнтальна аснаваная на модулях
* *[[Oberon]]* і *[[Oberon-2]]* — палепшаны, меншы, хутчэйшы пасьлядоўнік мовы *Modula-2*
* *[[MUMPS|M]]* — болей модульная ў сваёй першай вэрсіі, чым мова таго часу мела быць; стандарт стаў з таго часу яшчэ больш модульным
* *[[Pascal]]* — пасьлядоўнік *Algol60*, база для *Modula-2*
* *[[Perl]]*
* *[[PL/C]]*
* *[[PL/1]]* — вялікая агульнамэтавая мова, арыгінальна для майнфрэймаў IBM
* *[[Rapira]]*
* *[[VBScript]]*
* *[[Visual Basic]]*

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