Парадыгма праграмаваньня

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

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

Некаторыя распаўсюджаныя парадыгмы праграмаваньня ўключаюць (паказаны ў герархічных адносінах):

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

## Агляд

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

Мова праграмаваньня можа быць апісаная ў тэрмінах парадыгмаў. Некаторыя мовы падтрымліваюць толькі адну парадыгму. Напрыклад, Smalltalk падтрымлівае аб’ектна-арыентаваную, а Haskell — функцыянальную. Большасьць моў падтрымлівае некалькі парадыгмаў. Напрыклад, праграма, напісаная на C++, Object Pascal або PHP, можа быць чыста працэдурнай, чыста аб’ектна-арыентаванай, або можа ўтрымліваць аспэкты абедзвюх парадыгмаў.

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

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

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

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

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

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

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

Для паралельных вылічэньняў выкарыстаньне мадэлі праграмаваньня замест мовы — звычайная з’явай. Прычына ў тым, што дэталі рэалізацыі паралельнага апаратнага забеспячэньня «прасочваюцца» ў праграмныя абстракцыі. Гэта прымушае праграміста супастаўляць патэрны ў альгарытме з патэрнамі ў мадэлі выкананьня (якія былі ўстаўлены з-за «ўцечкі» апаратнага абсталяваньня ў абстракцыю). Як следства, ніводная мова паралельнага праграмаваньня добра не адпавядае ўсім праблемам вылічэньняў. Такім чынам, больш зручна выкарыстоўваць базавую паслядоўную мову і ўстаўляць выклікі API у мадэлі паралельнага выкананьня праз мадэль праграмаваньня. Такія мадэлі паралельнага праграмаваньня могуць быць клясыфікаваныя ў адпаведнасьці з абстракцыямі, якія датычацца апаратнага забеспячэньня, такімі як агульная памяць, размеркаваная памяць з перадачай паведамленьняў, паняцьцямі *месца*, бачнага ў кодзе, і гэтак далей. Гэта можна лічыць разнавіднасьцямі парадыгмаў праграмаваньня, якія прымянімыя толькі да паралельных моў і мадэляў праграмаваньня.

## Крытыка
Некаторыя дасьледчыкі, напрыклад, Харпер і Крышнамурці, крытыкуюць прымяненье паняцьця парадыгмы для клясыфікацыі моў праграмаваньня. Яны сцьвярджаюць, што многія мовы праграмаваньня маюць асаблівасьці некалькіх парадыгмаў, таму не могуць быць строга аднесеныя да адной парадыгмы.

## Гісторыя
З часам склаліся розныя падыходы да праграмаваньня. Клясыфікацыя кожнага падыходу была альбо апісаная ў той час, калі ён быў распрацаваны, альбо, часта, толькі праз некаторы час апасьля. Раньні падыход, які свядома вызначаецца як такі, — гэта структураванае праграмаваньне, якое зьявілася ў сярэдзіны 1960-х гадоў. Канцэпцыя *парадыгмы праграмавання* датуецца 1978 годам. Зьяўляецца ўпершыню ў лекцыі Робэрта Флойда на прэмію Т’юрынга пад назваю *«Парадыгмы праграмаваньня»*, у якой цытуецца паняцьце парадыгмы, выкарыстанае Томасам Кунам у яго працы *«Структуры навуковых рэвалюцый»* (1962 г.). Раньнія мовы праграмаваньня не мелі выразна вызначаных парадыгмаў праграмаваньня, і часам праграмы злоўжывалі выкарыстаньнем апэратара goto, што прыводзіла да спагэці-кода, які цяжка зразумець і падтрымліваць. Гэта стала падставаю для зьяўленьня структураванага праграмаваньня, якое забараняла выкарыстаньне апэратара goto.

## Мовы і парадыгмы

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

Машынны код часам называюць моваю праграмаваньня першага пакаленьня.

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

У 1960-я гады былі распрацаваны мовы асэмблера для падтрымкі бібліятэчнага COPY, даволі складанае ўмоўнае генэрацыі макрасаў, перадпрацэсынгавых магчымасьцей, CALL падпраграмы, вонкавых зьменных і агульных (глябальных) сэкцый. Праз выкарыстаньне лягічных апэратараў, такія як READ/WRITE/GET/PUT, значна палепшылася паўторнае выкарыстаньне кода і ізаляцыя ад спэцыфікі абсталяваньня. Мова асэмблера выкарыстоўвалася і дагэтуль выкарыстоўваецца для крытычных па часе сыстэм і часта ва ўбудаваных сыстэмах, паколькі яна дае найбольшы кантроль над тым, што робіць машына.

### Працэдурныя мовы
Працэдурныя мовы, таксама званыя мовамі праграмаваньня трэцяга пакаленьня, упершыню апісаныя як мовы высокага ўзроўню. Яны падтрымліваюць лексыку, звязаную з праблемаю, якая вырашаецца. Напрыклад:

* COBOL — выкарыстоўвае такія тэрміны, як файл, перамяшчэньне і капіяваньне.
* FORTRAN — быў распрацаваны ў асноўным для навуковых і інжынэрных задач, выкарыстоўвае тэрміналёгію матэматычнае мовы.
* ALGOL — засяроджаная на тым, каб быць адпаведнай моваю для вызначэньня альгарытмаў, выкарыстоўвае матэматычную тэрміналёгію й накіраваная на навуковыя й інжынэрныя праблемы, як і FORTRAN.
* PL/I — гібрыд камэрцыйна-навуковае мовы агульнага прызначэньня, якая падтрымлівае паказальнікі.
* BASIC — была распрацаваная для шырокага кола людзей.
* C — мова праграмавання агульнага прызначэньня, першапачаткова распрацаваная Дэнісам Рычы паміж 1969 і 1973 гадамі ў AT&amp;T Bell Labs.

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

### Аб’ектна-арыентаванае праграмаваньне
Каб палепшыць працэдурныя мовы былі створаныя мовы аб’ектна-арыентаванага праграмаваньня (ААП), такія як Simula, Smalltalk, C++, Eiffel, Python, PHP, Java і C#. У гэтых мовах даныя й мэтады маніпуляваньня данымі знаходзяцца ў адной кодавай адзінцы, якая называецца аб’ектам. Гэтая інкапсуляцыя гарантуе, што аб’ект можа атрымаць доступ да даных толькі з дапамогаю *мэтадаў* аб’екта, які зьмяшчае даныя. Такім чынам, унутраная рэалізацыя аб’екта можа быць зьмененая без уплыву на код, які выкарыстоўвае аб’ект.

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

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

### Дэкляратыўныя мовы
Праграма дэкляратыўнага праграмаваньня апісвае, у чым праблема, а не тое, як яе вырашыць. Праграма структураваная як набор уласьцівасьцей для пошуку ў чаканым выніку, а не як працэдура, якой трэба прытрымлівацца. Маючы базу даных або набор правілаў, кампутар спрабуе знайсьці рашэньне, якое адпавядае ўсім жаданым уласьцівасьцям. Архетыпам дэкляратыўнае мовы з’яўляюцца мова чацьвёртага пакаленьня SQL, сямейства функцыянальных моў і лягічнае праграмаваньня.

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

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

### Іншыя парадыгмы
Сымбальнае праграмаваньне — гэта парадыгма, якая апісвае праграмы, здольныя маніпуляваць формуламі і праграмнымі кампанентамі як данымі. Такім чынам, праграмы могуць эфэктыўна мадыфікаваць сябе і, здаецца, «навучацца», што робіць іх прыдатнымі для выкарыстаньня ў такіх сфэрах, як штучны інтэлект, экспэртныя сыстэмы, апрацоўка натуральнае мовы і кампутарныя гульні. Мовы, якія падтрымліваюць гэтую парадыгму, уключаюць Lisp і Prolog.

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

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

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

## Крыніцы