shkencën kompjuterike, programimi funksional është një paradigmë programimi ku programet ndërtohen duke zbatuar dhe përbërë funksione . Është një paradigmë programimi deklarative në të cilën përkufizimet e funksioneve janë pemë shprehjesh që krahasojnë disa vlera me vlera të tjera, në vend të një vargu deklaratash imperative që përditësojnë gjendjen e ekzekutimit të programit.

Në programimin funksional, funksionet trajtohen si qytetarë të klasit të parë, që do të thotë se ato mund të ngjiten me emrat (duke përfshirë identifikuesit vendorë), të kalohen si argumenta dhe të kthehen nga funksione të tjera, ashtu si çdo lloj tjetër i të dhënave . Kjo lejon që programet të shkruhen në një stil deklarativ dhe kompozues (të përbërë), ku funksionet e vogla kombinohen në një mënyrë modulare .

Programimi funksional ndonjëherë trajtohet si sinonim i programimit të pastër funksional, një nëngrup i programimit funksional i cili i trajton të gjitha funksionet si funksione matematikore përcaktuese ose funksione të pastra . Kur një funksion i pastër thirret me disa argumente të dhëna, ai gjithmonë do të kthejë të njëjtin rezultat dhe nuk mund të ndikohet nga ndonjë gjendje e ndryshueshme ose efekte të tjera anësore . Kjo është në kontrast me procedurat e papastra, të zakonshme në programimin imperativ, të cilat mund të kenë efekte anësore (të tilla si modifikimi i gjendjes së programit ose marrja e të dhënave nga një përdorues). Përkrahësit e programimit thjesht funksional pohojnë se duke kufizuar efektet anësore, programet mund të kenë më pak gabime, të jenë më të lehta për tu bërë debug dhe testuar dhe më të përshtatshëm për verifikim zyrtar . [1] [2]

Programimi funksional i ka rrënjët në akademi, duke evoluar nga llogaritja lambda, një sistem formal i llogaritjes i bazuar vetëm tek funksionet. Programimi funksional ka qënë historikisht më pak popullor se ai imperativ, por shumë gjuhë funksionale po gjejnë përdorim gjithnjë edhe më shumë në industri dhe arsim , duke përfshire Common Lisp, Scheme, Clojure, Wolfram Language,[3] Racket, Erlang, Elixir,[4] OCaml, Haskell, and F#. Lean është një gjuhë programimi e përdorur rëndom për të provuar teoremat matematikore. Programimi funksional është gjithashtu kyç në disa gjuhë që kanë/kanë patur sukses në fusha specifike, si JavaScript në Web,[5] Rstatistikë, J, K dhe Q në analizë financiare, dhe XQuery/XSLT për XML. Gjuhë të tilla si SQL dhe Lex/Yacc përdorin elemente të programimit funksional, psh moslejimi i vlerave të ndryshueshme. Gjithashtu, shumë gjuhë të tjera programimi mbështesin një stil funksional ose kanë implementuar veçori nga programimi funksional si psh C++11, C#,[6] Kotlin,[7] Perl,[8] PHP,[9] Python,[10] Go,[11] Rust,[12] Raku,[13] Scala dhe Java (që prej Java 8).

Konceptet

Redakto

Një numër konceptesh [14] dhe paradigmash janë specifike për programimin funksional dhe përgjithësisht të huaja për programimin imperativ (përfshirë programimin e orientuar nga objekti ). Sidoqoftë, gjuhët e programimit shpesh ofrojnë disa paradigma programimi, kështu që programuesit që përdorin gjuhë "kryesisht imperative" mund të kenë përdorur disa nga këto koncepte. [15]

Funksione të klasit të parë dhe të rendit të lartë

Redakto

Funksionet e rendit të lartë janë funksione që ose mund të marrin funksione të tjera si argumente ose t'i kthejnë ato si rezultate. Në llogaritje, një shembull i një funksioni të rendit të lartë është operatori diferencial  , i cili kthen derivatin e një funksioni   .

Funksionet e rendit më të lartë janë të lidhura ngushtë me funksionet e klasit të parë sepse që funksionet e rendit më të lartë dhe funksionet e klasit të parë lejojnë funksione si argumente dhe rezultate të funksioneve të tjera. Dallimi midis të dyjave është delikat: "i rendit të lartë" përshkruan një koncept matematikor të funksioneve që veprojnë mbi funksione të tjera, ndërsa "klasi i parë" është një term i shkencës kompjuterike për entitetet e gjuhës së programimit që nuk kanë kufizime në përdorimin e tyre (pra funksionet e klasit të parë mund të shfaqen kudo në program aty ku munden entitete të tjera të klasit të parë si numrat, duke përfshirë si argumente për funksionet e tjera dhe si vlerat e tyre të kthimit).

Funksione të pastra

Redakto

Funksionet (ose shprehjet) e pastra nuk kanë efekte anësore (kujtesë ose I/O). Kjo do të thotë që funksionet e pastra kanë disa veti të dobishme, shumë prej të cilave mund të përdoren për të optimizuar kodin:

  • Nëse rezultati i një shprehjeje të pastër nuk përdoret, ai mund të hiqet pa i prekur shprehjet e tjera.
  • Nëse një funksion i pastër thirret me argumente që nuk shkaktojnë efekte anësore, rezultati është konstante në lidhje me atë listë argumentesh (ndonjëherë quhet transparencë referenciale ose idempotencë ), dmth, thirrja e funksionit të pastër përsëri me të njëjtat argumente kthen të njëjtin rezultat.
  • Nëse nuk ka varësi të të dhënave midis dy shprehjeve të pastra, rendi i tyre mund të përmbyset, ose mund të kryhen paralelisht dhe nuk mund të ndërhyjnë me njëra-tjetrën (me terma të tjerë, vlerësimi i çdo shprehjeje të pastër është i sigurt në thread ).
  • Nëse e gjithë gjuha nuk lejon efekte anësore, atëherë mund të përdoret çdo strategji vlerësimi; kjo i jep kompajlerit lirinë për të rirenditur ose kombinuar vlerësimin e shprehjeve në një program (për shembull, duke përdorur shpyllëzimin ).

Rekursioni

Redakto

Iterimi (looping) në gjuhët funksionale zakonisht realizohet nëpërmjet rekursionit . Funksionet rekursive thirren në vetvete, duke lënë një veprim të përsëritet derisa të arrijë në rastin bazë . Në përgjithësi, rekursioni kërkon mbajtjen e një stive, e cila konsumon hapësirë në një sasi lineare deri në thellësinë e rekursionit. Kjo mund ta bëjë rekursionin jashtëzakonisht të shtrenjtë për t'u përdorur në vend të laqeve imperative. Megjithatë, një formë e veçantë e rekursionit e njohur si rekursioni i bishtit mund të njihet dhe optimizohet nga një përpilues në të njëjtin kod që përdoret për të zbatuar përsëritjen në gjuhët imperative. Optimizimi i rekursionit të bishtit mund të zbatohet duke e transformuar programin në stilin e vazhdimit të kalimit gjatë përpilimit, midis qasjeve të tjera.

  1. ^ Hudak, Paul (shtator 1989). "Conception, evolution, and application of functional programming languages" (PDF). ACM Computing Surveys. 21 (3): 359–411. doi:10.1145/72551.72554. Arkivuar nga origjinali (PDF) më 2016-01-31. Marrë më 2013-08-10. {{cite journal}}: Mungon ose është bosh parametri |language= (Ndihmë!)
  2. ^ Hughes, John (1984). "Why Functional Programming Matters". {{cite web}}: Mungon ose është bosh parametri |language= (Ndihmë!)
  3. ^ "Wolfram Language Guide: Functional Programming". 2015. Marrë më 2015-08-24. {{cite web}}: Mungon ose është bosh parametri |language= (Ndihmë!)
  4. ^ "The Elixir Programming Language". Marrë më 2021-02-14. {{cite web}}: Mungon ose është bosh parametri |language= (Ndihmë!)
  5. ^ Banz, Matt (2017-06-27). "An introduction to functional programming in JavaScript". Opensource.com (në anglisht). Marrë më 2021-01-09.
  6. ^ Functional Programming with C# - Simon Painter - NDC Oslo 2020 (në anglisht), 8 gusht 2021, arkivuar nga origjinali më 31 korrik 2024, marrë më 2021-10-23{{citation}}: Mirëmbajtja CS1: BOT: Gjendja e adresës origjinale është e panjohur (lidhja)
  7. ^ "Functional programming - Kotlin Programming Language". Kotlin. Marrë më 2019-05-01. {{cite web}}: Mungon ose është bosh parametri |language= (Ndihmë!)
  8. ^ Dominus, Mark J. (2005). Higher-Order Perl. Morgan Kaufmann. ISBN 978-1-55860-701-9. {{cite book}}: Mungon ose është bosh parametri |language= (Ndihmë!)
  9. ^ Holywell, Simon (2014). Functional Programming in PHP. php[architect]. ISBN 9781940111056. {{cite book}}: Mungon ose është bosh parametri |language= (Ndihmë!)
  10. ^ The Cain Gang Ltd. "Python Metaclasses: Who? Why? When?" (PDF). Arkivuar nga origjinali (PDF) më 30 maj 2009. Marrë më 27 qershor 2009. {{cite web}}: Mungon ose është bosh parametri |language= (Ndihmë!)
  11. ^ "GopherCon 2020: Dylan Meeus - Functional Programming with Go". YouTube. 22 dhjetor 2020. {{cite web}}: Mungon ose është bosh parametri |language= (Ndihmë!)
  12. ^ "Functional Language Features: Iterators and Closures - The Rust Programming Language". doc.rust-lang.org. Marrë më 2021-01-09. {{cite web}}: Mungon ose është bosh parametri |language= (Ndihmë!)
  13. ^ Vanderbauwhede, Wim (18 korrik 2020). "Cleaner code with functional programming". Arkivuar nga origjinali më 28 korrik 2020. Marrë më 6 tetor 2020. {{cite web}}: Mungon ose është bosh parametri |language= (Ndihmë!)Mirëmbajtja CS1: Datë e përkthyer automatikisht (lidhja)
  14. ^ Sean Tull - Monoidal Categories for Formal Concept Analysis.
  15. ^ Pountain, Dick. "Functional Programming Comes of Age". Byte (August 1994). Arkivuar nga origjinali më 2006-08-27. Marrë më 31 gusht 2006. {{cite web}}: Mungon ose është bosh parametri |language= (Ndihmë!)