Paradigma (grčka reč) je skup osnovnih pretpostavki ili pravila koje uzimamo zdravo za gotovo u cilju poimanja stvarnosti i njenih fenomena. Prosto rečeno, paradigma je način na koji posmatramo svet. Prirodni jezici su multi-paradigmatski, možemo na više načina da izrazimo svoje misli: tako što posmatramo sa aspekta vršioca radnje-subjekta, objekta nad kojim se vrši radnja, radnje kao procesa, itd. Možemo se izraziti tako da opišemo stanje, a možemo izraziti i tok radnje.

Programski jezici su ciljano projektovani kao alat za izražavanje na specifičan način, prilagođen nekoj vrsti problema.

Paradigma (grč. paradeigma) primer za ugled, uzor, uzorak, obrazac (obrazac menjanja, model za likovne umetnike)

Programska paradigma – programski obrazac, programski stil, programski šablon, specijalni način programiranja, ...

Programska paradigma (definicija iz Wikipedije)  –  fundamentalni stil programiranja (kreiranja računarskih programa).

Svaku programsku paradigmu bitno određuje jedan ili više programskih jezika, kao glavni predstavnik te paradigme. Jedan programski jezik može podržati više paradigmi, i to je zapravo vrlo česta pojava.

Sledeća definicija programskih jezika je uspostavlja vezu između paradigmi i jezika:

Programski jezik je sredstvo koje koristi neko lice da izrazi proces pomoću kojeg računar rešava nekakav problem.

U zavisnosti od toga na kojoj od ovih reči je akcenat, programskim jezikom je podržana dominantna programska paradigma.

lice - logička paradigma

računar - proceduralna (imperativna) paradigma

proces - funkcionalna paradigma

problem - objektno-orijentisana paradigma

Asembler i “niži” jezici projektovani su za izražavanje niza instrukcija za programiranje procesora, i sve izražavaju kroz radnju, glagole:

upiši 2 u x;

upiši 3 u y;

saberi x i y.

SQL, na primer, opisuje željeni rezultat, bez zalaženja u konkretne detalje kako će se do toga doći.

SELECT AVERAGE(ocena) FROM ocene WHERE predmet=matematika;

Razlikujemo dve osnovne podele paradigmi:

- imperativne, u kojima se opisuju instrukcije kojima mašina menja stanje

- deklarativne, u kojima se opisuju osobine željenog rezultata-stanja ali ne i način kako da se to izračuna              

Imperativne paradigme

Kod imperativnih paradigmi programer izražava program kao niz instrukcija kojima će računar menjati stanje modela, predstavljeno u memoriji. Ovo ne znači da su imperativni jezici nužno neke manje ili više apstraktne verzije asemblera, već znači da je način razmišljanja o problemu takav da se na problem gleda kao na nešto što ima stanje i aktivnosti koje menjaju to stanje.

Imperativne paradigme možemo dalje grupisati na osnovu načina grupisanja instrukcija. Tako, razlikujemo proceduralne i objektno orijentisane paradigme.

Proceduralna paradigma

Proceduralna paradigma je prva nastala. Proceduralna paradigma “prirodno” izvire iz koncepta savremenih elektronskih računara. Mnogi smatraju da je ona podloga svih ostalih programskih paradigmi.

Kod proceduralnih jezika instrukcije se grupišu u procedure-funkcije. Postoji domen podataka i domen procedura. Pozivanjem procedura vrši se promena vrednosti podataka, tj. promena stanja modela. Procedure znaju koje podatke treba da menjaju tako što dobijaju te podatke kao ulazne parametre. Proceduralna paradigma se izražava rečenicama koje imaju predikat i objekat: šta se radi i na čemu.

Kontrola toga najčešće je na nivou instrukcija skokova: JUMP / GOTO.

BASIC je proceduralni jezik.

Primer:

10     I := 0
20     MAX := NIZ[0]
30     IF NIZ[I] > MAX THEN MAX:= NIZ[I]
40     I := I+1
50     IF I < COUNT(NIZ) THEN GOTO 30
60     PRINT MAX

Strukturna paradigma

Strukturna paradigma je profinjenje proceduralne paradigme. Umesto da se koriste eksplicitni skokovi na instrukcije, uvode se strukture kao što su uslovi i petlje. U objašnjavanju procesa programiranja često se polazi od strukturne paradigme. Neki od jezika strukturne paradigme još uvek su među najpopularnijim. Često se kombinuje sa drugim paradigmama (često se strukturni jezici nadograđuju da bi podržavali i druge paradigme).

C je strukturni jezik. C# sadrži strukturnu osnovu, kad pišete for petlju pišete program na strukturni način.

Primer:

max = niz[0];
for (i=0; i<count(niz); i++){
      if ( niz[i] > max ){
            max = niz[i];
      }
}

Primer2:

max := niz[1];
for i:= 1 to length(niz) do
begin
if  niz[i] > max then max := niz[i];
end;

Objektna paradigma

Objektna paradigma instrukcije grupiše uz delove stanja nad kojima se te instrukcije primenjuju i menjaju. Podaci se grupišu u objekte i imaju svoje procedure, kao sastavni deo sebe. Objektna paradigma se izražava rečenicama koje obavezno imaju subjekat: ko radi šta (i na čemu/sa čim).

Objektno ili Objektno-orijentisano

Objektna paradigma stanje posmatra kao kolekciju objekata, i svaki podatak je objekat, i obuhvata sve one objektne koncepte koje ćemo u nastavku da obuhvatimo.

Objektno-orijentisani jezici su oni koji u sebi primenjuju objektne koncepte, ali ne nužno sve već onaj deo koji su izabrali. Tako, objektno-orijentisani jezik može da ima podatke koji su objekti i podatke koji nisu objekti nego primitivni tipovi: int, boolean i sl. Idealan objektni jezik podržava višestruko nasleđivanje (obrađeno u nastavku) dok objektno-orijentisani to uglavnom nemaju, već nadomešćuju donekle kroz interfejse ili čak uopšte.

Deklarativne paradigme

Kod deklarativnih paradigmi programer opisuje (deklariše) osobine željenog, ciljanog stanja, ali ne i konkretne korake kako se do toga dolazi. Tačnije, ako se navodi kako se dolazi do rešenja, to je u obliku deklaracije, koji od mogućih načina da se primeni. Konkretni koraci se ne pišu. Na problem se gleda kao na niz stanja, gde se iz jednog stanja prelazi u drugo, pa u treće itd. dok se ne dođe do konačnog stanja i program završi. Mehanika prelaska iz stanja u stanje se ne razmatra.

Deklarativne paradigme možemo dalje grupisati po osnovu toga kako se deklariše željeno stanje. Razlikujemo funkcionalne, logičke, matematičke i reaktivne paradigme.

SQL takođe možemo smatrati deklarativnim jezikom, budući da se prilikom zadavanja upita opisuju osobine podataka a serveru baze podataka se prepušta da upit protumači i izvrši na najefikasniji način. SQL sadrži i trigere, procedure i funkcije, u okviru kojih se piše kod na imperativni način, tako da možemo zaključiti da je SQL multiparadigmatski jezik koji je u velikoj meri deklarativan.

Funkcionalna paradigma

Funkcionalna paradigma nastaje krajem pedesetih i početkom šezdesetih godina prošlog veka. Najistaknutiji predstavnik funkcionalne paradigme bio je programski jezik Lisp. Nakon sedamdesetih godina prošlog veka stagnira razvoj ovakvih jezika, do skoro, kada ponovo dobija na popularnosti u nekoj meri. Haskell je programski jezik koji se smatra za čist funkcionalni jezik. Python i JavaScript sadrže neke interesantne funkcionalne koncepte.

Funkcionalna paradigma nastala je kao težnja da se drugačije organizuje proces programiranja. Umesto da problem opisujemo na način diktiran konstrukcijom računara (imperativno), problem opisujemo definisanjem i ulančavanjem procesa-funkcija. U funkcionalnom programiranju ne postoje promenljive – konkretne vrednosti se posmatraju kao funkcija bez parametara koja vraća konstantnu vrednost.

Primer:

max :: [Int] -> Int
max [x] = x
max (x:xs) =
| (max xs) > x = max xs
  | otherwise = x

Opis: prvo deklarišemo da je max funkcija koja niz integera pretvara u int, tj. za dati niz, vraća jedan int.

Zatim navodimo slučaj kad funkcija dobije niz sa jednim elementom, tada je maksimum upravo taj element.

Zatim navodimo opšti slučaj, kad funkcija dobije niz sa više elemenata. Tada niz razdvajamo na prvi element i ostatak niza, pa gledamo da li je maksimum ostatka niza veći ili manji od prvog elementa. Ako je veći rezultat je maksimum ostatka niza. Ako nije, rezultat je prvi element.

Ovde se mnogo primenjuje rekurzija. Što je i prirodno, budući da funkcionalno programiranje ne trpi petlje.

Logička paradigma

Logička paradigma nastaje početkom sedamdesetih godina prošlog veka. Najpoznatiji programski jezik ove paradigme je PROLOG. Nastaje kao težnja da se u kreiranju programa koristi isti način razmišljanja kao i pri rešavanju problema u svakodnevnom životu. Zasnovana je na matematičkoj logici, na tzv. predikatskom računu 1. reda. Glavnu primenu našla je u veštačkoj inteligenciji i ekspertskim sistemima. Verovatno najzaostalija paradigma, što nije ni čudno s obzirom na, uslovno rečeno, marginalni značaj.

Kod logičkog programiranja definišu se kolekcije činjenica (podaci) i pravila zaključivanja. Uloga programa je da primenom pravila zaključivanja iz činjenica izvede odgovore.

Opisni jezici

Pored programskih jezika, kojima se opisuju instrukcije i proces rešavanja problema, postoje i opisni jezici. Opisni jezici služe za opisivanje podataka: njihovih vrednosti, strukture, uzajamnih odnosa i dr. Podaci unutra programa imaće svoju strukturu prilagođenu tom programu. Međutim, ako podatke treba preneti nekom trećem licu ili računarskom sistemu javlja se potreba za standardizovanim formatom podataka kako bi taj ko koristi podatke znao kao da ih tumači.

Opisni jezici su XML, JSON itd. HTML je specifikacija (dijalekt, uslovno rečeno) XML-a. HTML je projektovan za opisivanje strukture i sadržaja dokumenta, i sve izražava kroz hijerarhijski strukturisane objekte i njihove atribute:

<h1 style=”color:red”>Ovo je naslov crvene boje</h1>
<p>
Ovo je pasus, u kome je <strong>podebljan</strong> tekst i
<a href=”http://www.google.com”> link </a>
</p>

HTML se ne svrstava u programske jezike već u opisne jezike, jezike za opisivanje strukture podataka. Programski jezici nužno u sebi imaju osobinu predstavljanja niza instrukcija. Opisni jezici imaju osobinu predstavljanja podataka i njihove strukture.

U starijoj tehničkoj literaturi razlikovali su se termini TEKA (fajl), DATOTEKA (fajl sa podacima) i PROGRAMOTEKA (fajl sa instrukcijama, program). Vremenom se to slilo u reč fajl koji označava oba.

Rezime

Imperativno programiranje: niz naredbi – uradi ovo, pa onda ono itd.

Proceduralno programiranje: grupisanje instrukcija u procedure. instrukcije skokova.

Strukturno programiranje: izražavanje kroz fino ugnježdene kontrolne strukture (petlje, uslovi i sl.), bez instrukcija skokova.

Objektno orijentisano programiranje: programiranje u kontekstu “društva” objekata, gde svaki objekat ima svoje osobine i ponašanja. ko radi šta kome.

Logičko programiranje: imamo kolekciju činjenica i pravila zaključivanja. Program odgovara na pitanja.

Funkcionalno programiranje: komponujemo čiste funkcije, liči na matematičko izražavanje problema.

Postoje i druge paradigme. Ove su najviše u upotrebi.