Način opisivanja problema u deklarativnim programskim jezicima

uredi

Postoje dve različite podele programiranja:

Na proceduralno i deklarativno, gde se pod proceduralnom paradigmom podrazumevaju svi jezici u kojima programer opisuje proceduru (algoritam, postupak), a za deklarativno je potrebno da se računaru opiše samo problem koji treba da reši, i on će ga sam rešiti. U ovoj podeli su imperativna i objektno orijentisana paradigma podvrste proceduralne. Kod imperativne paradigme, programer zadaje algoritam korišćenjem naredbi. Deklarativna paradigma se deli na funkcionalnu i logičku. Programiranje se deli na imperativno i deklarativno, gde se pod imperativnom paradigmom podrazumeva svako programiranje u kojem programer opisuje algoritam rešavanja problema. Proceduralna paradigma je ovde podvrsta imperativne, i tada se programi pišu tako što se složen problem razbije na više potproblema, koji se rešavaju pisanjem pojedinačnih funkcija i procedura. Imperativna i proceduralna paradigma su veoma tesno povezane i obe podele su validne. Proceduralnu paradigmu koriste jezici C, C++, C#, Pascal, Ada, mašinski i asemblerski jezici.

Imperativna paradigma

uredi

Imperativni programi se sastoje iz niza naredbi preko kojih računar dobija zadatak kako da izmeni podatke iz memorije. Mašinski i asemblerski jezici su imperativni; oni koriste naredbe da upravljaju obradom podataka u procesoru.

Tekuće stanje je veoma bitno za izvršavanje imperativnih programa. Ono se menja tokom izvršavanja programa i određuju ga promenljive koje taj program koristi. Ovo stanje se naziva i mutabilno, jer se podaci čuvani u promenljivima mogu menjati. Osnovna naredba za menjanje stanja je naredba dodele, gde se promenljivoj dodeljuje neka vrednost. Ove paradigme koriste iteracije; do konačnog rešenja se dolazi tako što se malo po malo ažuriraju vrednosti promenljivih. Iteracije se ostvaruju preko petlji. Na primer, operatori ++ i -- menjaju vrednost promenljive za 1. Za njih se kaže da imaju bočni efekat, jer prilikom poziva menjaju vrednosti globalnih promenljivih. Funkcije koje vrše interakcije sa ulazno-izlaznim uređajima takođe imaju bočni efekat.

Proceduralno programiranje u smislu potprograma

uredi

Proceduralno programiranje podrazumeva uvođenje potprograma kako bi se program razbio na veći broj manjih programa. Postoje dve vrste potprograma:

  • Funkcije
– слично као функције у математици, њихова улога је да на основу датих аргумената дају неки крајњи резултат.
  • Procedure
– служе да остваре неки бочни ефекат.

Programski jezik Pascal je za ove dve vrste potprograma koristio različite reči (function i procedure), dok se u jeziku C procedure ostvaruju kao funkcije. Međutim, u čistim funkcionalnim programskim jezicima (npr. Haskell) funkcije ne mogu da imaju bočne efekte.

Dakle, za svaki jasno definisan potproblem definiše se funkcija (ili procedura) kojom se on rešava. Potprogrami pozivaju jedni druge sve do glavnog programa od kojeg počinje izvršavanje. Ovo teče odozgo-naniše.

Uveden je koncept lokalnih promenljivih da bi procedure što manje zavisile od ostatka programa. Vrednosti se prenose u potprograme i vraća se rezultat.

Podela programa na manje delove je pokrenula modularizaciju. Nakon izdvajanja potprograma, javlja se potreba za organizovanjem srodnih funkcija i podataka kojima one operišu u module, tj. biblioteke koje se zatim mogu uključiti i koristiti u većem broju programa.

Implementacija potprograma je zahtevala unapređivanje kompilatora i reorganizaciju memorije (podelu na programski stek, hip, segment podataka i segment koda), a kada su ti problemi rešeni, došlo se do mnogo bolje organizacije složenih programa.

Neke funkcije mogu da pozivaju same sebe (rekurzivna funkcija). Rekurzivna funkcija daje mnogo deklarativniji opis nego klasična iterativna implementacija, jer se računaru zapravo ne opisuje kako ova vrednost treba da se izračuna. Rekurzija se mnogo intenzivnije koristi u sklopu funkcionalnog i logičkog programiranja.

Prednosti i mane proceduralne paradigme

uredi

S obzirom na to da je ova paradigma jedna od najstarijih, veoma je bliska principima funkcionisanja hardvera. Najveća prednost je što se programi prilično direktno mogu prevesti na asemblerski i mašinski jezik.

Bočni efekti mogu prilično da zakomplikuju analizu programa. Ako funkcija koristi i menja globalne promenljive, moguće je da se ista funkcija pozove sa istim argumentima više puta i da svaki put da različit rezultat i proizvede različit efekat. To nameće programeru obavezu da misli o redosledu i istoriji poziva funkcija. Ako neka globalna promenljiva ima pogrešnu vrednost, pošto bilo koja funkcija može da joj pristupi i da je promeni, debagovanje podrazumeva da se proanaliziraju sve funkcije i da se proveri koja od njih pristupa i menja tu globalnu promenljivu, što može biti veoma komplikovano.

Testiranje funkcija sa bočnim efektima je problematično. Čiste funkcije se jednostavno testiraju tako što se jednom pokrenu na karakterističnim test-primerima. Sa druge strane, funkcije sa bočnim efektima nije moguće testirati izolovano od ostatka programa.

Funkcije sa bočnim efektima nemaju referencijalnu transparentnost, što znači da se u kodu ne mogu zameniti svojim povratnim vrednostima. Na primer, gde god se u programskom kodu javi poziv funkcije faktorijel(5), on može biti zamenjen vrednošću 120, bez ikakvog uticaja na ostatak programa (pod pretpostavkom da je izračunavanje faktorijela implementirano na uobičajeni način, bez sporednih efekata).

Reference

uredi

[1]

  1. https://petlja.org/sr-Latn-RS/