Programavimo paradigmos: kas tai yra, tipai ir istorija

Sužinokite programavimo paradigmas: kas tai yra, pagrindiniai tipai (imperatyvios, deklaratyvios, objektinės) ir istorija — aiškiai, su pavyzdžiais ir palyginimais.

Autorius: Leandro Alegsa

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, 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į.

Apžvalga

Programavimo kalbos grupuojamos pagal paradigmas taip pat, kaip mašinos gali būti grupuojamos pagal tai, kam jos naudojamos.

Kelios kalbos atitinka tik vieną pagrindinę paradigmą, pvz:

  • Smalltalk (orientuotas į objektus)
  • Asamblėja (imperatyvinė, bet ne struktūrizuota ar objektinė)
  • Haskell (funkcinis)
  • Prologas (logika)

Tačiau dauguma kalbų yra daugiau nei vienos paradigmos. Kai kurios iš jų išsiskiria tuo, kad jų yra daugiau nei viena:

  • Scala (objektinė, funkcinė, lygiagrečioji)
  • "Visual Basic" (įvykių valdomas, objektinis)
  • Common Lisp (procedūrinis, funkcinis, objektinis, meta)
  • Schema (funkcinė, procedūrinė, meta)
  • Perl (funkcinė, procedūrinė, meta, objektinė, į įvykius orientuota)
  • Python (funkcinis, objektinis, procedūrinis)
  • Ruby (funkcinis, objektinis, procedūrinis)
  • Wolfram Language (funkcinė, procedūrinė, paprastai deklaratyvi)
  • Oz (loginis, funkcinis, imperatyvinis, objektinis)
  • F# (funkcinė, imperatyvioji, objektinė, meta)

Turėti daugiau paradigmų ne visada yra gerai. Vienas iš atvejų, kai mažiau paradigmų gali būti geras dalykas, yra tik funkcinė kalba. Vienos iš tokių kalbų funkcija kartais atlieka mažiau darbo (pavyzdžiui, aplanko tik tas grupės dalykų dalis, kurių jai iš tikrųjų reikia), nei galėtų atlikti, jei kalba būtų procedūrinė.

Daugelis programavimo paradigmų yra žinomos tiek dėl dalykų, kurių neleidžia žmonėms daryti, tiek dėl tų, kuriuos leidžia daryti. Vienas iš tokių atvejų yra funkcinės kalbos. Kai funkcinė kalba yra tik arba daugiausia funkcinė, ji paprastai neleidžia šalutinių efektų. Kitas atvejis, kai tai tiesa, yra struktūrinis programavimas: jis skiriasi nuo įprastų imperatyvinių kalbų, nes neleidžia programuotojams naudoti "goto teiginių" (teiginių, nurodančių programai pereiti prie ankstesnio žingsnio). Dėl šios ir kitų priežasčių žmonės kartais mano, kad naujosios paradigmos neleidžia pakankamai dalykų. Vis dėlto kartais gerai, kad kompiuteris neleidžia žmonėms daryti tam tikrų dalykų: tai gali padėti žmonėms išvengti jų kodo problemų ir leisti kompiuteriui daryti spėjimus, kad jis galėtų greičiau paleisti kodą, arba net patikrinti kodą, ar jame nėra problemų prieš jam paleidžiant!

Įvairių programavimo paradigmų apžvalga pagal Peter Van RoyZoom
Įvairių programavimo paradigmų apžvalga pagal Peter Van Roy

Paradigmų problemos

Kai kuriems programavimo kalbas tyrinėjantiems žmonėms, pavyzdžiui, Harperiui ir Krishnamurthi, nepatinka, kad programavimo kalboms grupuoti naudojamos paradigmos. Šie žmonės sako, kad daugelio programavimo kalbų negalima tiesiog sugrupuoti į paradigmas, nes kalbos skolinasi dalykus ir idėjas iš daugelio paradigmų.

Istorija

Laikui bėgant buvo sukurtos naujos paradigmos, į kurias žmonės atkreipė dėmesį tuo metu arba žvelgdami atgal. Viena pirmųjų paradigmų, kuri buvo pripažinta kaip naujas programavimo būdas, buvo struktūrinis programavimas 1960-aisiais. "Programavimo paradigmos" idėja atsirado 1978 m., jei ne anksčiau, kai Robertas W. Floydas ją naudojo dėstydamas. Žodį "paradigma" taip, kaip jį suprato Robertas, pirmą kartą pavartojo Thomas Kuhnas knygoje "Mokslinių revoliucijų struktūra" (1962 m.).

Mašininis kodas

Žemiausio lygio (artimiausia tam, kaip kompiuteris mėgsta suprasti dalykus) ir seniausia programavimo paradigma yra mašininis kodas - imperatyvinė paradigma. Mašininio kodo nurodymai yra tik tam tikra tvarka išdėstytų skaičių rinkinys. Asemblerio kalba yra šiek tiek žemesnio lygio (ir šiek tiek mažiau sena). Asemblerio kalboje kompiuterio nurodymams suteikiami mnemoniniai pavadinimai (lengviau įsimenami pavadinimai), o atminties adresams (nurodymams, kaip kompiuteryje rasti informacijos dalį) gali būti suteikti pavadinimai. Šios kalbos kartais vadinamos pirmosios ir antrosios kartos kalbomis.

Septintajame dešimtmetyje asemblerio kalbos buvo patobulintos pridedant naujų dalykų, pavyzdžiui, bibliotekos COPY, makrokomandų (specialaus kodo dalys, kurios prieš pradedant vykdyti programą paverčiamos įprastu kodu), paleidžiamų procedūrų (nurodymų rinkiniai, kuriems suteikiamas pavadinimas ir kurie išsaugomi vėlesniam laikui) ir kintamųjų (elementai, kuriems suteikiami pavadinimai ir kurie išsaugomi vėlesniam laikui), esančių už programos ribų. Tai leido žmonėms naudoti tam tikrą kodą daugiau nei viename projekte ir nesijaudinti dėl specifinių aparatinės įrangos problemų (problemų, kurios būdingos tik vienos rūšies kompiuteriams), nes buvo naudojamos tokios komandos (krypčių pavadinimai) kaip READ/WRITE/GET/PUT.

Asembleris buvo ir kartais vis dar yra naudojamas sistemose, kuriose svarbu, kad kodas būtų greitas, taip pat jis daug naudojamas įterptosiose sistemose, nes leidžia naudotojui tiksliai kontroliuoti, ką daro mašina.

Procedūrinės kalbos

XX a. septintojo dešimtmečio pabaigoje žmonės pradėjo kurti procedūrines kalbas. Šios trečiosios kartos kalbos (kelios pirmosios kalbos, kurias dabar vadiname aukšto lygio kalbomis) turėjo žodžius, susijusius su tuo, ką jomis buvo bandoma išspręsti. Pavyzdžiui,

  • COBOL (angl. COmmon Business Oriented Language) - joje vartojami tokie žodžiai kaip failas, perkelti ir kopijuoti.
  • FORMULINIS PERSPĖJIMAS (FORTRAN) - naudojami matematiniai žodžiai ir simboliai (formos, naudojamos rašant ir spausdinant). Ji buvo sukurta daugiausia gamtos mokslams ir inžinerijai.
  • ALGOrithmic Language (ALGOL) - skirta algoritmams (veiksmų rinkiniams, nurodantiems kompiuteriui, ką daryti) rašyti. Joje, kaip ir FORTRAN, naudojami matematiniai žodžiai ir simboliai.
  • "Programavimo kalba 1" (PL/I) - turėjo būti naudinga visiems.
  • Pradedantiesiems skirtas universalus simbolinių instrukcijų kodas (BASIC) - sukurtas siekiant padėti pradedantiesiems programuoti.
  • C - programavimo kalba, skirta daugeliui dalykų atlikti. Dennisas Ritchie 1969-1973 m. ją kūrė AT&T Bell Labs.

Į objektus orientuotas programavimas

Daugeliui žmonių pradėjus naudoti procedūrines kalbas, buvo išrastos į objektus orientuotos programavimo kalbos. Šiose kalbose duomenys ir jų "metodai" (manipuliavimo duomenimis būdai) yra sudėti į vieną "objektą". Kai kurie programuotojai, pavyzdžiui, Ričardas Stalmanas (Richard Stallman), nesutinka, kad į objektus orientuotos kalbos geriau nei procedūrinės kalbos padeda paaiškinti idėjas kompiuteriui.

Kadangi į objektus orientuotas programavimas yra paradigma, o ne kalba, žmonės sukūrė į objektus orientuotas asemblerio kalbas, pavyzdžiui, HLA (High Level Assembly).

Deklaratyvinės paradigmos

Tuo pat metu kai kurie žmonės kūrė deklaratyviąsias programavimo kalbas. Gerai žinoma deklaratyvioji kalba yra SQL (kalba, skirta lentelių papildymui ir pašalinimui).

Susiję puslapiai

  • Mąstysena
  • Tipo sistema
  • Tiuringo išbaigtumas

Klausimai ir atsakymai

K: Kas yra programavimo paradigma?


A: Programavimo paradigma - tai programavimo kalbų grupavimas pagal tai, kaip jos veikia.

K: Kokios yra dvi pagrindinės paradigmų grupės?


A: Dvi pagrindinės paradigmų grupės yra imperatyvioji ir deklaratyvioji.

K: Kuo skiriasi imperatyvinė ir deklaratyvinė paradigmos?


A: Imperatyviosios paradigmos atsižvelgia į kodo vykdymo būdą, pavyzdžiui, leidžia šalutinius efektus arba reikalauja atlikti veiksmus tam tikra tvarka, o deklaratyviosios paradigmos atsižvelgia į kodo grupavimo būdą, pavyzdžiui, kodą suskirstyti į vieną ar dvi dalis (arba daug mažų dalių).

Klausimas: Ar kalba gali būti ir imperatyvioji, ir deklaratyvioji paradigma?


A: Taip, kalba gali būti ir imperatyvinė, ir deklaratyvinė paradigma.

K: Kaip programavimo paradigma grupuoja kalbas?


A: Programavimo paradigmos grupuoja kalbas pagal tai, ką jos daro. Jos atsižvelgia į tai, kaip vykdomas kodas, kaip jis sugrupuotas ir kokia tvarka bei dalimis sudaryta programa.

K: Ar yra kitų programavimo paradigmų tipų, be imperatyviosios ir deklaratyviosios?


A: Taip, be imperatyviosios ir deklaratyviosios, yra ir kitų programavimo paradigmų tipų. Pavyzdžiui, vieni žiūri į tai, kaip kodas paleidžiamas (pvz., leidžiami šalutiniai efektai), o kiti žiūri į tai, kaip kodas sugrupuojamas (pvz., kodas suskirstomas į vieną ar dvi dalis).

Klausimas: Ar kiekviena kalba priklauso tik vienam programavimo paradigmos tipui?


A: Ne, ne kiekviena kalba priklauso tik vienam programavimo paradigmos tipui; kai kurios kalbos gali priklausyti daugiau nei vienam paradigmos tipui.


Ieškoti
AlegsaOnline.com - 2020 / 2025 - License CC3