Kontentke ótiw

Funkcional programmalastırıw

Wikipedia — erkin enciklopediya

Kompyuter iliminde funkcional programmalastırıw — bul programmalar funkciyalardı qollanıw hám biriktiriw arqalı dúziletuǵın programmalastırıw paradigması. Bul deklarativ programmalastırıw paradigması bolıp, onda funkciya anıqlamaları programmanıń orınlanıw jaǵdayın jańalaytuǵın imperativ operatorlar izbe-izliginiń ornına, mánislerdi basqa mánislerge salıstıratuǵın ańlatpalar teregi bolıp tabıladı.

Funkcional programmalastırıwda funkciyalar birinshi dárejeli obyektler retinde qaraladı, yaǵnıy olar basqa hár qanday maǵlıwmat túri sıyaqlı atlarǵa (sonıń ishinde lokal identifikatorlarǵa da) baylanıstırılıwı, argument retinde beriliwi hám basqa funkciyalardan qaytarılıwı múmkin. Bul programmalardı deklarativ hám kompoziciyalıq (biriktiriletuǵın) stilde jazıwǵa múmkinshilik beredi, bunda kishi funkciyalar modulli túrde biriktiriledi.

Funkcional programmalastırıw geyde taza funkcional programmalastırıw menen sinonim retinde qaraladı, bul funkcional programmalastırıwdıń bir bólimi bolıp, barlıq funkciyalardı deterministlik matematikalıq funkciyalar yamasa taza funkciyalar retinde qarastıradı. Taza funkciya belgili bir argumentler menen shaqırılǵanda, ol bárqulla birdey nátiyje qaytaradı hám oǵan hesh qanday ózgermeli jaǵday yamasa basqa qosımsha tásirler tásir ete almaydı. Bul imperativ programmalastırıwda keń tarqalǵan, qosımsha tásirleri bolıwı múmkin bolǵan (programma jaǵdayın ózgertiw yamasa paydalanıwshıdan maǵlıwmat alıw sıyaqlı) taza emes proceduralarǵa qarama-qarsı keledi. Taza funkcional programmalastırıwdıń tárepdarları qosımsha tásirlerdi sheklew arqalı programmalarda qáteler azıraq bolıwı, olardı sazlaw hám testlew ańsatıraq bolıwı hám rásmiy verifikaciyalawǵa kóbirek sáykes keliwi múmkin ekenligin aytadı[1][2].

Funkcional programmalastırıwdıń tamırları akademiyadan baslanıp, tek ǵana funkciyalarǵa tiykarlanǵan formal esaplaw sisteması bolǵan lyambda esaplawınan rawajlanǵan. Funkcional programmalastırıw tariyxıy jaqtan imperativ programmalastırıwǵa qaraǵanda azıraq ataqlı bolǵan, biraq házirgi kúnde kóp funkcional tiller sanaatta hám bilimlendiriwde qollanılmaqta, sonıń ishinde Common Lisp, Scheme, Clojure, Wolfram Language,[3] Racket, Erlang, Elixir,[4] OCaml, Haskell, hám F#. Lean — bul matematikalıq teoremalardı dálillew ushın keńnen qollanılatuǵın funkcional programmalastırıw tili. Funkcional programmalastırıw sonday-aq belgili bir tarawlarda tabıslı bolǵan ayırım tillerdiń de tiykarı bolıp tabıladı, mısalı, Vebte JavaScript,[5] statistikada R, finanslıq analizde J, K hám Q hám XML ushın XQuery/XSLT. SQL hám Lex/Yacc sıyaqlı arnawlı tarawlarǵa arnalǵan deklarativ tiller ózgermeli mánislerge ruqsat bermew sıyaqlı funkcional programmalastırıwdıń ayırım elementlerin qollanadı. Bunnan tısqarı, basqa da kóp programmalastırıw tilleri funkcional stilde programmalastırıwdı qollap-quwatlaydı yamasa funkcional programmalastırıwdıń ózgesheliklerin óz ishine alǵan, mısalı, C++ (C++11 versiyasınan baslap), C#,[6] Kotlin,[7] Perl, PHP, Python,[8] Go,[9] Rust,[10] Raku,[11] hám Java (Java 8 versiyasınan baslap)

Tariyxı

1930-jılları Alonzo Chyorch tárepinen islep shıǵılǵan lyambda esaplawı — bul funkciyalardı qollanıwǵa tiykarlanǵan formal esaplaw sisteması. 1937-jılı Alan Tyuring lyambda esaplawı menen Tyuring mashinalarınıń ekvivalent esaplaw modelleri ekenligin dálilledi,[12] bul lyambda esaplawınıń Tyuring boyınsha tolıq ekenligin kórsetti. Lyambda esaplawı barlıq funkcional programmalastırıw tilleriniń tiykarın quraydı. Ekvivalent teoriyalıq formulirovka, kombinatorlıq logika, 1920-jılları hám 1930-jılları Mozes Shyonfinkel hám Xaskell Karri tárepinen islep shıǵılǵan[13].

Keyinirek Chyorch kúshsizirek sistema — ápiwayı tiplestirilgen lyambda esaplawın islep shıqtı, ol barlıq termlerge maǵlıwmat tipin beriw arqalı lyambda esaplawın keńeytti[14]. Bul statikalıq tiplestirilgen funkcional programmalastırıwdıń tiykarın quraydı.

Birinshi joqarı dárejeli funkcional programmalastırıw tili, Lisp, 1950-jıllardıń aqırında Massachusets Texnologiya Institutında (MIT) islep júrgen Djon Makkarti tárepinen IBM 700/7000 seriyasındaǵı ilimiy kompyuterler ushın islep shıǵılǵan[15]. Lisp funkciyaları Chyorchtiń lyambda belgilewi arqalı anıqlanǵan hám rekursiv funkciyalarǵa ruqsat beriw ushın belgi konstrukciyası menen keńeytilgen[16]. Lisp birinshi ret funkcional programmalastırıwdıń kóp paradigmalıq ózgesheliklerin kirgizdi, biraq dáslepki Lisp-ler kóp paradigmalı tiller bolıp, jańa paradigmalar rawajlanǵan sayın kóplegen programmalastırıw stillerin qollap-quwatlawdı óz ishine alǵan. Keyingi dialektler, mısalı Scheme hám Clojure, hám de Dylan hám Julia sıyaqlı tarmaqları Lisp-ti taza funkcional yadro átirapında ápiwayılastırıwǵa hám racionalizaciyalawǵa umtıldı, al Common Lisp ózi almastırǵan kóp sanlı eski dialektlerdiń paradigmalıq ózgesheliklerin saqlaw hám jańalaw ushın proektlestirildi[17].

Informaciyanı Qayta Islew Tili (IPL), 1956, geyde birinshi kompyuterge tiykarlanǵan funkcional programmalastırıw tili retinde ataladı. Bul simvollar dizimin manipulyaciyalawǵa arnalǵan assembler stilindegi til. Onda funkciyanı argument retinde qabıl etetuǵın funkciyaǵa teń bolǵan generator túsinigi bar hám ol tómengi dárejeli programmalastırıw tili bolǵanlıqtan, kod maǵlıwmat bola aladı, sol sebepli IPL-di joqarı tártipli funkciyalarǵa iye dep esaplawǵa boladı. Biraq, ol ózgeriwshi dizim strukturasına hám uqsas imperativ ózgesheliklerge qattı súyenedi.

Kennet E. Ayverson 1960-jıllardıń basında APL-di islep shıqtı hám onı óziniń 1962-jılǵı «A Programming Language» (ISBN 9780471430148) kitabında táriyipledi. APL Djon Bekustıń FP tiline tiykarǵı tásir etti. 1990-jıllardıń basında Ayverson hám Rodjer Xyu J tilin jarattı. 1990-jıllardıń ortasında, aldın Ayverson menen islesken Artur Uitni K tilin jarattı, ol óziniń miyrasxorı Q menen birge finans tarawlarında kommerciyalıq maqsetlerde qollanıladı.

1960-jıllardıń ortasında Piter Lendin funkcional programmalastırıw tili ushın birinshi abstrakt mashina SECD mashinasın oylap taptı,[18] ALGOL 60 penen lyambda esaplawı arasındaǵı sáykeslikti táriyipledi,[19][20][21] hám ISWIM programmalastırıw tilin usındı[22].

Djon Bekus 1977-jılǵı Tyuring sıylıǵı lekciyasında FP-di usındı: «Programmalastırıwdı fon Neyman stilinen azat etiwge bola ma? Funkcional stil hám onıń programmalar algebrası»[23]. Ol funkcional programmalardı «programmalar algebrasına» múmkinshilik beretuǵın «biriktiriw formaları» arqalı ierarxiyalıq túrde qurıladı dep anıqlaydı; zamanagóy tilde bul funkcional programmalardıń kompoziciyalıq principine ámel etetuǵının ańlatadı. Bekustıń maqalası funkcional programmalastırıw boyınsha izertlewlerdi keń tarqattı, biraq ol házirgi waqıtta funkcional programmalastırıw menen baylanıslı bolǵan lyambda-esaplaw stilinen góre funkciya dárejesindegi programmalastırıwǵa kóbirek itibar qarattı.

1973-jılǵı ML tili Edinburg universitetinde Robin Milner tárepinen jaratıldı, al Devid Tyorner Sent-Endryus universitetinde SASL tilin islep shıqtı. Sonday-aq 1970-jılları Edinburgta Byorstall hám Darlington NPL funkcional tilin islep shıqtı. NPL Klini Rekursiya Teńlemelerine tiykarlanǵan bolıp, birinshi ret olardıń programma transformaciyası boyınsha jumıslarında usınılǵan edi. Keyin Byorstall, MakKuin hám Sannella ML-den polimorf tip tekseriwin qosıp, Hope tilin jarattı. ML aqıbetinde bir neshe dialektke bólindi, olardıń eń keń tarqalǵanları házirgi waqıtta OCaml hám Standard ML bolıp tabıladı.

1970-jılları Gay L. Stil hám Djerald Djey Sassman Lambda Papers hám 1985-jılǵı «Structure and Interpretation of Computer Programs» sabaqlıǵında táriyiplengendey, Scheme tilin islep shıqtı. Scheme leksikalıq kóriw aymaǵın paydalanǵan hám funkcional programmalastırıwǵa ilham beretuǵın ózgeshelikler — quyrıq shaqırıwın optimallastırıwdı talap etken lisp-tiń birinshi dialekti boldı.

1980-jılları Per Martin-Lyof intuicionistlik tip teoriyasın (konstruktivlik tip teoriyası dep te ataladı) islep shıqtı, ol funkcional programmalardı ǵárezli tipler retinde kórsetilgen konstruktiv dáliller menen baylanıstırdı. Bul interaktiv teorema dálillewge jańa kózqaraslarǵa alıp keldi hám keyingi funkcional programmalastırıw tilleriniń rawajlanıwına tásir etti.

Devid Tyorner tárepinen islep shıǵılǵan «jalqaw» funkcional til Miranda dáslep 1985-jılı payda boldı hám Haskell-ge kúshli tásir etti. Miranda menshikli bolǵanlıqtan, Haskell 1987-jılı funkcional programmalastırıw izertlewleri ushın ashıq standart dúziw boyınsha kelisim menen baslandı; implementaciya relizleri 1990-jıldan berli dawam etpekte.

Sońǵı waqıtlarda ol CGAL freymvorkına tiykarlanǵan OpenSCAD tilinde parametrlik CAD sıyaqlı tarawlarda qollanıla basladı, biraq onıń mánislerdi qayta menshiklewge sheklewi (barlıq mánisler konstantalar retinde qaraladı) funkcional programmalastırıw koncepciyası menen tanıs bolmaǵan paydalanıwshılar arasında aljasıwǵa alıp keldi[24].

Funkcional programmalastırıw kommerciyalıq ortalıqlarda qollanılıwın dawam etpekte[25][26][27].

Túsinikler

Funkcional programmalastırıwǵa tán hám ulıwma alǵanda imperativ programmalastırıwǵa (sonıń ishinde obyektke baǵdarlanǵan programmalastırıwǵa da) jat bolǵan bir qatar túsinikler hám paradigmalar bar. Biraq, programmalastırıw tilleri kóbinese bir neshe programmalastırıw paradigmasın qollaydı, sonlıqtan «tiykarınan imperativ» tillerdi paydalanatuǵın baǵdarlamashılar usı túsiniklerdiń ayırımların paydalanǵan bolıwı múmkin[28].

Birinshi dárejeli hám joqarı tártipli funkciyalar

Joqarı tártipli funkciyalar — bul basqa funkciyalardı argument retinde qabıl ete alatuǵın yamasa olardı nátiyje retinde qaytara alatuǵın funkciyalar. Matematikalıq analizde joqarı tártipli funkciyanıń mısalı — bul funkciyasınıń tuwındısın qaytaratuǵın differencial operatorı.

Joqarı tártipli funkciyalar birinshi dárejeli funkciyalar menen tıǵız baylanıslı, sebebi joqarı tártipli funkciyalar da, birinshi dárejeli funkciyalar da funkciyalardı basqa funkciyalardıń argumentleri hám nátiyjeleri retinde qollanıwǵa ruqsat beredi. Ekewiniń arasındaǵı ayırmashılıq júdá názik: «joqarı tártipli» basqa funkciyalar menen isleytuǵın funkciyalardıń matematikalıq túsinigin táriyipledi, al «birinshi dárejeli» — bul programmalastırıw tili obyektleriniń qollanılıwında hesh qanday sheklewleri joq ekenligin bildiretuǵın kompyuter ilimi termini (solay etip birinshi dárejeli funkciyalar sanlar sıyaqlı basqa birinshi dárejeli obyektler programmanıń qálegen jerinde, sonıń ishinde basqa funkciyalardıń argumentleri retinde hám olardıń qaytarılǵan mánisleri retinde de ushırasa aladı).

Joqarı tártipli funkciyalar bólek qollanıwǵa yamasa kerrińlewge múmkinshilik beredi, bul funkciyanı óz argumentlerine birme-bir qollanatuǵın usıl bolıp, hárbir qollanıw kelesi argumentti qabıl etetuǵın jańa funkciyanı qaytaradı. Bul baǵdarlamashıǵa, mısalı, keyingi san funkciyasın tábiyiy san birge bólek qollanılǵan qosıw operatorı retinde qısqasha ańlatıwǵa múmkinshilik beredi.

Taza funkciyalar

Taza funkciyalar (yamasa ańlatpalar) hesh qanday qosımsha tásirge iye emes (yad yamasa kirgiziw/shıǵarıw). Bul taza funkciyalardıń bir qatar paydalı qásiyetlerge iye ekenligin ańlatadı, olardıń kópshiligin kodtı optimallastırıw ushın qollanıwǵa boladı:

  • Eger taza ańlatpanıń nátiyjesi qollanılmasa, onı basqa ańlatpalarǵa tásir etkizbey alıp taslawǵa boladı.
  • Eger taza funkciya qosımsha tásir payda etpeytuǵın argumentler menen shaqırılsa, nátiyje sol argumentler dizimine qaraǵanda turaqlı boladı (geyde siltemelik anıqlıq yamasa idempotentlik dep ataladı), yaǵnıy taza funkciyanı birdey argumentler menen qayta shaqırıw birdey nátiyjeni qaytaradı. (Bul yadlaw sıyaqlı keshlew optimallastırıwlarına múmkinshilik bere aladı.)
  • Eger eki taza ańlatpa arasında maǵlıwmatlar ǵárezliligi bolmasa, olardıń tártibin ózgertiwge yamasa parallel orınlawǵa boladı hám olar bir-birine kesent ete almaydı (basqasha aytqanda, hár qanday taza ańlatpanı bahalaw aǵımǵa qáwipsiz boladı).
  • Eger pútkil til qosımsha tásirlerge ruqsat bermese, onda qálegen bahalaw strategiyasın qollanıwǵa boladı; bul kompilyatorǵa programmadaǵı ańlatpalardıń bahalanıwın qayta tártiplestiriwge yamasa birlestiriwge erkinlik beredi (mısalı, ormansızlandırıwdı qollanıp).

Imperativ programmalastırıw tilleri ushın kóp kompilyatorlar taza funkciyalardı anıqlaydı hám taza funkciyalardıń shaqırıwları ushın ulıwma ishki ańlatpalardı alıp taslawdı orınlaydı, biraq olar bunı aldınnan kompilyaciyalanǵan kitapxanalar ushın bárqulla isley almaydı, sebebi olar ádette bul informaciyanı kórsetpeydi, solay etip, sol sırtqı funkciyalar menen baylanıslı optimallastırıwlardıń aldın aladı. gcc sıyaqlı ayırım kompilyatorlar baǵdarlamashıǵa sırtqı funkciyalardı taza dep anıq belgilewi ushın qosımsha gilt sózler qosadı, bul bunday optimallastırıwlarǵa múmkinshilik beredi. Fortran 95 te sonday-aq funkciyalardı taza dep belgilewge ruqsat beredi. C++11 uqsas semantikaǵa iye constexpr gilt sózin qostı.

Rekursiya

Funkcional tillerde iteraciya (cikl) ádette rekursiya arqalı ámelge asırıladı. Rekursiv funkciyalar ózlerin shaqıradı, bul operaciyanıń tiykarǵı jaǵdayǵa jetkenshe qaytalanıwına múmkinshilik beredi. Ulıwma alǵanda, rekursiya stekti saqlawdı talap etedi, ol rekursiyanıń tereńligine sızıqlı muǵdarda orın iyeleydi. Bul rekursiyanı imperativ cikllerdiń ornına qollanıw ushın júdá qımbat etip qoyıwı múmkin. Biraq, quyrıq rekursiyası dep atalatuǵın rekursiyanıń arnawlı forması kompilyator tárepinen anıqlanıp, imperativ tillerde iteraciyanı ámelge asırıw ushın qollanılatuǵın birdey kodqa optimallastırılıwı múmkin. Quyrıq rekursiyasın optimallastırıw, basqa usıllar qatarında, kompilyaciya waqtında programmanı dawam etiw stiline ózgertiw arqalı ámelge asırılıwı múmkin.

Scheme tiliniń standartı implementaciyalardıń durıs quyrıq rekursiyasın qollap-quwatlawın talap etedi, yaǵnıy olar sheksiz sanlı aktiv quyrıq shaqırıwlarına ruqsat beriwi kerek[29][30]. Durıs quyrıq rekursiyası tek ǵana optimallastırıw emes; bul paydalanıwshılarǵa cikldi ańlatıw ushın rekursiyanı paydalana alatuǵınlıǵına hám bunıń orın jaǵınan qáwipsiz bolatuǵınına kepillik beretuǵın til ózgesheligi. Sonıń menen birge, atına qaramastan, ol tek quyrıq rekursiyasın emes, al barlıq quyrıq shaqırıwların esapqa aladı. Durıs quyrıq rekursiyası ádette kodtı imperativ cikllerge aylandırıw arqalı ámelge asırılsa da, implementaciyalar onı basqa usıllar menen de ámelge asırıwı múmkin. Mısalı, Chicken qasaqana stekti saqlaydı hám stektiń tolıp ketiwine jol qoyadı. Biraq, bul júz bergende, onıń shıǵındı jıynawshısı orındı qaytarıp aladı,[31] bul quyrıq rekursiyasın ciklge aylandırmasa da, sheksiz sanlı aktiv quyrıq shaqırıwlarına múmkinshilik beredi.

Rekursiyanıń ulıwma úlgilerin joqarı tártipli funkciyalar arqalı abstraktlawǵa boladı, bunda katamorfizmler hám anamorfizmler (yamasa «búgiwler» hám «ashıwlar») eń anıq mısallar bolıp tabıladı. Bunday rekursiya sxemaları imperativ tillerdegi cikller sıyaqlı ornatılǵan basqarıw strukturalarına uqsas rol oynaydı.

Kópshilik ulıwma maqsetli funkcional programmalastırıw tilleri sheklenbegen rekursiyaǵa ruqsat beredi hám Tyuring boyınsha tolıq bolıp tabıladı, bul toqtaw máselesin sheshilmeytuǵın etedi, teńlikli pikir júritiwdiń nadurıslıǵına alıp keliwi múmkin hám ulıwma alǵanda tildiń tip sisteması menen ańlatılǵan logikaǵa sáykes emeslikti kirgiziwdi talap etedi. Rocq sıyaqlı ayırım arnawlı maqsetli tiller tek ǵana jaqsı tiykarlanǵan rekursiyaǵa ruqsat beredi hám kúshli normalizaciyalanadı (juwmaqlanbaytuǵın esaplawlar tek ǵana kodata dep atalatuǵın sheksiz mánisler aǵımları menen ańlatılıwı múmkin). Nátiyjede, bul tiller Tyuring boyınsha tolıq bolmaydı hám olarda belgili bir funkciyalardı ańlatıw múmkin emes, biraq olar sheklenbegen rekursiya menen kirgizilgen mashqalalardan saqlanıp, qızıqlı esaplawlardıń keń bir klasın ańlata aladı. Bir neshe basqa sheklewleri bar jaqsı tiykarlanǵan rekursiya menen sheklengen funkcional programmalastırıw tolıq funkcional programmalastırıw dep ataladı[32].

Qatań hám qatań emes bahalaw

Funkcional tillerdi olar qatań (ashkóz) yamasa qatań emes (jalqaw) bahalawdı paydalanıwına qaray kategoriyalarǵa bóliwge boladı, bul túsinikler ańlatpa bahalanıp atırǵanda funkciya argumentleriniń qalay qayta isleniwine silteme beredi. Texnikalıq ayırmashılıq sátsiz yamasa uzaqlasıwshı esaplawları bar ańlatpalardıń denotaciyalıq semantikasında. Qatań bahalaw astında, sátsiz ishki ańlatpası bar hár qanday ańlatpanı bahalaw sátsiz boladı. Mısalı, Pythondaǵı

print(len([2 + 1, 3 * 2, 1 / 0, 5 - 4]))

operatorı qatań bahalawda dizimniń úshinshi elementindegi nolge bóliw sebepli sátsiz boladı. Jalqaw bahalawda uzınlıq funkciyası 4 mánisin qaytaradı (yaǵnıy dizimdegi elementler sanı), sebebi onı bahalaw dizimdi quraytuǵın elementlerdi bahalawǵa háreket etpeydi. Qısqasha aytqanda, qatań bahalaw funkciyanı shaqırıwdan aldın bárqulla funkciya argumentlerin tolıq bahalaydı. Jalqaw bahalaw funkciya shaqırıwınıń ózin bahalaw ushın mánisleri talap etilmese, funkciya argumentlerin bahalamaydı.

Funkcional tillerde jalqaw bahalawdıń ádettegi implementaciya strategiyası — bul graf redukciyası. Jalqaw bahalaw Miranda, Clean hám Haskell sıyaqlı bir neshe taza funkcional tillerde standart boyınsha qollanıladı.

Xyuz 1984 jalqaw bahalawdı máselelerdi ajıratıw arqalı programma modulliligin jaqsılaw mexanizmi retinde, maǵlıwmat aǵımlarınıń óndiriwshileri menen tutınıwshılarınıń ǵárezsiz implementaciyasın ańsatlastırıw arqalı qorǵaydı. Lonchberi 1993 jalqaw bahalawdıń payda etetuǵın ayırım qıyınshılıqların, ásirese programmanıń saqlaw talapların analizlewde, táriyipleydi hám bunday analizge járdem beriw ushın operaciyalıq semantikanı usınadı. Xarper 2009 bir tilde qatań hám jalqaw bahalawdıń ekewin de qosıwdı, olardı ayırıw ushın tildiń tip sistemasın paydalanıwdı usınadı[33].

Tip sistemaları

Ásirese 1970-jılları Xindli-Milner tip shıǵarıwı islep shıǵılǵannan berli, funkcional programmalastırıw tilleri tiplestirilgen lyambda esaplawın paydalanıwǵa beyim boldı, kompilyaciya waqtında barlıq jaramsız programmalardı biykar etip, jalǵan oń qátelerge táwekel etedi, bul Lisp hám onıń variantlarında (mısalı, Scheme) paydalanılatuǵın, kompilyaciya waqtında barlıq durıs programmalardı qabıl etip, jalǵan teris qátelerge táwekel etetuǵın tiplestirilmegen lyambda esaplawına qarama-qarsı, sebebi olar orınlanıw waqtında, informaciya durıs programmalardı biykar etpewge jetkilikli bolǵanda, barlıq jaramsız programmalardı biykar etedi. Algebralıq maǵlıwmat tiplerin paydalanıw quramalı maǵlıwmat strukturaların basqarıwdı qolaylı etedi; kúshli kompilyaciya waqtındaǵı tip tekseriwiniń bolıwı testke tiykarlanǵan islep shıǵıw sıyaqlı basqa isenimlilik usılları bolmaǵan jaǵdayda programmalardı isenimlirek etedi, al tip shıǵarıw baǵdarlamashını kóp jaǵdaylarda tiplerdi kompilyatorǵa qol menen járiyalaw mútájliginen azat etedi.

Rocq, Agda, Cayenne hám Epigram sıyaqlı ayırım izertlewge baǵdarlanǵan funkcional tiller intuicionistlik tip teoriyasına tiykarlanǵan, bul tiplerdiń termlerge ǵárezli bolıwına múmkinshilik beredi. Bunday tipler ǵárezli tipler dep ataladı. Bul tip sistemalarında sheshiletuǵın tip shıǵarıw joq hám olardı túsinip, programmalastırıw qıyın[34][35][36]. Biraq ǵárezli tipler joqarı tártipli logikada qálegen usınıslardı ańlata aladı. Karri-Govard izomorfizmi arqalı, bul tillerdegi durıs tiplestirilgen programmalar rásmiy matematikalıq dálillerdi jazıw quralına aylanadı, olardan kompilyator sertifikatlanǵan kod generaciyalay aladı. Bul tiller tiykarınan akademiyalıq izertlewlerde (sonıń ishinde formallastırılǵan matematikada da) qızıǵıwshılıq oyatsa da, olar injenerlikte de qollanıla basladı. Compcert — bul Rocq-ta jazılǵan hám rásmiy tekserilgen C tiliniń bir bólimi ushın kompilyator[37].

Ulıwmalastırılǵan algebralıq maǵlıwmat tipleri (GADT) dep atalatuǵın ǵárezli tiplerdiń sheklengen forması, ǵárezli tiplestirilgen programmalastırıwdıń kóp qolaysızlıqlarınan saqlanıp, onıń ayırım paydaların usınatuǵın usılda ámelge asırılıwı múmkin[38]. GADTlar Glasgow Haskell Compiler-de, OCaml-de[39] hám Scala-da[40] abar hám Java hám C# sıyaqlı basqa tillerge qosımshalar retinde usınılǵan.

Siltemelik anıqlıq

Funkcional programmalar menshiklew operatorlarına iye emes, yaǵnıy funkcional programmadagı ózgeriwshiniń mánisi anıqlanǵannan keyin hesh qashan ózgermeydi. Bul qosımsha tásirlerdiń hár qanday múmkinshiligin joq etedi, sebebi hár qanday ózgeriwshini orınlanıwdıń qálegen noqatında onıń haqıyqıy mánisi menen almastırıwǵa boladı. Solay etip, funkcional programmalar siltemelik jaqtan anıq bolıp tabıladı[41].

C tilindegi x = x * 10 menshiklew operatorın kórip shıǵayıq, bul x ózgeriwshisine berilgen mánisti ózgertedi. Meyli, x-tıń dáslepki mánisi 1 edi, onda x ózgeriwshisin izbe-iz eki ret bahalaw 10 hám 100 nátiyjelerin beredi. Anıǵı, x = x * 10-dı 10 yamasa 100 benen almastırıw programmaǵa basqasha mánis beredi, sonlıqtan ańlatpa siltemelik jaqtan anıq emes. Haqıyqatında, menshiklew operatorları hesh qashan siltemelik jaqtan anıq emes.

Endi, int plusOne(int x) { return x + 1; } sıyaqlı basqa bir funkciyanı kórip shıǵayıq, ol anıq, sebebi ol kirgiziw x-ti tikkeley ózgertpeydi hám sonlıqtan bunday qosımsha tásirleri joq. Funkcional programmalar tek usı túrdegi funkciyalardı qollanadı hám sol sebepli siltemelik jaqtan anıq bolıp tabıladı.

Maǵlıwmatlar strukturaları

Taza funkcional maǵlıwmatlar strukturaları kóbinese ózleriniń imperativ analoglarınan basqasha usılda kórsetiledi. Mısalı, turaqlı kiriw hám jańalaw waqtına iye massiv kóp imperativ tillerdiń tiykarǵı komponenti bolıp tabıladı hám xesh-keste hám binar úyindisi sıyaqlı kóp imperativ maǵlıwmatlar strukturaları massivlerge tiykarlanǵan. Massivlerdi taza funkcional implementaciyaǵa iye, biraq logarifmlik kiriw hám jańalaw waqtına iye bolǵan kartalar yamasa tosınnan kiriw dizimleri menen almastırıwǵa boladı. Taza funkcional maǵlıwmatlar strukturaları turaqlılıqqa iye, bul maǵlıwmatlar strukturasınıń aldınǵı versiyaların ózgertpey saqlaw qásiyeti. Clojure tilinde turaqlı maǵlıwmatlar strukturaları ózleriniń imperativ analoglarına funkcional alternativ retinde qollanıladı. Mısalı, turaqlı vektorlar bólek jańalaw ushın tereklerdi paydalanadı. Qosıw metodın shaqırıw barlıq túyinlerdiń emes, al ayırımlarınıń jaratılıwına alıp keledi[42].

Imperativ programmalastırıw menen salıstırıw

Funkcional programmalastırıw imperativ programmalastırıwdan aytarlıqtay ózgeshe. Eń áhmiyetli ayırmashılıqlar funkcional programmalastırıwdıń imperativ programmalastırıwda jaǵdaydı hám kirgiziw/shıǵarıwdı ámelge asırıw ushın qollanılatuǵın qosımsha tásirlerden saqlanıwınan kelip shıǵadı. Taza funkcional programmalastırıw qosımsha tásirlerdi tolıq boldırmaydı hám siltemelik anıqlıqtı támiyinleydi.

Joqarı tártipli funkciyalar eski imperativ programmalastırıwda siyrek qollanıladı. Dástúrli imperativ programma dizimdi aylanıp shıǵıw hám ózgertiw ushın cikldi paydalanıwı múmkin. Ekinshi tárepten, funkcional programma, itimal, funkciyanı hám dizimdi qabıl etip, funkciyanı hárbir dizim elementine qollanıw arqalı jańa dizim payda etetuǵın hám qaytaratuǵın joqarı tártipli «map» funkciyasın paydalanadı.

Imperativ hám funkcional programmalastırıw

Tómendegi eki mısal (Java tilinde jazılǵan) birdey nátiyjege erisedi: olar massivtegi barlıq jup sanlardı 10-ǵa kóbeytedi hám olardıń hámmesin qosadı, aqırǵı qosındını result ózgeriwshisinde saqlaydı.

Dástúrli imperativ cikl:

int[] numList = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int result = 0;
for (int i: numList) {
    if (i % 2 == 0) {
        result += i * 10;
    }
}

Joqarı tártipli funkciyalar menen funkcional programmalastırıw:

import java.util.Arrays;

int[] numList = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int result = Arrays.stream(numList)
    .filter(n -> n % 2 == 0)
    .map(n -> n * 10)
    .reduce(0, Integer::sum);

Geyde funkcional programmalastırıw usınǵan abstrakciyalar úlken kólemdegi quramalı, imperativ kodqa tiykarlanǵan jaǵdayda payda bolıwı múmkin bolǵan belgili bir máselelerden, mısalı, birden qátelesiw (Greenspun-nıń onınshı qaǵıydasın qarań) sıyaqlı máselelerden saqlanatuǵın isenimlirek kodtıń rawajlanıwına alıp keliwi múmkin.

Jaǵdaydı simulyaciyalaw

Geyde bank esabınıń balansın saqlaw sıyaqlı wazıypalar eń tábiyiy túrde jaǵday menen ámelge asırılatuǵınday kórinse de. Taza funkcional programmalastırıw bul wazıypalardı hám paydalanıwshı kirgiziwin qabıl etiw hám ekranǵa shıǵarıw sıyaqlı kirgiziw/shıǵarıw wazıypaların basqasha usılda orınlaydı.

Taza funkcional programmalastırıw tili Haskell olardı kategoriya teoriyasınan alınǵan monadlar arqalı ámelge asıradı. Monadlar belgili bir túrdegi esaplaw úlgilerin, sonıń ishinde (biraq olar menen sheklenbey) ózgermeli jaǵday menen esaplawlardı (hám kirgiziw/shıǵarıw sıyaqlı basqa qosımsha tásirlerdi) tazalıqtı saqlap qalǵan jaǵdayda imperativ usılda modellestiriw usılın usınadı. Bar monadlardı tiyisli shablonlar hám mısallar berilgen jaǵdayda programmada qollanıw ańsat bolıwı múmkin bolsa da, kóp studentler olardı konceptual túsinip alıwda qıynaladı, mısalı, jańa monadlardı anıqlaw soralǵanda (bul geyde belgili bir túrdegi kitapxanalar ushın kerek boladı)[43].

Funkcional tiller sonday-aq ózgermeytuǵın jaǵdaylardı aylanıp jiberiw arqalı da jaǵdaylardı simulyaciyalaydı. Bunı funkciyanıń jaǵdaydı óz parametrleriniń biri retinde qabıl etip, eski jaǵdaydı ózgertpey qaldırıp, nátiyje menen birge jańa jaǵdaydı qaytarıwı arqalı islewge boladı[44].

Taza emes funkcional tiller ádette ózgermeli jaǵdaydı basqarıwdıń tikkeleyirek usılın óz ishine aladı. Mısalı, Clojure házirgi jaǵdayǵa taza funkciyalardı qollanıw arqalı jańalanıwı múmkin bolǵan basqarılatuǵın siltemelerdi qollanadı. Bunday usıl taza funkciyalardı esaplawlardı ańlatıwdıń eń jaqsı usılı retinde xoshametlep turıp, ózgermelilikke múmkinshilik beredi.

Programmalardaǵı qosımsha tásirlerdi baqlaw ushın Xoar logikası hám unikalıq sıyaqlı alternativ usıllar islep shıǵılǵan. Ayırım zamanagóy izertlew tilleri qosımsha tásirlerdiń bar ekenligin anıq kórsetiw ushın tásir sistemaların qollanadı[45].

Ónimdarlıq máseleleri

Funkcional programmalastırıw tilleri ádette C hám Pascal sıyaqlı imperativ tillerge qaraǵanda CPU hám yadtı paydalanıwda kemirek ónimli boladı[46]. Bul massivler sıyaqlı ayırım ózgermeli maǵlıwmatlar strukturalarınıń házirgi apparatlıq támiynattı paydalanıp júdá ápiwayı implementaciyaǵa iye bolıwı menen baylanıslı. Tegis massivlerge tereń konveyerlengen OPUlar menen júdá ónimli kiriwge, keshler arqalı ónimli aldınnan júklewge (quramalı kórsetkish izlewlersiz) yamasa SIMD kórsetpeleri menen qayta islewge boladı. Olardıń teń dárejede ónimli ulıwma maqsetli ózgermeytuǵın analogların jaratıw da ańsat emes. Taza funkcional tiller ushın eń jaman jaǵdaydaǵı ástelew paydalanılǵan yad kletkalarınıń sanına logarifmlik boladı, sebebi ózgermeli yad logarifmlik kiriw waqtına iye taza funkcional maǵlıwmatlar strukturası (mısalı, teńlestirilgen terek) menen kórsetiliwi múmkin. Biraq, bunday ástelewler ulıwmalıq emes. Intensiv sanlı esaplawlardı orınlaytuǵın programmalar ushın OCaml hám Clean sıyaqlı funkcional tiller Kompyuter Tilleri Benchmarks Oyınına sáykes C-dan tek sál ǵana áste[47]. Úlken matricialar menen kóp ólshemli maǵlıwmatlar bazaların qayta isleytuǵın programmalar ushın massivli funkcional tiller (mısalı, J hám K) tezlikti optimallastırıw menen proektlestirilgen.

Maǵlıwmatlardıń ózgermewi kóp jaǵdaylarda kompilyatorǵa imperativ tilde qáwipsiz bolmaǵan boljawlar jasawǵa múmkinshilik beriw arqalı orınlanıw nátiyjeligine alıp keliwi múmkin, solay etip qatar ishindegi keńeytiw múmkinshiliklerin arttıradı[48]. Turaqlı ózgermeytuǵın maǵlıwmatlar strukturaları menen isleskende tikkeley emes kóriniske iye bolıwı múmkin bolǵan kóshiriw esaplaw jaǵınan qımbat bolıp kórinse de, Clojure sıyaqlı ayırım funkcional programmalastırıw tilleri rásmiy ózgermeytuǵın maǵlıwmatlar arasında qáwipsiz yad bólisiw mexanizmlerin ámelge asırıw arqalı bul máseleni sheshedi[49]. Rust ózgermeytuǵın siltemeler hám ómirler[50] dep atalatuǵın túsinikti óz ishine alǵan maǵlıwmatlardıń ózgermewine kózqarası menen ajıralıp turadı[51].

Sáykeslik hám jaǵdaydıń bóliniwi hám birge paydalanılmaytuǵın sxemaları bar ózgermeytuǵın maǵlıwmatlar da belgili bir parallel qáwiplerdiń qáwpin azaytıw yamasa joq etiw arqalı parallel programmalastırıw ushın kóbirek sáykes keliwi múmkin, sebebi parallel operaciyalar ádette atomar boladı hám bul qulıplarǵa bolǵan mútájlikti joq etiwge múmkinshilik beredi. Mısalı, java.util.concurrent klasları usılay ámelge asırılǵan, olardıń ayırımları parallel paydalanıwǵa sáykes kelmeytuǵın tiyisli klaslardıń ózgermeytuǵın variantları bolıp tabıladı[52]. Funkcional programmalastırıw tilleriniń kóbinese ortaq jaǵday hám sinxronizaciya ornına xabar jiberiw mexanizmlerin (mısalı, hárbir aktyor jaǵday, minez-qulıq, balalıq aktyorlar hám xabarlar gezegi ushın konteyner bolǵan aktyor modeli) paydalanatuǵın parallel modeli bar[53]. Bul usıl Erlang/Elixir yamasa Akka da keń tarqalǵan.

Jalqaw bahalaw programmanı asimptotikalıq túrde de tezletiw múmkin, al eń kóp degende onı turaqlı faktorǵa ásteletiw múmkin (biraq, nadurıs paydalanılsa, yad aǵıwlarına alıp keliwi múmkin). Lonchberi 1993 jalqaw bahalawdan kelip shıǵatuǵın yad aǵıwı menen baylanıslı teoriyalıq máselelerdi talqılaydı, al O'Sallivan hám basqalar 2008[54] olardı analizlew hám dúzetiw ushın ayırım ámeliy keńesler beredi. Biraq, siltemesizlendirilgen kod hám maǵlıwmatlardı keńnen paydalanatuǵın jalqaw bahalawdıń eń ulıwma implementaciyaları tereń konveyerli hám kóp dárejeli keshli zamanagóy processorlarda tómen ónimdarlıq kórsetedi (bul jerde keshte qátelik júzlegen ciklge teń bolıwı múmkin).

Abstrakciya bahası

Ayırım funkcional programmalastırıw tilleri «map» yamasa «filter» sıyaqlı joqarı dárejeli funkciyalar sıyaqlı abstrakciyalardı tiykarǵı imperativ operaciyalar sıyaqlı nátiyjeli optimallastırmawı múmkin. Mısal retinde, Clojure tilinde 5 sanınıń jup ekenligin tekseriwdiń tómendegi eki usılın qarap shıǵayıq:

(even? 5)
(.equals (mod 5 2) 0)

Leiningen REPL 2.11.2, Java VM 22 versiyasında hám Clojure 1.11.1 versiyasında islep turǵan Ryzen 7900X GNU/Linux kompyuterinde Criterium quralı menen benchmark etilgende, tómendegishe ámelge asırılǵan birinshi implementaciyanıń:

(defn even?
  "Returns true if n is even, throws an exception if n is not an integer"
  {:added "1.0"
   :static true}
   [n] (if (integer? n)
        (zero? (bit-and (clojure.lang.RT/uncheckedLongCast n) 1))
        (throw (IllegalArgumentException. (str "Argument must be an integer: " n)))))

ortasha orınlanıw waqtı 4.76 ms, al .equals tiykarındaǵı Java metodınıń tikkeley shaqırıwı bolǵan ekinshi implementaciyanıń ortasha orınlanıw waqtı 2.8 μs – shama menen 1700 ese tezirek. Bunıń bir bólegi even? implementaciyasındaǵı tip tekseriw hám qátelerdi qayta islewge baylanıslı bolıwı múmkin. Mısalı, Go ushın lo kitapxanası funkcional programmalastırıw tillerinde keń tarqalǵan hár túrli joqarı dárejeli funkciyalardı djenerikler arqalı ámelge asıradı. Kitapxana avtorı tárepinen usınılǵan benchmarkta, map-tı shaqırıw ekvivalent for ciklınan 4% ásterek hám birdey bóliniw profiline iye,[55] bunı qatar ishindegi keńeytiw sıyaqlı hár túrli kompilyator optimallastırıwları menen túsindiriwge boladı[56].

Rust-tıń bir ayrıqsha ózgesheligi – nol bahalı abstrakciyalar. Bul olardı paydalanıw qosımsha orınlanıw waqtındaǵı shıǵınlarǵa alıp kelmeytuǵının ańlatadı. Buǵan kompilyatordıń cikl ashıwın paydalanıwı arqalı erisiledi, bunda cikldiń hárbir iteraciyası, ol imperativ bolsın yamasa iteratorlar arqalı bolsın, cikldi basqarıwshı kodtıń artıqsha shıǵınısız, bólek Assembler kórsetpesine aylandırıladı. Eger iterativ operaciya massivke jazsa, nátiyjedegi massivtiń elementleri belgili bir OPU registrlerinde saqlanadı, bul orınlanıw waqtında turaqlı waqıtta kiriwge múmkinshilik beredi[57].

Funkcional emes tillerde funkcional programmalastırıw

Dástúrli túrde funkcional emes dep esaplanatuǵın tillerde de funkcional programmalastırıw stilin qollanıw múmkin[58]. Mısalı, D[59] hám Fortran 95[60] tilleriniń ekewi de taza funkciyalardı anıq qollap-quwatlaydı.

JavaScript, Lua,[61] Python hám Go[62] tillerinde birinshi dárejeli funkciyalar olardıń payda bolǵanınan baslap bar[63]. Python 1994-jılı «lambda», «map», «reduce» hám «filter»-di, sonday-aq Python 2.2-de jabılıwlardı qollap-quwatlaǵan,[64] biraq Python 3 «reduce»-ti functools standart kitapxana modulına ótkizgen[65]. Birinshi dárejeli funkciyalar Perl 5.0 (1994), PHP 5.3, Visual Basic 9, C# 3.0, C++11 hám Kotlin sıyaqlı basqa da tiykarǵı tillerge kirgizilgen.

Perl tilinde lambda, map, reduce, filter hám jabılıwlar tolıq qollap-quwatlanadı hám jiyi qollanıladı. 2005-jılı shıǵarılǵan Higher-Order Perl kitabı Perl-di funkcional programmalastırıw ushın paydalanıw boyınsha keń kólemli qollanba usınıw ushın jazılǵan.

PHP-de anonim klaslar, jabılıwlar hám lambdalar tolıq qollap-quwatlanadı. Funkcional stilde programmalastırıwǵa járdem beriw ushın ózgermeytuǵın maǵlıwmatlar strukturaları ushın kitapxanalar hám til keńeytpeleri islep shıǵarılmaqta.

Java tilinde anonim klaslar geyde jabılıwlardı simulyaciyalaw ushın paydalanılıwı múmkin;[66] biraq, anonim klaslar bárqulla jabılıwlardıń durıs almastırıwshısı emes, sebebi olardıń múmkinshilikleri sheklengen[67]. Java 8 ayırım anonim klaslardı almastırıw ushın lambda ańlatpaların qollap-quwatlaydı[68].

C# tilinde anonim klaslar kerek emes, sebebi jabılıwlar hám lambdalar tolıq qollap-quwatlanadı. C#-ta funkcional stilde programmalastırıwǵa járdem beriw ushın ózgermeytuǵın maǵlıwmatlar strukturaları ushın kitapxanalar hám til keńeytpeleri islep shıǵarılmaqta.

Kóplegen obyektke baǵdarlanǵan proektlestiriw úlgileri funkcional programmalastırıw terminleri menen ańlatılıwı múmkin: mısalı, strategiya úlgisi ápiwayı ǵana joqarı dárejeli funkciyanı paydalanıwdı talap etedi, al vizitor shablonı shama menen katamorfizmge yamasa búgiwge sáykes keledi.

Sol sıyaqlı, funkcional programmalastırıwdan alınǵan ózgermeytuǵın maǵlıwmatlar ideyası imperativ programmalastırıw tillerine de kóbinese kirgiziledi,[69] mısalı, Pythondaǵı ózgermeytuǵın massiv bolǵan tuple hám JavaScripttegi Object.freeze()[70].

Logikalıq programmalastırıw menen salıstırıw

Logikalıq programmalastırıwdı funkcional programmalastırıwdıń ulıwmalastırılǵan forması retinde qarawǵa boladı, onda funkciyalar qatnaslardıń arnawlı bir jaǵdayı bolıp tabıladı[71].

Mısalı, mother(X) = Y funkciyası (hárbir X-tiń tek bir ǵana anası Y bar) mother(X, Y) qatnası arqalı kórsetiliwi múmkin. Funkciyalardıń qatań kirgiziw-shıǵarıw argumentler úlgisi bar bolsa, qatnaslar qálegen kirgiziw hám shıǵarıw úlgisi menen soralıwı múmkin. Tómendegi logikalıq programmanı qarap shıǵayıq:

mother(charles, elizabeth).
mother(harry, diana).

Programmanı, funkcional programma sıyaqlı, balalardan analardı generaciyalaw ushın sorawǵa boladı:

?- mother(harry, X).
X = diana.
?- mother(charles, X).
X = elizabeth.

Biraq onı balalardı generaciyalaw ushın keri sorawǵa da boladı:

?- mother(X, elizabeth).
X = charles.
?- mother(X, diana).
X = harry.

Onı hátte ana qatnasınıń barlıq jaǵdayların generaciyalaw ushın da paydalanıwǵa boladı:

?- mother(X, Y).
X = charles,
Y = elizabeth.
X = harry,
Y = diana.

Qatnas sintaksisine salıstırǵanda, funkcional sintaksis ishki funkciyalar ushın qolaylıraq belgileniw bolıp tabıladı. Mısalı, funkcional sintaksistegi ana tárepten ájeniń anıqlamasın ishki formada jazıwǵa boladı:

maternal_grandmother(X) = mother(mother(X)).

Qatnas belgilewindegi sol anıqlamanı ishki emes formada jazıw kerek:

maternal_grandmother(X, Y) :- mother(X, Z), mother(Z, Y).

Bul jerde :- eger degen mánisti bildiredi, al , hám degen mánisti bildiredi. Biraq, eki kórsetiw arasındaǵı ayırmashılıq tek ǵana sintaksislik. Ciao Prolog-ta, funkcional programmalastırıwdaǵı funkciyalar sıyaqlı, qatnaslardı ishki jaylastırıwǵa boladı:

grandparent(X) := parent(parent(X)).
parent(X) := mother(X).
parent(X) := father(X).

mother(charles) := elizabeth.
father(charles) := phillip.
mother(harry) := diana.
father(harry) := charles.

?- grandparent(X,Y).
X = harry,
Y = elizabeth.
X = harry,
Y = phillip.

Ciao funkciyaǵa uqsas belgilewdi qatnas formasına aylandıradı hám nátiyjedegi logikalıq programmanı standart Prolog orınlanıw strategiyasın paydalanıp orınlaydı.

Qollanılıwı

Tekst redaktorları

Emacs, júdá keńeytiletuǵın tekst redaktorları shańaraǵı, plaginler jazıw ushın óziniń Lisp dialektin paydalanadı. Eń ataqlı Emacs implementaciyası GNU Emacs hám Emacs Lisp-tiń dáslepki avtorı Richard Stallman Lispti óziniń eń súyikli programmalastırıw tilleriniń biri dep esaplaydı[72].

Helix, 24.03 versiyasınan baslap AST-ni S-ańlatpaları retinde aldınnan kóriwdi qollap-quwatlaydı, olar sonday-aq Lisp programmalastırıw tilleri shańaraǵınıń tiykarǵı ózgesheligi bolıp tabıladı[73].

Elektron kesteler

Elektron kestelerdi taza, nolinshi dárejeli, qatań bahalanatuǵın funkcional programmalastırıw sistemasınıń bir forması retinde qarawǵa boladı[74]. Biraq, elektron kestelerde ádette joqarı tártipli funkciyalar hám de kodtı qayta paydalanıw jetispeydi, al ayırım implementaciyalarda rekursiya da joq. Elektron keste programmaları ushın joqarı tártipli hám qayta paydalanılatuǵın funkciyalardı qosıwǵa múmkinshilik beretuǵın bir neshe keńeytpeler islep shıǵılǵan, biraq házirshe olar tiykarınan akademiyalıq xarakterge iye bolıp qalmaqta[75].

Mikroservisler

Kompoziciyalıq qásiyeti sebepli, funkcional programmalastırıw paradigmaları mikroservislerge tiykarlanǵan arxitekturalar ushın sáykes keliwi múmkin[76].

Akademiya

Funkcional programmalastırıw programmalastırıw tilleri teoriyası tarawında aktiv izertlew tarawı bolıp tabıladı. Funkcional programmalastırıwǵa arnalǵan bir neshe recenziyalanatuǵın baspalar bar, sonıń ishinde Xalıqaralıq Funkcional Programmalastırıw Konferenciyası (International Conference on Functional Programming), Funkcional Programmalastırıw Jurnalı (Journal of Functional Programming) hám Funkcional Programmalastırıwdaǵı Tendenciyalar Simpoziumı (Symposium on Trends in Functional Programming).

Sanaat

Funkcional programmalastırıw keń kólemli sanaat qollanıwlarında paydalanılǵan. Mısalı, 1980-jıllardıń aqırında Shveciyanıń Ericsson kompaniyası tárepinen islep shıǵılǵan Erlang, dáslep qátege shıdamlı telekommunikaciya sistemaların ámelge asırıw ushın qollanılǵan, biraq sonnan berli Nortel, Facebook, Électricité de France hám WhatsApp sıyaqlı kompaniyalarda hár túrli qosımshalar dúziw ushın ataqlı bolıp ketti. Lisptiń bir dialekti bolǵan Scheme, dáslepki Apple Macintosh kompyuterlerindegi bir neshe qosımshalardıń tiykarı retinde qollanılǵan hám oqıw-simulyaciya programmalıq támiynatı hám teleskoptı basqarıw sıyaqlı máselelerge qollanılǵan. 1990-jıllardıń ortasında usınılǵan OCaml, finanslıq analiz, drayverlerdi tekseriw, sanaat robotların programmalastırıw hám ornatılǵan programmalıq támiynattı statikalıq analizlew sıyaqlı tarawlarda kommerciyalıq qollanıwǵa iye boldı. Haskell, dáslep izertlew tili retinde jobalastırılǵan bolsa da, aerokosmoslıq sistemalar, apparatlıq támiynattı proektlestiriw hám veb-programmalastırıw sıyaqlı tarawlarda da qollanılǵan.

Sanaatta qollanılǵan basqa funkcional programmalastırıw tillerine Scala, F#, Wolfram Language, Lisp,[77] Standard ML hám Clojure[78] kiredi. Scala maǵlıwmatlar iliminde keńnen qollanılǵan, al ClojureScript,[79] Elm[80] yamasa PureScript[81] islep shıǵarıwda qollanılatuǵın ayırım funkcional frontend programmalastırıw tilleri bolıp tabıladı. Elixir-diń Phoenix freymvorkı sonday-aq Font Awesome yamasa Allegro (Polshadaǵı eń úlken elektron kommerciya platformalarınıń biri)[82]-nıń járiyalaw platforması Allegro Lokalnie[83] sıyaqlı ayırım salıstırmalı túrde ataqlı kommerciyalıq proektlerde de qollanıladı.

Funkcional «platformalar» finansta risk analizi ushın (ásirese úlken investiciyalıq banklerde) ataqlı bolǵan. Risk faktorları bazar ózgerislerindegi korrelyaciyalardı ólshew ushın bir-birine ǵárezli graflar (kategoriyalar) dúzetuǵın funkciyalar retinde kodlanadı, bul usılı boyınsha Gryobner bazası optimallastırıwlarına uqsas, biraq sonday-aq Keń kólemli Kapital Analizi hám Sholıw sıyaqlı tártipke salıwshı sheńberler ushın da qollanıladı. Finansta OCaml hám Caml variaciyalarınıń qollanılıwın esapqa alǵanda, bul sistemalar geyde kategoriyalıq abstrakt mashinaǵa baylanıslı dep esaplanadı. Funkcional programmalastırıw kategoriyalar teoriyasınıń kúshli tásirinde bolǵan.

Bilimlendiriw

Kóplegen universiteler funkcional programmalastırıwdı oqıtadı[84][85][86]. Ayırımları onı kirisiw programmalastırıw túsinigi retinde qarasa,[87] basqaları dáslep imperativ programmalastırıw usılların oqıtadı[88].

Kompyuter iliminen tıs, funkcional programmalastırıw máselelerdi sheshiw, algebralıq hám geometriyalıq túsiniklerdi úyretiw ushın qollanıladı. Ol sonday-aq «Klassikalıq Mexanikanıń Strukturası hám Interpretaciyası» kitabındaǵı sıyaqlı, klassikalıq mexanikanı úyretiw ushın da qollanılǵan.

Ásirese, Scheme jıllar dawamında programmalastırıwdı oqıtıw ushın salıstırmalı túrde ataqlı tańlaw bolıp kelgen[89][90].

Derekler

  1. Hudak, Paul. Conception, evolution, and application of functional programming languages. http://www.dbnet.ece.ntua.gr/~adamo/languages/books/p359-hudak.pdf. 
  2. Hughes. «Why Functional Programming Matters» (1984).
  3. «Wolfram Language Guide: Functional Programming» (2015). Qaraldı: 24-avgust 2015-jıl.
  4. «The Elixir Programming Language». Qaraldı: 14-fevral 2021-jıl.
  5. Banz. «An introduction to functional programming in JavaScript» (en). Opensource.com (27-iyun 2017-jıl). Qaraldı: 9-yanvar 2021-jıl.
  6. Functional Programming with C# - Simon Painter - NDC Oslo 2020 (Англичанша), 8 August 2021, 2021-10-30da túp nusqadan arxivlendi, qaraldı: 2021-10-23
  7. «Functional programming - Kotlin Programming Language». Kotlin. Qaraldı: 1-may 2019-jıl.
  8. The Cain Gang Ltd. «Python Metaclasses: Who? Why? When?». 30-may 2009-jılda túp nusqadan arxivlendi. Qaraldı: 27-iyun 2009-jıl.
  9. «GopherCon 2020: Dylan Meeus - Functional Programming with Go». YouTube (22-dekabr 2020-jıl).
  10. «Functional Language Features: Iterators and Closures - The Rust Programming Language». doc.rust-lang.org. Qaraldı: 9-yanvar 2021-jıl.
  11. Vanderbauwhede. «Cleaner code with functional programming» (18-iyul 2020-jıl). 28-iyul 2020-jılda túp nusqadan arxivlendi. Qaraldı: 6-oktyabr 2020-jıl.
  12. Turing (1937). Computability and λ-definability. Cambridge University Press. 
  13. ; Robert FeysCombinatory Logic. North-Holland Publishing Company, 1958. 
  14. Church, A. (1940). "A Formulation of the Simple Theory of Types". Journal of Symbolic Logic 5 (2): 56–68. doi:10.2307/2266170. 
  15. McCarthy, John „History of LISP“,. The first ACM SIGPLAN conference on History of programming languages - HOPL-1, June 1978 — 173–185 bet. DOI:10.1145/800025.808387. 
  16. John McCarthy. Recursive functions of symbolic expressions and their computation by machine, Part I.. pp. 184–195. doi:10.1145/367177.367199. http://jmc.stanford.edu/articles/recursive/recursive.pdf. 
  17. Guy L. Steele „The evolution of Lisp“,. History of programming languages---II, February 1996 — 233–330 bet. DOI:10.1145/234286.1057818. 
  18. Landin, Peter J. (1964). "The mechanical evaluation of expressions". The Computer Journal (British Computer Society) 6 (4): 308–320. doi:10.1093/comjnl/6.4.308. 
  19. Diehl, Stephan. Future Generation Computer Systems — 739–751 bet. 
  20. Landin, Peter J.. "Correspondence between ALGOL 60 and Church's Lambda-notation: part I". Communications of the ACM (Association for Computing Machinery) 8 (2): 89–101. doi:10.1145/363744.363749. 
  21. Landin, Peter J.. "A correspondence between ALGOL 60 and Church's Lambda-notation: part II". Communications of the ACM (Association for Computing Machinery) 8 (3): 158–165. doi:10.1145/363791.363804. 
  22. Landin, Peter J.. "The next 700 programming languages". Communications of the ACM (Association for Computing Machinery) 9 (3): 157–166. doi:10.1145/365230.365257. 
  23. Can programming be liberated from the von Neumann style?: A functional style and its algebra of programs. 1978. 
  24. «Make discovering assign() easier!». OpenSCAD. 19-aprel 2023-jılda túp nusqadan arxivlendi.
  25. Peter Bright. «Developers love trendy new languages but earn more with functional programming». Ars Technica (13-mart 2018-jıl).
  26. John Leonard. «The stealthy rise of functional programming». Computing (24-yanvar 2017-jıl).
  27. Leo Cheung (May 9, 2017). „Is functional programming better for your startup?“. InfoWorld.
  28. Pountain. «Functional Programming Comes of Age». Byte (August 1994). 27-avgust 2006-jılda túp nusqadan arxivlendi. Qaraldı: 31-avgust 2006-jıl.
  29. «Revised^6 Report on the Algorithmic Language Scheme». R6rs.org. Qaraldı: 21-mart 2013-jıl.
  30. «Revised^6 Report on the Algorithmic Language Scheme - Rationale». R6rs.org. Qaraldı: 21-mart 2013-jıl.
  31. Baker. «CONS Should Not CONS Its Arguments, Part II: Cheney on the M.T.A.» (1994). 3-mart 2006-jılda túp nusqadan arxivlendi. Qaraldı: 29-aprel 2020-jıl.
  32. Total Functional Programming. http://www.jucs.org/jucs_10_7/total_functional_programming. 
  33. Practical Foundations for Programming Languages, 2009. 
  34. Huet. The Undecidability of Unification in Third Order Logic. 
  35. Proceedings, 15th International Conference TPHOL. Springer. 
  36. Wells (1993). Typability and type checking in the second-order lambda-calculus are equivalent and undecidable. 
  37. Leroy. «The Compcert verified compiler» (17-sentyabr 2018-jıl).
  38. Peyton Jones, Simon. Simple unification-based type inference for GADTs. http://research.microsoft.com/en-us/um/people/simonpj/papers/gadt/. 
  39. «OCaml Manual». caml.inria.fr. Qaraldı: 8-mart 2021-jıl.
  40. «Algebraic Data Types». Scala Documentation. Qaraldı: 8-mart 2021-jıl.
  41. Hughes. «Why Functional Programming Matters». Chalmers University of Technology.
  42. L’orange. «polymatheia - Understanding Clojure's Persistent Vector, pt. 1». Polymatheia. Qaraldı: 13-noyabr 2018-jıl.
  43. Newbern. «All About Monads: A comprehensive guide to the theory and practice of monadic programming in Haskell». Qaraldı: 14-fevral 2008-jıl.
  44. «Thirteen ways of looking at a turtle» (en). fF# for fun and profit. Qaraldı: 13-noyabr 2018-jıl.
  45. Hartmanis, Juris „Complexity classes without machines: On complete languages for UP“,. Automata, Languages and Programming, 1986 — 123–135 bet. DOI:10.1007/3-540-16761-7_62. 
  46. Paulson, Larry C.. ML for the Working Programmer. 
  47. «Which programs are fastest? | Computer Language Benchmarks Game». benchmarksgame.alioth.debian.org. 20-may 2013-jılda túp nusqadan arxivlendi. Qaraldı: 20-iyun 2011-jıl.
  48. Immutability specification and its applications. 
  49. «An In-Depth Look at Clojure Collections» (en). InfoQ. Qaraldı: 29-aprel 2024-jıl.
  50. «References and Borrowing - The Rust Programming Language». doc.rust-lang.org. Qaraldı: 29-aprel 2024-jıl.
  51. «Validating References with Lifetimes - The Rust Programming Language». doc.rust-lang.org. Qaraldı: 29-aprel 2024-jıl.
  52. «Concurrent Collections (The Java™ Tutorials > Essential Java Classes > Concurrency)». docs.oracle.com. Qaraldı: 29-aprel 2024-jıl.
  53. «Understanding The Actor Model To Build Non-blocking, High-throughput Distributed Systems - Scaleyourapp» (en-US). scaleyourapp.com (28-yanvar 2023-jıl). Qaraldı: 29-aprel 2024-jıl.
  54. «Chapter 25. Profiling and optimization». Book.realworldhaskell.org. Qaraldı: 20-iyun 2011-jıl.
  55. Berthe, Samuel (2024-04-29), samber/lo, qaraldı: 2024-04-29
  56. «Go Wiki: Compiler And Runtime Optimizations - The Go Programming Language» (en). go.dev. Qaraldı: 29-aprel 2024-jıl.
  57. «Comparing Performance: Loops vs. Iterators - The Rust Programming Language». doc.rust-lang.org. Qaraldı: 29-aprel 2024-jıl.
  58. Hartel, Pieter. The Functional C experience. http://www.ub.utwente.nl/webdocs/ctit/1/00000084.pdf. ; David Mertz. «Functional programming in Python, Part 3». IBM developerWorks. 16-oktyabr 2007-jılda túp nusqadan arxivlendi. Qaraldı: 17-sentyabr 2006-jıl. (Part 1, Part 2)
  59. «Functions — D Programming Language 2.0». Digital Mars (30-dekabr 2012-jıl).
  60. «ISO/IEC JTC 1/SC 22/WG5/N2137 – Fortran 2015 Committee Draft (J3/17-007r2)» 336–338. International Organization for Standardization (6-iyul 2017-jıl).
  61. «Lua Unofficial FAQ (uFAQ)».
  62. «First-Class Functions in Go - The Go Programming Language». golang.org. Qaraldı: 4-yanvar 2021-jıl.
  63. Eich. «Popularity» (3-aprel 2008-jıl).
  64. van Rossum. «Origins of Python's "Functional" Features» (21-aprel 2009-jıl). Qaraldı: 27-sentyabr 2012-jıl.
  65. «functools — Higher order functions and operations on callable objects». Python Software Foundation (31-iyul 2011-jıl). Qaraldı: 31-iyul 2011-jıl.
  66. Skarsaune, Martin. The SICS Java Port Project Automatic Translation of a Large Object Oriented System from Smalltalk to Java. 
  67. Gosling. «Closures». James Gosling: on the Java Road. Oracle. 14-aprel 2013-jılda túp nusqadan arxivlendi. Qaraldı: 11-may 2013-jıl.
  68. Williams. «Java SE 8 Lambda Quick Start» (8-aprel 2013-jıl).
  69. Effective Java. Addison-Wesley. 
  70. «Object.freeze() - JavaScript | MDN». developer.mozilla.org. — „The Object.freeze() method freezes an object. A frozen object can no longer be changed; freezing an object prevents new properties from being added to it, existing properties from being removed, prevents changing the enumerability, configurability, or writability of existing properties, and prevents the values of existing properties from being changed. In addition, freezing an object also prevents its prototype from being changed. freeze() returns the same object that was passed in.“. Qaraldı: 4-yanvar 2021-jıl.
  71. Daniel Friedman. The Reasoned Schemer, Second Edition. 
  72. «How I do my Computing». stallman.org. Qaraldı: 29-aprel 2024-jıl.
  73. «Helix». helix-editor.com. Qaraldı: 29-aprel 2024-jıl.
  74. Wakeling, David (2007). "Spreadsheet functional programming". Journal of Functional Programming 17 (1): 131–143. doi:10.1017/S0956796806006186. 
  75. Peyton Jones. «Improving the world's most popular functional language: user-defined functions in Excel» (mart 2003). 16-oktyabr 2005-jılda túp nusqadan arxivlendi.
  76. Rodger, Richard. The Tao of Microservices. 
  77. Graham. «Beating the Averages» (2003). Qaraldı: 29-avgust 2009-jıl.
  78. Lorimer. «Live Production Clojure Application Announced». InfoQ (19-yanvar 2009-jıl).
  79. «Why developers like ClojureScript» (en). StackShare. Qaraldı: 29-aprel 2024-jıl.
  80. Herrick, Justin (2024-04-29), jah2488/elm-companies, qaraldı: 2024-04-29
  81. «Why developers like PureScript» (en). StackShare. Qaraldı: 29-aprel 2024-jıl.
  82. Team. «ALLEGRO - all you need to know about the best Polish online marketplace» (en-US). E-commerce Germany News (8-yanvar 2019-jıl). Qaraldı: 29-aprel 2024-jıl.
  83. «Websites using Phoenix Framework - Wappalyzer». www.wappalyzer.com. Qaraldı: 29-aprel 2024-jıl.
  84. «Functional Programming: 2019-2020». University of Oxford Department of Computer Science. Qaraldı: 28-aprel 2020-jıl.
  85. «Programming I (Haskell)». Imperial College London Department of Computing. Qaraldı: 28-aprel 2020-jıl.
  86. «Computer Science BSc - Modules». Qaraldı: 28-aprel 2020-jıl.
  87. {{{title}}}. 
  88. John DeNero. «Computer Science 61A, Berkeley». Department of Electrical Engineering and Computer Sciences, Berkeley (fall 2019). Qaraldı: 14-avgust 2020-jıl.
  89. «Why Scheme for Introductory Programming?». home.adelphi.edu. Qaraldı: 29-aprel 2024-jıl.
  90. Staff. «What Is Scheme & Why Is it Beneficial for Students?» (en-US). IMACS – Making Better Thinkers for Life (3-iyun 2011-jıl). Qaraldı: 29-aprel 2024-jıl.