LOGO
“ Add your company slogan ”
Uvod u programiranje p rogramiranje Gla lav va 1 – Uv Uvo od Zimski semestar 2013 v0.3
PMF Novi Sad Departman za matematiku i informatiku
Slajd 2 od 49
Slajd 2 od 49
Slajd 3 od 49
Ø U ovom poglavlju kratko emo se upoznati sa razvojem programskih jezika
i kriterijumima za njihovu podelu. Ø Definisaemo i pojam strukturir strukturiranog anog programira programiranja, nja, koje je, uz objektno-
orijentisano orijentisano programira programiranje, nje, najviše korišen stil programiranja. Ø Pri kraju ovog poglavlja, kratko emo se upoznati sa osobinama Module-2 -
programskog jezika kojeg emo izu#avati na ovom kursu.
Slajd 4 od 49
Slajd 5 od 49
Ø Pod (ra#unarskim) programiranjem obi#no se podrazumeva #ovekova
aktivnost (odnosno, aktivnost programera) usmerena ka rešenju nekog konkretnog problema na ra#unaru. Ø Problem se obi#no rešava konstrukcijom algoritma za rešenje problema, a
algoritam se zapisuje posredstvom programskog jezika. Ø Po jednoj od najopštijih definicija programskog jezika njegova uloga je da
obezbedi konstrukcije (i na#ine) za organizovanje „izra#unavanja“ na ra#unaru. Ø Organizovano izra#unavanje obi#no nazivamo „programom“ izra#unavanja
(ili samo programom).
Slajd 6 od 49
drugoj moguoj definiciji, programski jezik predstavlja sredstvo namenjeno za komunikaciju izme%u #oveka i ra#unara, a služi za opis algoritma na na#in „razumljiv“ ra#unaru (direktno, ili posle niza transformacija).
Ø Po
Ø Program tada predstavlja jedan na #in zapisa algoritma – rešenja postavljenog
problema. Ø Kriterijumi za ocenu programskih jezika mogu biti razni, a vrlo #esto su
protivre#ni. ü Sa aspekta programera
programski jezik treba da je jednostavan za u#enje i lak za korišenje. ü Sa aspekta raunara
programski jezik treba da je jednostavan za prevo%enje na mašinski jezik i da dobro koristi mogunosti ra#unara.
programski jezik treba da omogu i izra#unavanja, tj. pisanje dobrih programa.
Ø Ukratko,
dobro
organizovanje
Slajd 7 od 49
Ø Definicija dobrog programa se menjala tokom godina razvoja programskih
jezika. ü U „pionirskim“ danima programiranja
dobar program je bio onaj koji se brzo izvršavao na ra#unaru i zauzimao malo memorije. ü U današnje vreme
dobrim programom se pre svega smatra program koji je lak za #itanje, razumevanje i održavanje od strane #oveka (programera) i koji se lako može ponovo iskoristiti za rešavanje drugih, sli#nih problema. Ø Izme%u ove dve definicije programiranje je doživelo „softversku krizu“. Ø U me%uvremenu je tako%e postalo jasno da se programiranje sastoji od dve
aktivnosti: razvoja i održavanja programa, pri #emu se na održavanje programa utroši oko 90% vremena od ukupnog „života“ programa.
Slajd 8 od 49
Ø Bez #itkih i jasnih programa i programskih jezika tako definisanih da se u
procesu programiranja otkrije što više grešaka što je mogue ranije (još tokom razvoja programa), napredak u oblasti programiranja (i primene ra#unara uopšte) nije mogu. se organizovanjem #itavog procesa oko razvoja, testiranja i održavanja programa, kao i kreiranjem odgovarajuih pomonih alatki za podršku #itavom tom procesu, bavi posebna disciplina ra#unarskih nauka: softversko inženjerstvo (engl. software engineering ).
Ø Danas
Ø Do kraja ovog odeljka prikazaemo kratko evoluciju programskih jezika.
Slajd 9 od 49
Slajd 10 od 49
Ø Najvei broj današnjih ra#unara zasnovan je na takozvanoj Fon Nojmanovoj
arhitekturi ra#unara (von Neumann). Ø Po toj arhitekturi ra#unar se (grubo govorei) sastoji od dva dela:
centralne jedinice (procesora) i memorije. Ø Centralna jedinica se dalje sastoji od:
kontrolne jedinice, aritmeti#ko-logi#ke jedinice i ulazno-izlazne jedinice. Ø Sve navedene komponente se i danas nalaze u ra #unarima ali su postale
„autonomnije“: ulazno-izlazne jedinice i aritmeti #ko-logi#ka jedinica su postale nezavisne u odnosu na centralni procesor.
Slajd 11 od 49
Ø Mašinski jezik ra#unara je skup binarno kodiranih komandi (instrukcija)
ra#unara na koje ovaj direktno odgovara, odnosno koje neposredno razume i izvršava. Ø Komande pore%ane u neki redosled nazivaju se mašinskim programom. I
program i podaci sa kojima program radi se nalaze u memoriji ra#unara. Ø Komande se mogu podeliti po grupama:
aritmeti#ke, za pristup memoriji (pisanje i #itanje), za uticaj na tok izvršavanja programa, itd. Ø Komanda mašinskog jezika se zapisuje (i zadaje) nizom bitova (nula i
jedinica).
Slajd 12 od 49
Primer. Jedan kratak (hipoteti#ki) mašinski program (od tri komande). 00000100111100111010001010 00000101000100100111100010 00101100101010111111001111 Ø Programiranje u mašinskim jezicima je bilo teško, programi su bili ne #itki i
greške su se lako pravile i još teže pronalazile. Ø Mašinski programi su pisani samo za jedan, odre %eni tip ra#unara – nisu se
mogli izvršavati na drugim ra#unarima.
Slajd 13 od 49
Slajd 14 od 49
Ø Prvi korak u otklanjanju loših strana programiranja u mašinskim jezicima bili
su asemblerski jezici, koji su nastali automatizacijom svakodnevne prakse tadašnjih programera. Ø Oni su programe pisali koriste i se simbolima za komande i imenima za
memorijske lokacije, da bi tek kasnije te simbole i imena pretvarali u prave mašinske komande i memorijske adrese (nizove nula i jedinica). Ø Kada je ta aktivnost „automatizovana“, nastali su asemblerski jezici. Ø U asemblerskim jezicima (engl. assembly language) mašinske komande i
njihovi parametri zapisuju se simbolima (imenima). Ø Poseban program (takozvani asembler, engl. assembler ) prevodi ove simbole
i imena u odgovarajue mašinske komande.
Slajd 15 od 49
Primer. Jednostavni (hipoteti#ki) asemblerski program (koji bi odgovarao naredbi dodeljivanja C := A + B). Ovde su A, B i C imena za memorijske lokacije. LOAD ADD STORE
A B C
Ø U po#etku je svakoj asemblerskoj komandi odgovarala ta#no jedna mašinska
komanda. Ø Kasnije je jednoj asemblerskoj komandi odgovaralo više mašinskih komandi, a
omogueno je i izdvajanje delova koda (koji se #esto ponavlja) u potprograme – „makro-asemblerski“ jezici. Ø Time je zapo#eo proces apstrakcije u programskim jezicima – „sakrivanje“ mašinske
arhitekture iza konstrukcija programskog jezika. Ø Asemblerski programi se još uvek ne mogu prenositi sa ra#unara na ra#unar, a na
traženje i ispravljanje grešaka pri razvoju programa otpada 25 do 50% vremena. Slajd 16 od 49
Slajd 17 od 49
Ø Dobre osobine apstrakcije neminovno dovode do nastanka viših programskih
jezika sredinom šezdesetih godina (FORTRAN-a, na primer). Ø Viši programski jezici poseduju visoki nivo apstrakcije i potpuno su
nezavisni od ra#unara. Primer. Primer naredbe višeg programskog jezika. d := a*b - c Ø Programi koji prevode viši programski jezik u mašinski jezik konkretnog
ra#unara nazivaju se prevodiocima (kompajlerima, engl. compiler ). Ø Viši programski jezici i programi pisani u njima nezavisni su od ra #unara na
kome e se izvršavati. Ø Da bi se programi pisani na nekom višem programskom jeziku izvršavali na
razli#itim ra#unarima, na svakom od njih mora biti realizovan prevodilac za taj viši programski jezik. Slajd 18 od 49
Ø Upravo je ovo period kada se javlja softverska kriza. Ø Zahvaljujui višim programskim jezicima, pišu se duži i kompleksniji
programi. Znatno #eše se programira i za korisnike koji nisu iz najuže ra#unarske struke. Ø Vrlo #esto se programira „ad hok“, bez odre %ene metodologije, a na sli #an
na#in se realizuju i prevodioci za više programske jezike. Ø Rezultat su bili dugi i ne #itki programi, puni grešaka koje su se teško
pronalazile i otklanjale. Ø Po#inje period rešavanja softverske krize usavršavanjem programskih jezika
i razvijanjem metodologije programiranja.
Slajd 19 od 49
Ø Na osnovu analize #estih grešaka zaklju #uje se da puno grešaka nastaje
dozvoljavanjem promenljivih.
skokova
(goto
naredba)
i
korišenjem
globalnih
Ø Da bi se to prevazišlo u ve ini programskih jezika se pojavljuju konstrukcije
koje omguavaju strukturirano programiranje i apstrakciju podataka. Ø Javljaju se razli #iti stilovi i metodologije programiranja.
Slajd 20 od 49
Slajd 21 od 49
Ø Danas se smatra (na osnovu iskustva mnogih programera širom sveta i
dosadašnjeg razvoja programskih jezika) da dobar programski jezika treba da: Omogu#i apstrakciju – „sakrivanje“ što god je mogue više nepotrebnih detalja, ostavljajui tako programeru da razmišlja na viskom nivou apstrakcije o problemu koji rešava, zanemaruju i detalje koji bi ga u tom poslu ometali. Omogu#i jezike konstrukcije i koncepte uz pomo kojih prevodilac programskog jezika može da otkrije tokom prevo%enja što je mogu e više grešaka koje bi se ina#e javile tek tokom izvršavanja programa. Ø Prvi od gornja dva zahteva je bitan, jer se smatra da #ovek (programer) ne može
istovremeno da vodi ra#una o mnogo stvari. Ø Zbog toga ga treba rasteretiti i omoguiti mu da ne razmišlja o realizaciji struktura
podataka i operacija onda kada razmišlja o rešenju konkretnog problema, i obrnuto. Slajd 22 od 49
Ø Nepotrebni detalji se naj#eše „sakrivaju“ na sledee na#ine: ü Apstrakcijom podataka Ra#unar podržava mali skup tipova podataka. Programski jezik treba da omogui
definisanje struktura podataka (slogove, skupove...) i kreiranje novih tipova podataka. Realizacija treba da ostane sakrivena. ü Apstrakcijom upravljanja (kontrole) „Pakovanjem“ niza manjih koraka u vee i zatvorene celine i njihovo korišenje bez
uvida u njihovu realizaciju. ü Apstrakcijom naina izvršavanja programa
Na primer, u logi#kom stilu programiranja program se sastoji od skupa pravila i #injenica o problemu koji se rešava. Prevodilac ili interpretator logi#kog programskog jezika vodi ra#una o redosledu koraka na osnovu skupa pravila koga je zadao programer.
Slajd 23 od 49
Ø Rekli smo da je bitno da programski jezik bude definisan tako da prevodiocu
omoguava da bude „strog“ – da ve tokom prevo%enja otkrije što više grešaka koje bi se javile tek tokom izvršavanja programa. Ø Kao primer jedne takve konstrukcije služe tipovi podataka koje podržavaju
gotovo svi moderni programski jezici. Ø Svakoj promenljivoj koja se koristi u programu obavezno se pridružuje tip
podataka, kojim se odre%uje skup vrednosti koje promenljiva može da ima i skup operacija u kojim promenljiva može da u#estvuje. Ø Prevodilac tada može da otkrije da li promenljiva u #estvuje u ispravnim
aktivnostima ili ne.
Slajd 24 od 49
Slajd 25 od 49
Ø Danas postoji više hiljada programskih jezika koji se mogu podeliti po više
razli#itih kriterijuma. Ø Ovde emo pomenuti samo neke od kriterijuma.
Hronologija Ø Po hronologiji jezici se, po jednoj od moguih podela, mogu podeliti na
„generacije“ prema vremenu nastanka na jezike: prve generacije (1954-58): FORTRAN, Algol 58, Flowmatic... druge generacije (1959-69): FORTRAN II, Algol 60, COBOL 61, LISP... tree generacije (1962-80): Pascal, CLU, CSP, Ada, Smalltalk, PL/I, Simula, PROLOG... #etvrte generacije, u koje spadaju jezici orijentisani korisniku: upitni jezici za pretraživanje baza podataka (SQL), specijalizovani jezici koji su deo nekih veih programskih paketa, „skript“ jezici. Slajd 26 od 49
Mašinska zavisnost ØPo stepenu zavisnosti programskog jezika od ra#unara programski jezici se mogu
podeliti na mašinski nezavisne (ili više) programske jezike i mašinski zavisne jezike (gde spadaju mašinski i asemblerski jezici).
Oblast primene ØPo oblasti primene programske jezike možemo podeliti na jezike:
opšte namene (Modula-2, Modula-3, C/C++, Ada, PL/I), za primenu u matematici i tehnici (Pascal, FORTRAN, Modula-2, C/C++), za poslovne obrade (COBOL, RPG, PL/I), za obuku u programiranju (Pascal, Modula-2, BASIC, LISP...), za primenu u vešta#koj inteligenciji (LISP, PROLOG...).
Slajd 27 od 49
Apstrakcija naina izvršavanja programa ØPo tome da li jezik podržava apstrakciju na #ina izra#unavanja ili ne, jezici se
mogu podeliti na proceduralne i deklarativne. vU osnovi proceduralnih jezika je naredba, a programi se sastoje od precizno
navedenih koraka kojima se rešava problem. vMe%u naredbama je od naro#itog zna#aja naredba dodeljivanja, kojom se
pristupa memoriji i menja sadržaj memorijskih lokacija. vProceduralno programiranje se dalje može podeliti na sekvencijalno i
konkurentno po tome da li se programira kao da u ra#unaru postoji jedan ili više procesora. (Modula-2 podržava oba ova stila programiranja.)
Slajd 28 od 49
Apstrakcija naina izvršavanja programa ØPo tome da li jezik podržava apstrakciju na #ina izra#unavanja ili ne, jezici se
mogu podeliti na proceduralne i deklarativne. vZa razliku od proceduralnih programa, programi deklarativnih programskih
jezika (deklarativni programi) sastoje se od opisa problema, a ne od „recepta“ za njegovo rešavanje. v Na osnovu opisa problema, prevodilac deklarativnog programskog jezika
generiše „recept“. vVe pomenuti
logi#ki programski jezici omoguavaju opis problema relacijama (#injenicama i pravilima), a funkcionalni programski jezici omoguavaju opis problema izrazima i funkcijama.
Slajd 29 od 49
Apstrakcija podataka i upravljanja ØPo tome kako jezici podržavaju organizaciju i apstrakciju podataka i
upravljanja (kontrole), oni mogu biti: strukturirani
modularni
i
objektno-orijentisani
(ili neka kombinacija ova tri).
Slajd 30 od 49
Apstrakcija podataka i upravljanja ØPo tome kako jezici podržavaju organizaciju i apstrakciju podataka i
upravljanja (kontrole), oni mogu biti: strukturirani
modularni
i
objektno-orijentisani
.
vProgramski
jezici koji podržavaju strukturirani stil programiranja omoguavaju pravljenje programa koji se lakše pišu, razumljiviji su i #itljiviji od nestrukturiranih programa. vStrukturirano programiranje je prvi korak u apstrakciji kontrole – ono
omoguava jasne, pregledne i lokalizovane kontrolne strukture bez „skokova“. (Danas veina programskih jezika podržava strukturirani stil programiranja.)
Slajd 31 od 49
Apstrakcija podataka i upravljanja ØPo tome kako jezici podržavaju organizaciju i apstrakciju podataka i
upravljanja (kontrole), oni mogu biti: strukturirani
modularni
i
objektno-orijentisani
.
vModularni programski jezici omoguavaju „razbijanje“ programa na više
relativno nezavisnih celina koji se mogu zasebno programirati i prevoditi. programiranje omoguava apstrakciju podataka i kontrole sakrivajui realizaciju, a ostavljaju i „vidljivim“ samo imena (struktura) podataka i njihovih operacija. vModularno
Slajd 32 od 49
Apstrakcija podataka i upravljanja ØPo tome kako jezici podržavaju organizaciju i apstrakciju podataka i
upravljanja (kontrole), oni mogu biti: strukturirani
modularni
i
objektno-orijentisani
.
vObjektno-orijentisani jezici (ili jezici koji podržavaju objektno-orijentisano
programiranje) za sada omoguavaju najveu apstrakciju podataka i kontrole. vOni dozvoljavaju „pakovanje“ i podataka i kontrole (procedura) u istu
strukturu i „nasle%ivanje“ ponašanja tih struktura, bez uvida u na#in njihove realizacije.
Slajd 33 od 49
Slajd 34 od 49
Ø Jedan od prvih i najpopularnijih programskih jezika bio je Pascal, koji je
dizajnirao i realizovao profesor Niklaus Virt (Niklaus Wirth) 1970. godine na Eidogenössische Technische Hochschule (ETH), Cirih. Ø Pascal je doneo strukturu jezika koja je jednostavna za u #enje i za dobro
strukturiranje algoritama i podataka. Ø Od svih stilova programiranja pomenutih u prethodnom poglavlju Pascal
podržava samo strukturirano programiranje, što je vremenom postalo nedovoljno. Ø Najvei nedostaci su mu bili to što nije podržavao modularno programiranje,
što nije dozvoljavao programiranje niskog nivoa i imao je vrlo loš pristup funkcijama operativnog sistema ra #unara.
Slajd 35 od 49
Ø Virt je 1975. godine razvio modularni eksperimentalni jezik Modula. Ø Kao posledica ovog rada i rezultata eksperimentalnog rada na jeziku Mesa, Virt je
1977. godine zapo#eo rad na novom programskom jeziku Modula-2. Ø Virt je u Modulu-2 uklju#io sva dobra svojstva Pascal-a i dodao mogunost
modularnog programiranja, konkurentnog programiranja i programiranja „niskog nivoa“ (za sistemsko programiranje). Ø Modula-2 je dakle proceduralni programski jezik (po kriterijumu apstrakcije na#ina
izra#unavanja) koji podržava i sekvencijalno i konkurentno programiranje. Ø Po kriterijumu apstrakcije kontrole i podataka, Modula-2 podržava strukturirani i
modularni stil programiranja. Ø Standardizivana
(ISO)
verzija
Module-2
podržava
i
objektno-orijentisano
programiranje. Ø Modula-2 je viši (mašinski nezavisan) programski jezik. Slajd 36 od 49
Slajd 37 od 49
Ø Strukturirano programiranje je stil programiranja koji ima svoju jasnu
definiciju i odrednice. Ø Me%utim, #esto se ovaj pojam meša sa nekim njemu sli #nim pojmovima, kao
što su realizacija programa od gore na dole ili sa globalnom koncepcijom rešenja nekog problema i upravljanjem toka programiranja. Ø Strukturirani program je program koji se sastoji iz blokova koji su odabrani
iz unapred datog, fiksnog skupa osnovnih blokova.
Slajd 38 od 49
N1
...
N2
Nn
a) Niz naredbi (sekvenca)
I
DA
NE N2
NE
I
N
DA
N1
I
N
DA
NE b) Grananje
c) Petlja sa preduslovom
d) Petlja sa postuslovom
Slajd 39 od 49
I
N1
N2
...
Nn
e) Alternativa (selekcija) Slajd 40 od 49
Ø Osnovni blok je prost blok koji ne sadrži proste podblokove sa više od jednog
elementa (#vora). Ø Prost blok je blok za koji važi da:
ima jedan ulaz i jedan izlaz iz bloka, za svaku „ta#ku“ u bloku postoji put od ulaza do izlaza koji prolazi kroz tu ta#ku. Ø Korišenjem samo blokova iz unapred zadatog skupa blokova uvodi se
disciplina u postupak rešavanja problema i programiranja i #ini program jasnijim, #itljivijim, bez improvizacija i sa manjim brojem grešaka. Ø Osnovni blokovi strukturiranog programiranja #esto se zovu kontrolnim
strukturama strukturiranog programiranja, odnosno programskog jezika koji podržava strukturirano programiranje.
Slajd 41 od 49
Slajd 42 od 49
Ø Mnogi po#etnici u programiranju ne prave razliku izme%u programskog
jezika i njegove realizacije na konkretnom ra#unaru. Ø Programski jezik je skup pravila („dogovor“), koji postoji nezavisno od
ra#unara i nezavisno od toga da li je realizovan za neki ra#unar ili ne. Ø Realizacije programskog jezika za neki ra #unar obavezno se sastoji od
prevodioca ili interpretatora programskog jezika za taj ra#unar, a može da sadrži i još neke mogunosti. Ø Realizacija programskog jezika može da maksimalno iskoristi osobine
programskog jezika na datom ra#unaru, ali ne može da ih poboljša. Ø Programski jezik dakle treba birati zbog dobrih osobina i mogu nosti jezika, a
ne toliko zbog dobre realizacije.
Slajd 43 od 49
Ø Ipak, treba napomenuti i da pojedine realizacije programskog jezika ponekad
menjaju i definiciju jezika, standardizovan.
pogotovo
ako
programski
jezik
nije
Ø &esto i sama definicija jezika nije dovoljno precizna tako da omogu uje
razli#ita tuma#enja, a vrlo #esto se dodaju nove konstrukcije da bi se bolje iskoristile osobine ra#unara na kojoj se jezik realizuje. je mogue, treba izbegavati korišenje nestandardnih osobina programskog jezika, jer program tako nee biti prenosiv na neku drugu realizaciju programskog jezika (ako se to smatra bitnim).
Ø Ako
Slajd 44 od 49
Ø Definicija programskog jezika se sastoji od sintakse i semantike. Ø Sintaksa jezika je skup pravila za pravljenje ispravnih programa. Ø Sintaksno ispravni program, me%utim, nije dovoljno dobro definisan program
– potrebno je da znamo i njegovo zna enje. Ø Semantika programskog jezika je skup pravila kojim se odre %uje zna#enje
programa nekog programskog jezika.
Slajd 45 od 49
Ø Na primer, naredba:
c := izracunaj(a, b);
je sintaksno ispravna naredba nekog programa, ali bez definisanog zna#enja nije mogue ta#no odrediti kakav je efekat ove naredbe. Jedino se zna da se poziva funkcijska procedura izracunaj sa parametrima a i b, ali se ne zna da li je funkcijska procedura izracunaj uopšte definisana, da li je dobro pozvana (da li se stvarni parametri slažu po broju i tipu sa formalnim) i kona#no, ako je sve ovo dobro, šta uopšte izra#unava procedura izracunaj?
Slajd 46 od 49
Ø Sintaksu
pojedinih konstrukcija sintaksnim dijagramima.
Module-2
opisivaemo
takozvanim
Ø Semantiku pojedinih konstrukcija Module-2 opisivaemo re#ima i primerima. Ø Sintaksnim dijagramom se grafi#ki opisuju ispravne konstrukcije nekog
programskog jezika. Ø Jedna konstrukcija je sintaksno ispravna ako i samo ako može da se dobije
kretanjem kroz graf u pravcu strelica.
Slajd 47 od 49
Ø U sintaksnom dijagramu emo unutar kružnica i elipsi navoditi rezervisane
re#i i standardna imena programskog jezika, dok emo unutar pravougaonika navoditi imena za ostale konstrukcije jezika. Ø Svi pojmovi navedeni unutar pravougaonika moraju biti definisani nekim
sintaksnim dijagramom ili moraju biti intuitivno jasni. Primer. Sintaksni dijagram sa slike 1.2 opisuje slede e ispravne konstrukcije programskog jezika: a1, a, b1aab, itd., dok sledee konstrukcije (po gornjoj definiciji) nisu ispravne: 1, !ab ... slovo cifra slovo
1.2 Ime (identifikator) Slajd 48 od 49