Programavimo paradigmos - tai organizavimo, mąstymo ir sintaksės modeliai, pagal kuriuos rašomos programos ir kurių pagalba skirtingos programavimo kalbos apibrėžia, ką ir kaip leidžiama išreikšti programoje. Paradigma nusako, ar akcentuojamas žingsnių seka (kaip vyksta), ar apibūdinimas (kas turi būti pasiektą), kaip tvarkoma būsena, kaip sudaromi programos komponentai ir kaip tie komponentai bendrauja. Kalbos dažnai palaiko kelias paradigmas (vadinamos daugparadigmės kalbos), todėl programavimo stilius priklauso tiek nuo kalbos galimybių, tiek nuo programuotojo pasirinkimų.
Kai kuriose paradigmose atsižvelgiama į kodo vykdymo būdą — pavyzdžiui, ar leidžiami šalutiniai efektai, ar veiksmai turi būti atliekami tam tikra tvarka. Kitose paradigmose svarbu, kaip kodas struktūruojamas — ar jis suskirstytas į dideles monolitines dalis, ar į daug mažų dalių). Taip pat paradigmos nagrinėja, kuri dalis programos lemia jos elgesį, ir kokiu mastu tvarka ar duomenų struktūra yra pagrindinis dėmesio objektas (tvarka ir dalis).
Dažniausiai skiriamos dvi plačios paradigmų grupės: imperatyvioji ir deklaratyvioji. Tuo pat metu daug praktinių kalbų palaiko elementus iš abiejų grupių — tokios kalbos yra vadinamos daugparadigmėmis (pvz., Python, JavaScript, C++ ar Scala).
Turinys
1 Imperatyvus programavimas
2 Deklaratyvinis programavimas
3 Kitos paradigmos
4 Apžvalga
5 Paradigmų problemos
6 Istorija
6.1 Mašininis kodas
6.2 Procedūrinės kalbos
6.3 Objektinis programavimas
6.4 Deklaratyvinės paradigmos
7 Susiję puslapiai
8 Nuorodos
9 Kitos svetainės
Imperatyvusis programavimas
Imperatyviojoje paradigmoje programuotojas nurodo konkrečius žingsnius — komandų seką, kurią turi atlikti kompiuteris, kad pasiektų pageidaujamą rezultatą. Tai primena tradicinį algoritminį mąstymą: aprašote veiksmus, duomenų pakeitimus ir kontrolės srautus (ciklus, sąlygas). Imperatyvios programos dažnai dirba su kintamaisiais ir turi šalutinių poveikių (pvz., rašo į failą ar keičia globalią būseną).
Paprastas imperatyvaus požiūrio pavyzdys (žodžiais): "inicijuok skaitiklį nuliui, kol skaitiklis mažesnis už 10 - pridėk 1, atspausdink skaitiklį". Tokie žingsniai nurodo ne tik galutinį tikslą, bet ir konkrečią vykdymo tvarką.
Imperatyviojo programavimo porūšiai:
- Struktūrinis – kodas organizuojamas aiškiomis struktūromis (blokais, funkcijomis), kontrolės šuoliai kaip goto" teiginiai) dažnai nenaudojami, siekiant pagerinti skaitomumą ir patikimumą. Struktūrinis stilius pabrėžia aiškų srautą be nevaldomų peršokimų.
- Procedūrinis – leidžia suskirstyti darbą į procedūras arba funkcijas, kurioms suteikiami pavadinimai ir kurie iškviečiami keliose vietose. Tai skatina pakartotinį naudojimą ir modulį. Dauguma struktūrinių kalbų taip pat turi procedūrinius bruožus.
- Objektinis – nors dažnai priskiriamas atskirai, objektinis stilius iš esmės lieka imperatyvus, jei objektai turi vidinę būseną ir metodus, kurie ją keičia. Idėjos perteikiamos naudojant objektus — vienetus, kurie saugo duomenis ir elgseną, taikant principus kaip enkapsuliacija, paveldimumas ir polimorfizmas.
Imperatyvios paradigmos privalumai: lengviau susieti su aparatūros modeliu, aiškus vykdymo srautas, dažnai geresnė našumo kontrolė. Trūkumai: valstybiškumas ir šalutiniai efektai gali apsunkinti testavimą, supratimą ir lygiagretinimą.
Deklaratyvinis programavimas
Deklaratyviojoje paradigmoje programuotojas apibrėžia, ką reikia pasiekti, o ne kaip tai padaryti. Sistemos arba vykdymo aplinka (pvz., kalbos vykdymo modelis arba užklausų vykdytojas) sprendžia optimalų būdą užduočiai įvykdyti. Tai leidžia labiau sutelkti dėmesį į logiką ir reikalavimus, o ne į vykdymo žingsnius.
Žodinis pavyzdys: "nupiešk veidą su dviem akimis, dviem ausimis ir burna" — nenurodoma, kuriais žingsniais tai turi būti padaryta.
Geriausiai žinomos deklaratyvinės paradigmos:
- Funkcinis – pagrindinis vienetas yra funkcija; funkcijos paprastai yra be šalutinių poveikių (gryni funkcionalai) ir remiasi nekeičiama būsena bei rekursija vietoje ciklų. Funkcinis stilius gerai tinka lygiagrečiam programavimui ir formaliam reasoning (pvz., Haskell ar dalinai Lisp).
- Logikos – aprašomos taisyklės ir faktai, o sistema (pvz., Prolog) sprendžia užklausas ieškodama atitinkančių kombinacijų; programuotojas deklaruoja žinias, o ne procedūras, kaip jas panaudoti.
- Įvykiais valdomas – apibrėžiami reakcijų į įvykius rinkiniai (pvz., vartotojo paspaudimai, sistemos signalai); dažnai naudojamas grafinėse sąsajose ir serverių programose. Deklaratyvumas čia reiškia, kad aprašoma, kas turi įvykti įvykus tam tikram signalui.
- Užklausų / deklaratyvios duomenų kalbos – pvz., SQL, kur nurodoma, kokie duomenys reikalingi, o ne kaip juos surasti.
Deklaratyvios paradigmos privalumai: lengviau mąstyti aukštu lygiu, dažnai trumpesnis ir aiškesnis kodas, lengviau formaliai analizuoti. Trūkumai: mažesnė kontrolė dėl vykdymo optimizavimo, kai kuriais atvejais gali būti sudėtingiau suprasti vykdymo laiką ir atminties poreikius.
Kitos paradigmos
Be aukščiau paminėtų, egzistuoja daug kitų paradigmos aspektų ir specializuotų stilių. Dauguma jų gali būti taikomi tiek imperatyviose, tiek deklaratyviose kalbose ir dažnai derinami:
- Reaktyvus / srautinio duomenų apdorojimo (reactive programming) – programos modeliuoja duomenų srautus ir propagaciją, reaguoja automatiškai, kai pasikeičia priklausomi duomenys.
- Funkcinis-reaktyvus – jungia funkcinį programavimą su reakcinių srautų modeliu (naudinga vartotojo sąsajoms ir realaus laiko sistemoms).
- Logikos ir taisyklių sistemas – naudojama žinių atstovavimui ir sprendimų priėmimui.
- Priklausomybės injekcija / komponentinis dizainas – orientuotas į moduliškumą ir testavimą; nebūtinai savarankiška paradigma, bet svarbus architektūrinis braižas.
- Funkcinis-imperatyvus miksas – kalbos kaip JavaScript ar Python leidžia taikyti tiek funkcinį, tiek imperatyvų stilių, priklausomai nuo poreikio.
- Azpektinis programavimas – leidžia iškelti kryžmines rūpybes (pvz., logavimą, saugumą) į atskirus sluoksnius.
Apžvalga
Paradigmos padeda programuotojams pasirinkti tinkamą mąstymo ir organizavimo būdą sprendžiant konkrečią problemą. Geras sprendimas dažnai reiškia derinti paradigmas: panaudoti imperatyvų kodą, kai reikia detaliai kontroliuoti vykdymą, ir deklaratyvius sprendimus, kai reikalingas aiškus aukšto lygio aprašymas. Svarbu suprasti paradigmos privalumus ir kompromisus, kad būtų galima rašyti patikimą, palaikomą ir efektyvų kodą.
Paradigmų problemos
Paradigmų pasirinkimas gali sukelti kelias praktines problemas:
- Įrankių ir bibliotekų suderinamumas: tam tikros paradigmos geriausiai veikia su tam tikromis bibliotekomis; pereinant iš vieno stiliaus į kitą gali prireikti daug adapterių.
- Komandos narių skirtingas supratimas: mišrioje projekte, skirtingi programavimo stiliai gali mažinti bendrą kodo vientisumą ir padidinti klaidų tikimybę.
- Našumo kompromisai: deklaratyvus kodas gali būti mažiau optimalus, jei vykdymo aplinka negali gerai optimizuoti aukšto lygio aprašymo.
- Priklausomybė nuo būsenos: imperatyvus ir objektinis kodas, kuris plačiai keičia globalią būseną, gali būti sunkiai testuojamas ir suderintas lygiagrečiai.
- Mokymosi kreivė: kai kurios paradigmos (pvz., grynai funkcinis, logikos programavimas) reikalauja kitokio mąstymo ir gali būti iššūkis programuotojams, pratintiems prie imperatyvaus stiliaus.
Istorija
Paradigmų raida atspindi skirtingus kompiuterių ir programavimo poreikius per laiką. Žemiau pateikiama apžvalga apie svarbiausius etapus:
Mašininis kodas
Pirmosios programos buvo rašomos tiesiogiai mašininiu kodu arba asamblėja — programuotojas nurodydavo konkrečius procesoriaus sprendimus ir atminties adresus. Tai grynai imperatyvus požiūris, be aukšto lygio abstrakcijų.
Procedūrinės kalbos
Su Fortranu, Algolu ir vėliau C atsirado procedūrinės kalbos, kurios įvedė aukštesnio lygio konstrukcijas: funkcijas/procedūras, ciklus, sąlyginius sakinius ir struktūras. Tai padėjo sumažinti klaidų skaičių ir palengvinti sudėtingų programų kūrimą.
Objektinis programavimas
Simula ir Smalltalk formavo objektinio programavimo pagrindus, o vėliau C++, Java populiarinimas leido plačiai taikyti objektinį dizainą. Objektiškumas padėjo modeliuoti sudėtingas sistemas, leidžiant sujungti duomenis ir elgseną į vienetus — objektus.
Deklaratyvinės paradigmos
Funkcinės idėjos gyvuoja nuo Lisp laikų, o Haskell ir kitos funkcinės kalbos dar labiau išgrynino konceptus kaip grynumas ir tipų sistema. Logikos programavimas (Prolog) suteikė alternatyvą — taisyklių pagrindu grindžiamą problemų sprendimą. Taip pat deklaratyvios užklausų kalbos (pvz., SQL) ir žymėjimo/žiniaraščių technologijos (pvz., HTML, XML) tapo įprastomis priemonėmis specifiniams uždaviniams spręsti.
Šiandien daugelis kalbų yra daugparadigmės, leidžiančios programuotojams rinktis stilių pagal poreikį: rašyti deklaratyvų SQL užklausas duomenims gauti, funkcinės stiliaus transformacijas duomenų srautui, o imperatyvų kodą sprendimų vykdymui. Svarbu suprasti kiekvienos paradigmos pagrindus, kad rinktumėtės tinkamiausius įrankius konkrečiam uždaviniui.
Jeigu norite, galiu pridėti pavyzdinius kodų fragmentus (imperatyvus vs deklaratyvus), palyginimo lentelę arba trumpą rekomendacijų gaires, kada rinktis kurią paradigmos dalį.

