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

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

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

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

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

 
Агляд розных парадыгмаў праграмаваньня паводле Пітэра Ван Роя[5][6]

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

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

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

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

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

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

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

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

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

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

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

Гісторыя

рэдагаваць

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

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

рэдагаваць

Машынны код

рэдагаваць

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

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

Мова асэмблера

рэдагаваць

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

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

Працэдурныя мовы

рэдагаваць

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

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

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

Аб’ектна-арыентаванае праграмаваньне

рэдагаваць

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

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

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

Дэкляратыўныя мовы

рэдагаваць

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

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

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

Іншыя парадыгмы

рэдагаваць

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

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

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

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

  1. ^ Шматпарадыгмавая мова праграмаваньня = Multi-Paradigm Programming Language (анг.). Mozilla Foundation (21-06-2013). Архіўная копія ад 21-08-2013 г.
  2. ^ Курт Нёрмарк (09-05-2011) Агляд чатырох галоўных парадыгмаў = Overview of the four main programming paradigms (анг.). Унівэрсытэт Аальборга.
  3. ^ Франс Коэнэн (1999-10-11) Характарыстыкі дэкляратыўнае мовы праграмаваньня = Characteristics of declarative programming languages (анг.). cgi.csc.liv.ac.uk. Архіўная копія ад 2014-02-27 г.
  4. ^ а б Майкл Ковінгтон (2010-08-23) Першая лекцыя пра сымбальнае праграмаваньне й Лісп = CSCI/ARTI 4540/6540: First Lecture on Symbolic Programming and LISP (анг.). Унівэрсытэт Джорджыі. Архіўная копія ад 2012-03-07 г.
  5. ^ Пітар Ван Рой (2009-05-12) Што кожны праграміст павінен ведаць пра парадыгмы праграмаваньня = Programming Paradigms: What Every Programmer Should Know (анг.). info.ucl.ac.be.
  6. ^ Пітар Ван Рой, Саіф Гарыды Канцэпцыі, тэхнікі і мадэлі машыннага праграмаваньня = Concepts, Techniques, and Models of Computer Programming. — MIT Press, 2004. — ISBN 978-0-262-22069-9
  7. ^ Парадыгмы праграмаваньня. Што такое прынцыпы праграмаваньня? = Programming paradigms: What are the principles of programming? (анг.) IONOS Digitalguide Архіўная копія ад Jun 29, 2022 г.
  8. ^ Фрэнк Рубін Шкода GOTO  (анг.) = GOTO Considered Harmful // Communications of the ACM. — Сакавік 1987. — Т. 30. — С. 195–196. — DOI:10.1145/214748.315722
  9. ^ Робэрт Харпэр (01-05-2017) Што будзе, калі ўсё, што заўгодна, лічыць парадыгмаю праграмаваньня? = What, if anything, is a programming-paradigm? (анг.) FifteenEightyFour. Cambridge University Press.
  10. ^ Шрырам Крышнамурці Выкладаньне моў праграмаваньня ў эпоху пасля Ліннэя  (анг.) = Teaching programming languages in a post-linnaean age // ACM SIGPLAN Notices. — ACM, Лістапад 2008. — Т. 43. — С. 81–83. — DOI:10.1145/1480828.1480846.
  11. ^ Робэрт Флойд Парадыгмы праграмаваньня  (анг.) = The paradigms of programming // Communications of the ACM. — 1979. — Т. 22. — С. 455–460. — DOI:10.1145/359138.359140
  12. ^  Сорока, Бары Джава 5. Спачатку аб'екты = Java 5: Objects First. — Jones & Bartlett Learning, 2006. — ISBN 9780763737207
  13. ^ Бізнэс-гласарый. Вызначэньне сымбальнага праграмаваньня = Business glossary: Symbolic programming definition (анг.) allbusiness.com
  14. ^ Фэй Ванг, Джэймс Дэкер, Зылан Ву, Грэгары Эсэртэль, Тыярк Ромпф (2018) Зваротнае распаўсюджваньне з зваротнымі выклікамі - асновы для эфэктыўнага і выразнага дыфэрэнцавальнага праграмаваньня = Backpropagation with Callbacks: Foundations for Efficient and Expressive Differentiable Programming (анг.) Advances in Neural Information Processing Systems 31. Curran Associates, Inc..
  15. ^ Майк Інэс Пра машыннае навучаньне й мовы праграмаваньня  (анг.) = On Machine Learning and Programming Languages // SysML Conference 2018. — 2018.