You are on page 1of 9

Uvod

Kratak pregled razvoja programskih jezika


Raunarski sistem se sastoji od hardvera i softvera. Hardver ine delovi raunara, a softver programi koje raunar izvrava. Raunar je maina bez inteligencije, on izvrava
samo ono to mu je zadato i to na nain na koji mu je zadato. Programom zadajemo
raunaru nain na koji izvrava poslove. Da bismo reili neki problem korienjem
raunara, moramo raunaru precizno opisati sve korake-instrukcije (naredbe) koje on
izvrava zadatim redosledom. Skup instrukcija napisan za reavanje nekog problema
naziva se program, a pisanje instrukcija programiranje.
Ljudi za meusobnu komunikaciju koriste jezik. Jezik je sredstvo za predstavljanje
i prenoenje informacija. ovek mora na neki nain da saopti raunaru niz instrukcija koje treba da izvri. Programski jezik je sredstvo kojim ovek saoptava raunaru
program. ovek i raunar komuniciraju pomou programskog jezika. Prirodni jezici
doputaju nejednoznanost i nepreciznost. Raunar moe razumeti samo formalni
zapis, ne toleriui ni najmanje nepreciznosti. Programski jezici raunaru omoguavaju zapis niza instrukcija koje se ne mogu vieznano protumaiti. Jednoznanost
svake konstrukcije programskog jezika je njegova najbitnija karakteristika. Programski jezik je skup pravila kojim se raunaru predstavljaju instrukcije i opisuju podaci.
Programske jezike moemo podeliti po stepenu zavisnosti programskog jezika i
raunara na:

mainski jezik

simboliki jezik

jezici vieg nivoa

Mainski i simboliki jezici su zavisni od raunara i njih nazivamo mainski zavisnim jezicima. Jezici vieg nivoa pripadaju skupini koje nazivamo mainski nezavisni
jezici.

Mainski zavisni jezici


Najjednostavniji programski jezik je interni jezik raunara mainski jezik. Najvaniji
delovi raunara izgraeni su od elektronskih i magnetnih komponenti, koje karakteriu dva stabilna stanja (ima napona nema napona, tee struja - ne tee struja,
severni pol juni pol). Zbog jednostavnije tehnike realizacije u raunaru se sve
predstavlja pomou dva simbola, 0 i 1, binarnom azbukom. Jedan znak binarne azbuke


 Uvod
predstavlja bit (skraeno od binary digit). Sve informacije u raunaru predstavljaju
se nizom bitova grupisanim u grupe od 8, 16, 32, 64 bita. Grupa od 8 bitova naziva se
bajt.
Mainski jezik je izgraen nad binarnom azbukom. Sve operacije i svi podaci predstavljeni su nizovima bitova. U zavisnosti od arhitekture raunara, ti nizovi bitova
imaju razliita tumaenja i razliite su veliine.
Kako se mainski program sastoji od niza nula i jedinica i zahteva dobro poznavanje naina rada i arhitekture odreenog raunara, vrlo je teko programirati na njemu.
Programi na prvim raunarima bili su zapisani mainskim jezikom to je uslovilo da
uzak krug ljudi pie i odrava programe.
Da bi se premostile potekoe pisanja programa na mainskom jeziku, dolazi do
razvoja simbolikih jezika. Umesto instrukcija pisanih nizom bitova, uvedene su mnemotehnike skraenice za operacije i simbolike oznake podataka, npr. naredbom
ADD a, b vri se sabiranje podataka a i b. Na taj nain proces programiranja je u
znatnoj meri olakan, ali i dalje zavisi od konkretnog procesora, tj. i dalje je potrebno
poznavati tehnike karakteristike konkretnog raunara za koji piemo program. Da bi
se program napisan na simbolikom jeziku izvravao na raunaru, mora se prethodno
prevesti na mainski jezik. Kako svakoj naredbi simbolikog jezika odgovara jedna
naredba mainskog jezika, posao je automatizovan tako to je napisan program koji
kao ulaz dobija program napisan u simbolikom jeziku, a kao izlaz odgovarajui program na mainskom jeziku. Program koji vri prevoenje iz simbolikog u mainski
jezik naziva se asembler (translator). Zato se simboliki jezik esto naziva asemblerski
jezik ili krae asembler. Napomenimo da skup naredbi simbolikog jezika zavisi od
arhitekture raunara, pa program napisan u simbolikom jeziku za jedan raunar ne
moe se koristiti za raunar druge arhitekture, ve se mora ponovo pisati. esto za
mainske i simbolike jezike kaemo da su mainski zavisni jezici. Vano je istai da
pri programiranju na mainski zavisnim jezicima programer mora vrlo detaljno, u malim koracima opisati reavanje problema. Moemo to uporediti sa procesom gradnje
kue pri emu moramo voditi rauna o poloaju svake cigle, daske i slino. Jasno je da
prilikom izgradnje kue u jednom momentu moramo detaljno opisati poloaj svake
cigle, tj. elemente kue predstavljati na taj nain. Meutim, pri izradi samog projekta,
lake i razumljivije je govoriti o veim jedinicama, npr. soba, kuhinja, vrata, prozor i
slino. Kako to izgleda kada koristimo raunare upoznaemo na sledeem primeru.
Pretpostavimo da treba da saberemo etiri broja. U viim programskim jezicima to
radimo korienjem jedne instrukcije (npr. x=a+b+c+d), a kada koristimo simboliki
jezik, prvom instrukcijom aljemo prvi broj u poseban registar (akumulator) a zatim
sledeom instrukcijom dodajemo drugi broj sadraju registra i tako dok ne dodamo
i poslednji broj. Poslednja instrukcija je premetanje konanog rezultata iz registra u
memoriju.

Kratak pregled razvoja programskih jezika 

Programski jezici vieg nivoa


Da bi se premostile potekoe u programiranju na asemblerskim jezicima, veoma rano
poinju da se razvijaju mainski nezavisni jezici, drugim reima jezici vieg nivoa. Korienjem jezika vieg nivoa opis naredbi i podataka vri se na nain blizak prirodnom
(engleskom) jeziku. U ovim jezicima jednoj naredbi odgovara vie naredbi simbolikog
jezika. Vano je napomenuti da ovi jezici imaju visok stepen nezavisnosti u odnosu na
arhitekturu raunara i operativni sistem na kojem se izvravaju.
S obzirom na to da raunar razume samo program napisan na mainskom jeziku, svaki program pisan jezikom vieg nivoa mora se prevesti na mainski jezik. Na
osnovu naina prevoenja i izvravanja, jezike vieg nivoa delimo na kompajlerske i
interpreterske jezike. Najpre su nastali kompajlerski jezici Algol, Fortran, Cobol, PL/I...
Kod ovih jezika izgrauju se programi za prevoenje (kompajleri) kojim se ceo program napisan na viem programskom jeziku prevodi u njemu ekvivalentan, mainski
program koji se moe izvravati na raunaru. Kod interpreterskih jezika, program na
viem programskom jeziku se prevodi i izvrava instrukcija po instrukcija. Primeri
interpreterskih jezika su Lisp, Prolog, Basic, ...
U poetku se razlikovala primena raunara u oblasti poslovanja od primene raunara u nauci i tehnici. Prvu je karakterisao veliki broj ulazno/izlaznih podataka
i relativno jednostavan opis obrade podataka, pa su i jezici namenjeni toj primeni
zadovoljavali te karakteristike (Cobol...). Za primenu u nauci i tehnici karakteristian
je mali broj ulazno/izlaznih podataka, ali i veoma sloen opis obrade, pa su razvijani
jezici za te namene poput Fortrana, Algola,... U to vreme programski jezik PL/I bio
je dovoljno dobar za primenu u poslovanju kao i za primenu u oblasti sloenih numerikih izraunavanja. Dananjim razvojem jezika gubi se ova podela i savremeni
programski jezici mogu se koristiti ravnopravno u svim oblastima.
Prema nainu reavanja problema, moemo izvesti podelu viih programskih
jezika na proceduralne i deklarativne programske jezike. U proceduralnim jezicima
jezikom dajemo raunaru kompletan skup instrukcija kojim se reava problem, tj.
dajemo mu algoritam za reavanje zadataka. Ovim jezicima opisujemo kako se reava
dati problem. Manje-vie svi poznatiji vii programski jezici su ovog tipa: Fortran,
Cobol, Basic, Pascal, C kao i mainski zavisni jezici. Kasnije, u razvoju programskih
jezika dolazi se do ideje da se problemi opisuju, a da sam interpreter ima ugraene
postupke kako da rei opisani problem to dovodi do razvoja deklarativnih jezika.
Ovim jezicima opisujemo ta znamo o problemu i ta elimo da dobijemo reavajui ga, a sistem (interpreter) sam dolazi do postupka za reavanje problema. Primeri
deklarativnih jezika su Prolog i SQL. Sistem ima ugraen algoritam koji dovodi do
reenja. Postojanje i pisanje opteg algoritma za nalaenje reenja je glavna potekoa
u razvoju ovih jezika, pa su zato deklarativni jezici obino specijalizovani za odreene
vrste problema. Koliko god da je ova ideja napredna, u praksi je vrlo teko u potpunosti
sprovesti deklarativnost.

 Uvod
Neke deklarativne jezike moemo podeliti na relacijske i funkcijske. Osnovni
objekti u prvima su relacije, a u drugima su funkcije. Ideja razvoja funkcijskih jezika
je u spajanju unapred definisanih funkcija, koje imaju svoje ulaze i izlaze, u cilju dobijanja reenja problema. Programer koji koristi takav programski jezik gleda na razvoj
programa kao na nain spajanja elementarnih funkcija, ime se dobija sistem koji
izraunava eljeni rezultat. Primeri funkcijskih jezika su LISP, LOGO, ML.
Posebnu klasu ine objektno orijentisani jezici, kod kojih su prisutni i proceduralni i neproceduralni elementi. U proceduralnim jezicima isticani su postupci, nain
realizacije (procedura), neke vie ili manje sloene akcije. Podaci su na neki nain u
podreenom poloaju u odnosu na algoritam. Moramo priznati da su podaci razlog
postojanja programa. Svaki postupak obrauje neke podatke (ita ih, prikazuje, menja...). Podaci i akcije koje se izvode nad njima predstavljaju jednu nerazdvojnu celinu,
jer nam podaci bez postupaka kojim ih obraujemo, kao i postupci za obradu bez
podataka, ne znae puno. Kod objektno orijentisanih jezika podaci i postupci su objedinjeni u jednu celinu i ine aktivan objekat, za razliku od podataka u proceduralnim
jezicima koji su krajnje pasivni. Svaki takav objekat izgleda kao mali raunar: on ima
unutranje stanje i ima operacije koje moemo zahtevati da izvri. Jasno moemo
uoiti analogiju izmeu takvih objekata i objekata u realnom svetu.
Posmatrajmo niz imena uenika jednog odeljenja. Kod proceduralnog programiranja niz imena se posmatra kao skup pasivnih podataka. Potom piemo razne
programe za rad sa ovim nizom u cilju njegovog abecednog ureivanja, modifikovanja
(npr. dodavanje novog uenika, brisanje postojeeg uenika...). S jedne strane imamo
podatke, a sa druge, od njih odvojene postupke (procedure) kojima obraujemo te
podatke. Kod objektno orijentisanih jezika, prethodni primer posmatra se objedinjeno:
postoji objekat niz koji s jedne strane ima skup imena, a sa druge strane skup akcija
koje se mogu primenjivati nad tim imenima i jedno od drugog je neodvojivo. Program
koji koristi objekat niz ne mora imati nijedan od postupaka za obradu niza jer su oni
ugraeni u sam objekat.
Mnotvo razliitih objekata moemo uoiti u okruenju grafikih operativnih sistema (GUI, Graphic User Interface). Ikone su objekti. Svakoj je pridruen skup osobina
i akcija koje opisuju kako reaguju na spoljanje dogaaje, ta se deava kada jednom
kliknemo, kada dva puta kliknemo, kad pritisnemo desni taster, kako se ponaaju kada
drimo pritisnut taster na miu i slino.
U objektno orijentisanom programiranju cilj programera je da sakupi podatke i
akcije u neku vrstu kutije sa alatom koju e koristiti za brzi razvoj aplikacija. Primeri
objektno orijentisanih jezika su SmallTalk, Java, C#. C++ je hibridni jezik; jeste iz klase
objektno orijentisanih jezika ali nije isto objektno orijentisan.
Iz ovog kratkog prikaza razvoja programskih jezika moemo uoiti da objektno
orijentisanim pristupom na prirodan nain opisujemo realan svet. Ipak, prirodnost
opisa nije glavni razlog ozbiljnijeg razvoja objektno orijentisanih jezika, ve je to softverska kriza nastala osamdesetih godina. U to vreme, razvoj hardvera doveo je do

Kratak pregled razvoja programskih jezika 

znatnog poveanja primene raunara u raznim oblastima, pa su samim tim itavi


timovi programera morali da rade na razvoju jednog projekta. Svaki deo tima razvijao
je relativno nezavisne module, a zatim su se ti moduli uklapali u funkcionalnu celinu,
korisniku aplikaciju. Svaki od modula mogue je koristiti u razliitim aplikacijama.
Na taj nain dolazi se do standardizacije aplikativnog softvera.
S druge strane, pored razvijanja objektno orijentisane metodologije u programiranju, razvojem interneta javila se i potreba da napisani projekti rade identino na
razliitim platformama (operativnim sistemima...). Razvojem programskog jezika Java,
koji je primer objektno orijentisanog pristupa, na neki nain se prevazilaze razliite
platforme na kojima bi se softver izvravao. Java tehnologija izvorno je bila zamiljena
za prenos multimedije mreom raznovrsnih ureaja.

Ponovimo ukratko:
Program u proceduralnom jeziku je niz naredbi koji odreuje KAKO se odreena
akcija obavlja (npr. otvori datoteku, ako nije EOF proitaj podatak, ..., zatvori
datoteku)
Program u neproceduralnom jeziku je niz naredbi koji odreuje TA treba uiniti
(npr. izdvoji podatke koji zadovoljavaju dati uslov)
Program u objektno orijentisanom jeziku moemo shvatiti kao skup objekata
koji izmeu sebe i sa spoljnim svetom komuniciraju putem poruka.

Algoritmi
Reavanje problema primenom raunara
Da bismo reili neki problem korienjem raunara, neophodno je kreirati program
u nekom programskom jeziku. Taj proces je kompleksan i u njemu moemo izdvojiti
sledee faze:

Postavka problema
Problem koji se reava treba precizno i potpuno opisati na prirodnom jeziku.
To radi korisnik kome je namenjen program u saradnji sa programerima.
Jasno se odreuje cilj, analiziraju se postojee informacije i vri se izbor neophodnih poetnih informacija, opisuju se svi podaci.

Analiza problema
U ovoj fazi definiu se ulazni i izlazni podaci, ogranienja njihovih vrednosti
i precizno definiu veze izmeu podataka. Rezultat ove faze je formalan
opis problema, izrada matematikog modela koji se moe realizovati na raunaru.

 Uvod

Razrada algoritma
U ovoj fazi se definie nain na koji se od poetnih, ulaznih podataka dolazi
do traenih, izlaznih. Veina problema moe se reiti na vie naina, zato
treba proanalizirati sve naine i izabrati optimalan. Sloenost reenja problema moemo posmatrati sa aspekta broja potrebnih operacija (vremena
potrebnog za izvravanje algoritma), i sa aspekta potrebnih memorijskih
resursa da se algoritam izvri (prostorna sloenost algoritma). Dokaz o korektnosti izabranog postupka za reavanje problema neophodno je precizno
izvesti. O ovim aspektima treba posebno voditi rauna pri reavanju sloenih
problema, dok ih kod jednostavnih problema zanemarujemo.

Projektovanje opte strukture programa


U ovoj fazi vri se izbor programskog jezika. Razmatra se ceo problem i deli
se u logike celine; svaka celina se dalje deli u zavisnosti od njene sloenosti. Precizno se definie nain uvanja informacija, tj. definie se struktura
podataka.

Kodiranje
U ovoj fazi opisuju se, u nekom programskom jeziku, podaci i postupak
reavanja problema, koji su definisani u prethodnim fazama. Program zapisan u nekom programskom jeziku esto se zove kd, zato se ova faza i naziva kodiranje. Ako smo u prethodnim fazama precizno razradili algoritam,
strukturu programa i strukturu podataka, ova faza je relativno jednostavna
za izvoenje.

Faza prevoenja, izvravanja i testiranja programa


Podsetimo se da se na raunaru moe izvravati samo program koji je napisan pomou binarnih cifara (na mainskom jeziku). Zato je potrebno program napisan na programskom jeziku vieg nivo prevesti na mainski jezik;
prevoenje se vri pomou posebnih programa: kompajlera, odnosno interpretera. Da bi se program izvravao, potrebno je formirati izvrnu verziju
(EXE verzija). To se postie pomou specifinih programskih alata koji se razlikuju od jezika do jezika (poveziva, bilder). esto su faza prevoenja i faza
pravljenja izvrnog fajla objedinjene. Testiranjem programa treba proveriti
da li program reava postavljeni zadatak. To je vrlo vana faza u kojoj treba
otkriti eventualno skrivene greke. Za otkrivanje greaka koristimo testove
kojima treba da obuhvatimo sve mogue situacije, svakako i one kad postavljeni problem nema reenja. Po potrebi se vraamo na prethodne faze.

Izrada dokumentacije
U dokumentaciji programa opisuje se ta program radi, daju se uputstva
kako se koristi, detaljnije se opisuje algoritam kada su u pitanju sloeniji
problemi i slino. Dokumentaciju nikako ne treba zapoinjati kada je pro-

Algoritmi 

gram ve napisan, ve je treba pisati tokom izrade programa, ali je svakako


treba dopuniti na kraju kada je program zavren.

Odravanje programa
Tokom korienja programa mogu se uoiti neke greke, koje se moraju otkloniti. Ponekad treba izvriti neke promene u programu usled novih okolnosti. Ako je program itko napisan i ako ima dobru dokumentaciju, onda
je ova faza jednostavna, kako za same autore programa, tako i za druge
programere. U suprotnom mnogim programerima je lake da napiu novi
program nego da prepravljaju ve postojei. U ovoj fazi dolazi i do proirivanja programa dodavanjem novih funkcionalnosti.

Kada se razvija veliki projekat, sve prethodno navedene faze su jednako vane.
Osposobljavanje programera za uspeno realizovanje velikih projekata je dugotrajan
proces. U edukaciji polazimo od jednostavnih primera ka sloenijim. U ovom procesu
problemi koje reavamo su jednostavni pa su sve faze, osim faze razrade algoritma,
jednostavne.

Pojam i karakteristike algoritma


Termin algoritam potie od imena arapskog matematiara Al Horezmija (oko 825.
godine nove ere). On je izvravanje aritmetikih operacija prikazivao u obliku uputstava koja se sastoje od osnovnih koraka. Takav nain opisivanja reenja od tada se
u matematici naziva algoritam. Daljim razvojem nauke algoritam je postao jedan od
osnovnih pojmova u matematici i raunarstvu.
Algoritam je konaan niz jednostavnih koraka kojim se opisuje postupak reavanja odreenog realnog problema, ali takav da se posle konano mnogo vremena
postupak zavrava.
Mnoge realne situacije se odvijaju po tano odreenim koracima tako da moemo
rei da su algoritmi sastavni deo svakodnevnog ivota. Postoji relativno precizan postupak po kome pokreemo automobil, telefoniramo, prelazimo ulicu, kuvamo kafu
ak moemo rei da se i sam ivot odvija po nekim pravilima. Dobar primer algoritma
je svaki kulinarski recept; u njemu jasno razlikujemo ta je ulaz (potrebni sastojci), ta
je obrada (precizno opisan postupak za kuvanje) i ta je izlaz (gotovo jelo).
Algoritam moemo u najoptijim crtama prikazati slikom.
Ulaz

Primer 1:
Posmatrajmo postupak telefoniranja:

Obrada

Izlaz

 Uvod
i) Podiemo slualicu.
ii) Biramo broj.
iii) Razgovaramo.
iv) Prekidamo vezu.
U opisanom postupku moemo uoiti niz nedostataka. ta ako nemamo odgovarajui signal prilikom podizanja slualice, ili ako je linija zauzeta posle biranja broja?
ta u sluaju kada uspostavimo vezu a pozvani korisnik se ne javlja? To su situacije
koje prethodnim opisom postupka nisu predviene.
Realne situacije su po pravilu znatno sloenije i da bismo ih opisali, neophodan je
precizniji pristup svim detaljima. U procesu reavanja odreenih problema, esto se
susreemo sa uslovima koji odreuju dalji tok reavanja. Zato je pri izradi algoritma
neophodno omoguiti takozvane uslovne korake. Neke nedostatke uoene u prethodnom opisu postupka telefoniranja moemo prevazii na sledei nain:
i) Podiemo slualicu.
ii) Ako nemamo odgovarajui signal, kraj postupka (neuspeno telefoniranje).
iii) Biramo broj.
iv) Ako se pozvani korisnik javi, razgovaramo.
v) Prekidamo vezu, kraj postupka.
Opisani postupak otklanja neke od navedenih nedostataka, ali i dalje ostaju nerazjanjene mnoge situacije. U postupku telefoniranja uobiajeno je da u sluaju zauzea
linije ponavljamo postupak dok se veza ne uspostavi ili dok ne odustanemo od poziva.
Potreba za ponavljanjem delova procesa vrlo je esta u realnim situacijama. Zato je
neophodno pri opisu algoritma koristiti takozvane cikline korake. Jedan od naina
kako ciklini korak moemo ugraditi u prethodni primer je sledei:
i) Podiemo slualicu.
ii) Ako nemamo odgovarajui signal, kraj postupka (neuspeno telefoniranje).
iii) Biramo broj.
iv) Ako dobijamo signal zauzea, ponitavamo poziv i ponavljamo korak iii.
v) Ako se pozvani korisnik javi, razgovaramo
vi) Sputamo slualicu, kraj postupka.
U prethodnom opisu postupka telefoniranja, koraci iii i iv ine ciklus u kome je
korak iii telo ciklusa (korak koji se izvrava pri svakom prolasku kroz ciklus) a korak iv uslovni korak kojim je odreeno trajanje ciklusa. I ovako opisanim postupkom
telefoniranja nisu u potpunosti obuhvaene sve situacije koje se mogu javiti pri tom
procesu, ali zbog velikog broja tih situacija u ovom trenutku neemo se baviti daljom
razradom ovog algoritma.

Algoritmi 

Svaki algoritam mora da ima sledea svojstva:


definisanost
svaki korak u algoritmu mora biti jednoznano definisan;

determinisanost
vrednost koja se dobija posle izvravanja svakog koraka jednoznano je
odreena vrednostima iz prethodnog koraka;

konanost
rad algoritma mora se zavriti u konanom broju koraka;

rezultativnost
algoritam mora dati rezultat za sve situacije za koje je kreiran;

masovnost
algoritam treba da obezbedi reavanje cele grupe problema koji se razlikuju
samo po ulaznim veliinama.

Algoritam je upotrebljiv ako se njegovom primenom dobija rezultat u konanom


razumnom vremenu. Algoritam koji bi birao potez igraa aha tako to e ispitati sve
mogue posledice poteza, zahtevao bi milijarde godina na najbrem raunaru.
Postupci izrade algoritama nisu jednoznani, inae, ve bi postojali generatori
algoritama. Samim tim, algoritmizacija problema zahteva i odreenu dozu kreativnosti.
U praksi algoritmi se na raunaru predstavljaju izvornim kodom (source) nekog
vieg programskog jezika. Svi programski jezici podleu strogim pravilima pisanja instrukcija i definisanja podataka koji su za svaki programski jezik razliiti.