Programske paradigme: definicija, vrste, primeri in zgodovina

Programske paradigme so načini razvrščanja in opisovanja programskih jezikov glede na slog razmišljanja in način reševanja problemov, ki ga podpirajo. Paradigme se osredotočajo na to, kako so izraženi izračuni, kako so organizirane podatkovne strukture in kako se upravlja z izvajanjem programa. Jeziki lahko podpirajo več kot eno paradigmo in so zato pogosto opisani kot multi-paradigmatski.

Paradigme lahko obravnavajo različne vidike: način izvajanja kode (npr. prisotnost stranskih učinkov ali vrstni red izvedbe), način organizacije kode (npr. razbijanje v velike module ali več majhnih delov) ter način, kako so izraženi pogoji, podatki in odnosi (vrstni red, dele itd.).

V grobem delimo paradigme na dve veliki skupini: imperativne in deklarativne. Veliko jezikov podpira lastnosti obeh skupin.

Imperativno programiranje

V imperativnih programih programerji računalniku podajo natančen, urejen niz korakov, ki jih je treba izvedeti, da dosežemo želeni rezultat. Primer za risanje mačjega obraza bi bil niz navodil: "Tukaj nariši krog, tam nariši dva manjša kroga, na vrhu nariši dva trikotnika" itd. Imperativni programi pogosto vsebujejo spreminjajoče se stanje in lahko imajo veliko stranskih učinkov, kar pomeni, da izvedba ene operacije lahko vpliva na drugo preko skupnih podatkov ali zunanjih virov.

Obstajata dve glavni veji imperativnih paradigm, in jezik pogosto podpira obe:

  • Strukturirano - računalnik dobi navodila, ki so vedno v določenem vrstnem redu. Koraki, kot je "vrni se na korak 3" (znani kot stavki goto), niso dovoljeni.
    • Proceduralni - Program omogoča programerju, da seznam ukazov poimenuje, kar te ukaze spremeni v "postopek", ki ga lahko uporabi pozneje. Tudi večina strukturiranih jezikov je proceduralnih.
  • Objektno usmerjeno - ideje so računalniku razložene s predmeti, deli kode, ki imajo nabor ukazov, ki jih lahko dobijo, in nekaj informacij o njih. Tak pristop spodbuja enkapsulacijo, dedovanje in polimorfizem.

Imperativne paradigme so primerne, kadar želimo nadzor nad nizom korakov in nad spreminjanjem stanja (npr. sistemsko programiranje, visoko zmogljivi algoritmi, upravljanje z napravami). Slabosti so lahko težje preverljivo vedenje zaradi stranskih učinkov, težave pri vzporednem izvajanju in kompleksno upravljanje stanja v velikih projektih.

Deklarativno programiranje

V deklarativnih paradigmah programer računalniku pove kajkako naj to naredi. Namesto da navedemo postopek, izrazimo lastnosti želenega izhoda ali razmerja podatkov, upravljalnik jezika pa skrbi za izvedbo. Za risanje mačjega obraza bi na primer rekli: "Nariši obraz, nariši dve očesi, dve ušesi in usta".

Najbolj znane deklarativne paradigme so:

  • Funkcionalno - Večino dela opravijo funkcije brez stranskih učinkov. Funkcionalni jeziki poudarjajo nedejavnost (immutability) in kompozicijo funkcij, kar poenostavi dokazljivost in vzporedno programiranje.
  • Logika - Navedena so dejstva, nato pa se postavi eno ali več "vprašanj". Pogojna sklepanja in iskanje rešitev gredo preko notranjih mehanizmov uresničevanja pravil.
  • Dogodki - Deli kode so nastavljeni tako, da se zaženejo, ko se zgodijo določene stvari (na primer vklop računalnika). Ta pristop je pogost v uporabi grafičnih vmesnikov in asinhronih sistemih.

Deklarativni pristopi pogosto omogočajo krajše, berljivejše in lažje preverljive izraze problemov. Slabosti so lahko manjši nadzor nad izvedbo (kar lahko vpliva na zmogljivost) in včasih večja zahtevnost izražanja določenih vrst algoritemov.

Druge paradigme

Obstajajo paradigmatske tehnike, ki se lahko pojavijo znotraj imperativnih ali deklarativnih jezikov ali kot dopolnila k njima. Te vključujejo:

  • Reaktivno programiranje – osredotoča se na pretoke podatkov in propagacijo sprememb (uporablja se v odzivnih vmesnikih in upravljanju asinhronih dogodkov).
  • Programiranje s kontrakti – dodajanje formalnih pogojev (pre- in postpogoj) za funkcije in metode za večjo zanesljivost.
  • Metaprogramiranje – programi, ki generirajo ali spreminjajo druge programe ali same sebe (makri, refleksija).
  • Paralelno in vzporedno programiranje – paradigme in modeli za obvladovanje deljenja dela in sinhronizacije na več procesnih enotah.

Pregled in primeri

V praksi se paradigme pogosto prepletajo. Mnogi sodobni jeziki, kot so Python, JavaScript ali Scala, podpirajo imperativne, objektne in tudi funkcionalne stile. Izbira paradigme je odvisna od problema, ekipe, orodij in ne nazadnje tudi osebnih preferenc.

Primeri tipičnih uporab:

  • Imperativno/proceduralno: sistemska orodja, jedrne knjižnice, obdelava vhodno-izhodnih operacij.
  • Objektno usmerjeno: velike aplikacije z mnogimi tipi entitet in njihovimi interakcijami (uporablja se za organizacijo kode in modeliranje domen).
  • Funkcionalno: obdelava zalednih tokov podatkov, zaporedna obdelava kolekcij, varno vzporedno računanje.
  • Deklarativno/logično: poizvedbe v podatkovnih zbirkah, reševanje problemov preko pravil (npr. Prolog) in konfiguracijski jeziki.

Težave s paradigmami

Paradigme prinašajo koristi, a tudi izzive:

  • Mešanje paradigm lahko vodi v nejasen slog kode, če ni vzpostavljenih smernic.
  • Upravljanje stanja v imperativnih jezikih lahko oteži testiranje in vzporedno izvajanje.
  • Učinkovitost – nekateri deklarativni pristopi abstraktirajo nad izvedbo, kar lahko povzroči slabše zmogljivosti brez optimizacij prevajalnika ali runtime-a.
  • Navajenost programerjev – prehod iz ene paradigme v drugo (npr. od imperativnega k funkcionalnemu) zahteva drugačen način razmišljanja in učenja novih vzorcev.

Zgodovina

Strojna koda

Najzgodnejše programske forme so bile neposredne ukaze procesorju – strojna koda in kasneje asemblerski jeziki. Ti sta bila strogo imperativna: programer je natančno določal zaporedje ukazov in način, kako se uporabi strojno stanje (registri, pomnilnik).

Proceduralni jeziki

V šestdesetih in sedemdesetih so se pojavili proceduralni jeziki (npr. Fortran, Algol, C), ki so uvedli strukturiranje kode z zanki, pogojnimi stavki in postopki/funkcijami. To je olajšalo abstrakcijo in ponovno uporabo kode ter zmanjšalo uporabo neposrednega goto-programiranja.

Objektno usmerjeno programiranje

Objektno programiranje se je razvilo kot način modeliranja kompleksnih sistemov z uporabo predmetov (objektov), ki vsebujejo stanje in vedenje. Jeziki, kot so Simula in pozneje Smalltalk, C++, Java, so popularizirali ta pristop, ki poudarja enkapsulacijo, dedovanje in polimorfizem.

Deklarativne paradigme

Hkrati so se razvijale deklarativne paradigme: funkcionalni jeziki (Lisp, ML, Haskell) so raziskovali uporabo funkcij kot temeljnih gradnikov z minimom stranskih učinkov, logični jeziki (Prolog) so uveljavili način izražanja problemov z dejstvi in pravili. V novejšem času so se deklarativni pristopi razširili tudi v podatkovne baze (SQL), konfiguracijske jezike in reaktivne sisteme.

Sorodne strani

  • Primerjava programskih jezikov
  • Vzorci programske zasnove
  • Paralelizem in vzporedno programiranje

Reference

Za poglobljeno branje priporočam literaturo o jezikih in paradigmah: uvodi v programiranje, znanstveni članki o jeziku specifikacijah in knjige, ki primerjajo sloge programiranja ter zgodovinske preglede razvoja jezikov.

Druge spletne strani

  • Spletne učilnice in vodiči za posamezne paradigme (funkcionalno, objektno, deklarativno)
  • Dokumentacija za popularne jezike, ki podpirajo več paradigm

Pregled

Programski jeziki so razvrščeni po paradigmah, tako kot so stroji razvrščeni po tem, za kaj se uporabljajo.

Nekaj jezikov spada le v eno glavno paradigmo, na primer:

  • Smalltalk (objektno usmerjen)
  • sestavljanje (imperativno, vendar ne strukturirano ali objektno usmerjeno)
  • Haskell (funkcionalni)
  • Prolog (logika)

Večina jezikov ima več kot eno paradigmo. Nekateri izmed njih izstopajo po tem, da imajo več kot le eno paradigmo:

  • Scala (objektno orientirana, funkcionalna, vzporedna)
  • Visual Basic (dogodkovno voden, objektno usmerjen)
  • Common Lisp (proceduralni, funkcionalni, objektno usmerjeni, meta)
  • Shema (funkcionalna, proceduralna, meta)
  • Perl (funkcionalni, proceduralni, meta, objektno orientirani, dogodkovni)
  • Python (funkcionalni, objektno usmerjeni, proceduralni)
  • Ruby (funkcionalni, objektno usmerjeni, proceduralni)
  • Wolframov jezik (funkcionalni, proceduralni, na splošno deklarativni)
  • Oz (logični, funkcionalni, imperativni, objektno usmerjeni)
  • F# (funkcionalni, imperativni, objektno usmerjeni, meta)

Več paradigem ni vedno dobro. Manjše število paradigem je lahko koristno, če imamo jezik, ki je samo funkcionalen. Funkcija v takšnem jeziku včasih opravi manj dela (na primer pregleda le dele skupine stvari, ki jih dejansko potrebuje), kot bi ga morda morala, če bi bil jezik tudi proceduralen.

Številne programske paradigme so znane tako po stvareh, ki jih ljudem ne omogočajo, kot po tistih, ki jih omogočajo. To velja tudi za funkcionalne jezike. Kadar je funkcionalni jezik samo ali večinoma funkcionalen, običajno ne dovoljuje stranskih učinkov. Drugi primer, ko to drži, je strukturirano programiranje: od običajnih imperativnih jezikov se razlikuje po tem, da programerjem ne dovoljuje uporabe "goto stavkov" (stavkov, ki programu sporočajo, naj gre na prejšnji korak). Zaradi tega in drugih razlogov ljudje včasih menijo, da nove paradigme ne omogočajo dovolj stvari. Včasih pa je v redu, da računalnik ljudem ne dovoli stvari: ljudem lahko pomaga, da se izognejo težavam s svojo kodo, in računalniku omogoči, da ugane, da lahko kodo požene hitreje, ali celo preveri kodo za težave, preden se ta požene!

Pregled različnih programskih paradigem po Petru Van RoyuZoom
Pregled različnih programskih paradigem po Petru Van Royu

Težave s paradigmami

Nekaterim ljudem, ki proučujejo programske jezike, ni všeč, da se paradigme uporabljajo za razvrščanje programskih jezikov, na primer Harperju in Krishnamurthiju. Ti ljudje pravijo, da številnih programskih jezikov ni mogoče preprosto razvrstiti v paradigme, saj si jeziki izposojajo stvari in ideje iz številnih paradigem.

Zgodovina

Sčasoma so bile ustvarjene nove paradigme, na katere so ljudje opozarjali takrat ali ob pogledu nazaj. Ena prvih paradigem, ki je bila prepoznana kot nov način programiranja, je bilo strukturirano programiranje iz šestdesetih let prejšnjega stoletja. Zamisel o "paradigmi programiranja" je iz leta 1978, če ne prej, ko jo je med poučevanjem uporabil Robert W. Floyd. Besedo "paradigma", kot jo je mislil Robert, je prvič uporabil Thomas Kuhn v svoji knjigi The Structure of Scientific Revolutions (1962).

Strojna koda

Najnižja raven (najbližja temu, kako računalnik rad razume stvari) in najstarejša paradigma programiranja je strojna koda, imperativna paradigma. Navodila v strojni kodi so le niz številk v določenem vrstnem redu. Zborni jezik je nekoliko manj nizkonivojski (in nekoliko manj star). V zbirnem jeziku so navodila za računalnik opremljena z mnemoniki (imena, ki si jih je lažje zapomniti), pomnilniški naslovi (navodila za iskanje informacij v računalniku) pa so lahko poimenovani. Te jezike včasih imenujemo jeziki prve in druge generacije.

V šestdesetih letih prejšnjega stoletja so bili jeziki zbirke izboljšani z dodajanjem novih stvari, kot so knjižnica COPY, makri (koščki "posebne" kode, ki se pred začetkom izvajanja programa spremenijo v običajno kodo), postopki za izvajanje (sklopi navodil, ki dobijo ime in so shranjeni za pozneje) in spremenljivke (elementi, ki dobijo imena in so shranjeni za pozneje) zunaj programa. To je omogočilo, da so lahko ljudje uporabljali določeno kodo v več kot enem projektu in jim ni bilo treba skrbeti za težave, ki so specifične za strojno opremo (težave, ki se pojavljajo samo na eni vrsti računalnika), zahvaljujoč ukazom (imena za navodila), kot so READ/WRITE/GET/PUT.

Skupščina se je uporabljala in se včasih še vedno uporablja v sistemih, kjer je pomembno, da je koda hitra, veliko pa se uporablja tudi v vgrajenih sistemih, saj uporabniku omogoča natančen nadzor nad tem, kaj stroj počne.

Proceduralni jeziki

V poznih šestdesetih letih prejšnjega stoletja so ljudje začeli izumljati proceduralne jezike. Ti jeziki tretje generacije (prvih nekaj jezikov, ki jih danes imenujemo jeziki visoke ravni) so imeli besede, povezane s tem, kar so poskušali rešiti. Na primer,

  • COBOL (COmmon Business Oriented Language) - uporablja besede, kot so datoteka, premikanje in kopiranje.
  • FORmula TRANslation (FORTRAN) - uporablja matematične besede in simbole (oblike, ki se uporabljajo pri pisanju in tipkanju). Razvit je bil predvsem za naravoslovje in tehniko.
  • ALGOrithmic Language (ALGOL) - narejen za pisanje algoritmov (nizov korakov, ki računalniku povedo, kaj naj naredi). Uporablja matematične besede in simbole, tako kot FORTRAN.
  • Programski jezik ena (PL/I) - naj bi bil uporaben za vsakogar.
  • Začetna univerzalna programska koda (BASIC) - narejena za pomoč začetnikom pri programiranju.
  • C - programski jezik, ki je namenjen številnim opravilom. Dennis Ritchie ga je med letoma 1969 in 1973 razvijal v laboratoriju AT&T Bell Labs.

Objektno usmerjeno programiranje

Potem ko je veliko ljudi začelo uporabljati proceduralne jezike, so izumili objektno usmerjene programske jezike. V teh jezikih so podatki in njihove "metode" (načini ravnanja s podatki) združeni v en "objekt". Nekateri programerji, na primer Richard Stallman, se ne strinjajo, da so objektno usmerjeni jeziki boljši za razlago idej računalniku kot proceduralni jeziki.

Ker je objektno usmerjeno programiranje paradigma in ne jezik, so ljudje izdelali objektno usmerjene jezike za sestavljanje, kot je HLA (High Level Assembly).

Deklarativne paradigme

Istočasno so nekateri izdelovali deklarativne programske jezike. Jezik, ki je znan po tem, da je deklarativen, je SQL (jezik za dodajanje in odstranjevanje stvari iz tabel).

Sorodne strani

  • Miselna naravnanost
  • Sistem tipov
  • Turingova popolnost

Vprašanja in odgovori

V: Kaj je programska paradigma?


O: Programska paradigma je način združevanja programskih jezikov glede na njihovo delovanje.

V: Kateri sta dve glavni skupini paradigem?


O: Dve glavni skupini paradigem sta imperativna in deklarativna.

V: Kako se razlikujeta imperativna in deklarativna paradigma?


O: Imperativne paradigme obravnavajo način izvajanja kode, na primer dovoljevanje stranskih učinkov ali izvajanje stvari v določenem vrstnem redu, medtem ko deklarativne paradigme obravnavajo način združevanja kode, na primer združevanje kode v en ali dva dela (ali namesto tega v veliko majhnih delov).

V: Ali je lahko jezik hkrati imperativna in deklarativna paradigma?


O: Da, jezik je lahko hkrati imperativna in deklarativna paradigma.

V: Kako programska paradigma združuje jezike?


O: Programske paradigme razvrščajo jezike po tem, kaj počnejo. Upoštevajo, kako se koda izvaja, kako je razvrščena v skupine ter v kakšnem vrstnem redu in kakšni deli sestavljajo program.

V: Ali poleg imperativne in deklarativne obstajajo še druge vrste programskih paradigem?


O: Da, poleg imperativne in deklarativne obstajajo še druge vrste programskih paradigem. Nekatere na primer obravnavajo način izvajanja kode (na primer omogočanje stranskih učinkov), druge pa način razvrščanja kode v skupine (na primer razvrščanje kode v enega ali dva dela).

V: Ali vsak jezik pripada samo eni vrsti paradigme programiranja?


O: Ne, vsak jezik ne pripada samo eni vrsti paradigme programiranja; nekateri jeziki so lahko v več kot eni vrsti paradigme.

AlegsaOnline.com - 2020 / 2025 - License CC3