Працэдурнае праграмаванне - гэта парадыгма праграмавання, якая паходзіць ад структураванага праграмавання і заснаваная на канцэпцыі выкліку працэдуры . Працэдуры, таксама вядомыя як падпраграмы ці функцыі, проста ўтрымліваюць шэраг вылічальных этапаў, якія трэба выканаць. Любая працэдура можа быць выклікана ў любы момант падчас выканання праграмы, як непасрэдна, так і з іншых працэдур. Першыя істотныя працэдурныя мовы праграмавання ўпершыню з'явіліся каля 1960 года, уключаючы Fortran, ALGOL, COBOL і BASIC.[1] Pascal і C з'явіліся бліжэй да 1970-х.
Камп'ютарныя працэсары забяспечваюць апаратную падтрымку працэдурнага праграмавання праз рэгістр стэку і інструкцыі для выкліку працэдур і вяртання з іх. Апаратная падтрымка для іншых тыпаў праграмавання магчымая, але ніводная спроба іх рэалізацыі не была камерцыйна паспяховай (напрыклад, машыны Lisp або працэсары Java ).
Модульнасць звычайна пажаданая, асабліва ў вялікіх, складаных праграмах. Зыходныя даныя звычайна пазначаюцца сінтаксічна ў выглядзе аргументаў, а вынікі перадаюцца ў выглядзе вяртаемых значэнняў .
Абмежаванне зоны бачнасці - яшчэ адна методыка, якая дапамагае захоўваць працэдуры модульнымі. Яно не дае працэдуры атрымліваць доступ да пераменных іншых працэдур (і наадварот), у тым ліку папярэдніх выкананняў самой працэдуры, без наўмыснага дазволу.
Менш модульныя працэдуры, якія часта выкарыстоўваюцца ў невялікіх альбо хутка напісаных праграмах, звычайна ўзаемадзейнічаюць з вялікай колькасцю пераменных у асяроддзі выканання, якія іншыя працэдуры таксама могуць змяняць.
З-за магчымасці вызначэння простага інтэрфейсу, аўтаномнасці і паўторнага выкарыстання, працэдуры - зручны сродак для стварэння фрагментаў кода, напісаных рознымі людзьмі або рознымі групамі, у тым ліку праз бібліятэкі праграмавання .
Мовы працэдурнага праграмавання таксама з'яўляюцца імператыўнымі мовамі, таму што яны яўна спасылаюцца на стан асяроддзя выканання. Гэта можа быць што заўгодна: ад пераменных (якія могуць адпавядаць рэгістрам працэсараў) да чагосьці накшталт становішча "чарапахі" на мове праграмавання Logo .
Часта тэрміны "працэдурнае праграмаванне" і "імператыўнае праграмаванне" выкарыстоўваюцца ў якасці сінонімаў. Аднак працэдурнае праграмаванне ў значнай ступені абапіраецца на блокі і зону бачнасці, у той час як імператыўнае праграмаванне ў цэлым можа як мець, так і не мець такіх функцый. Такім чынам, працэдурныя мовы звычайна выкарыстоўваюць зарэзерваваныя словы, якія ўтвараюць блокі, напрыклад, if
, while
і for
, каб ажыццявіць кіраванне шляхам выканання, у той час як неструктураваныя імператыўныя мовы выкарыстоўваюць goto-аператары і табліцы пераходу з той жа мэтай.
Асноўная ідэя працэдурнага праграмавання заключаецца ў разбіцці праграмы на набор пераменных, структур даных і падпраграм, у той час як у аб'ектна-арыентаваным праграмаванні праграма разбіваецца на аб'екты, якія даюць доступ да сваіх паводзін (метадаў) і даных (членаў альбо атрыбутаў) з выкарыстаннем інтэрфейсаў. Самае галоўнае адрозненне заключаецца ў тым, што ў той час, як працэдурнае праграмаванне выкарыстоўвае працэдуры для выканання дзеянняў са структурамі даных, аб'ектна-арыентаванае праграмаванне звязвае іх у адно, таму "аб'ект", які з'яўляецца экземплярам класа, выкарыстоўвае "сваю ўласную" структуру даных. [2]
Найменні адрозніваюцца паміж гэтымі двума парадыгмамі, хоць і маюць падобную семантыку:
Працэдурная | Аб'ектна-арыентаваная |
---|---|
працэдура | метад |
запіс | аб'ект |
модуль | клас |
выклік працэдуры | паведамленне |
Прынцыпы модульнасці і паўторнага выкарыстання кода ў функцыянальных мовах, што ўжываюцца на практыцы, у аснове такія ж, як і ў працэдурных мовах, бо з'яўляюцца адгалінаваннем структураванага праграмавання. Так, напрыклад:
Асноўная розніца паміж стылямі заключаецца ў тым, што функцыянальныя мовы праграмавання выдаляюць ці, прынамсі, прыглушваюць імператыўныя элементы працэдурнага праграмавання. Такім чынам, набор уласцівасцяў функцыянальных моў прызначаны для максімальнай падтрымкі напісання праграм з пункту гледжання чыстых функцый :
Аднак, многія функцыянальныя мовы насамрэч не з'яўляюцца чыстымі і прапануюць імператыўныя / працэдурныя канструкцыі, якія дазваляюць праграмісту пісаць праграмы ў працэдурным стылі альбо ў спалучэнні абодвух стыляў. Нярэдка код уводу / вываду на функцыянальных мовах пішацца ў працэдурным стылі.
Насамрэч існуе некалькі эзатэрычных функцыянальных моў (напрыклад, Unlambda ), якія адмаўляюцца ад структураваных падыходаў дзеля такго, каб быць складанымі ў праграмаванні (і гэтым прывабнымі). Гэтыя мовы з'яўляюцца выключэннем з агульнага пункту судакранання працэдурных і функцыянальных моў.
У лагічным праграмаванні праграма ўяўляе сабой набор умоў, а вылічэнні праводзяцца шляхам спробы даказаць прапанаваную тэарэму. З гэтага пункту гледжання лагічныя праграмы з'яўляюцца дэкларатыўнымі, яны засяроджваюцца на тым, што ўяўляе сабой праблема, а не на тым, як яе вырашыць.
Аднак методыка зваротнага вываду, якая рэалізуецца SLD-рэзалюцыяй, што выкарыстоўваецца для вырашэння праблем у мовах лагічнага праграмавання, такіх як Prolog, разглядае праграмы як працэдуры резалюцыі мэты. Напрыклад, такое правіла:
мае падвойную інтэрпрэтацыю, як працэдуры
H
, трэба паказаць/вырашыць B1
і … і Bn
і як лагічнай імплікацыі:
Дасведчаныя праграмісты-логікі выкарыстоўваюць працэдурную інтэрпрэтацыю для напісання прадукцыйных і эфектыўных праграм, і дэкларатыўную інтэрпрэтацыю, каб пераканацца ў правільнасці праграм.