1

1

0. To C++ or not to C++?

Više nego bilo kada u povijesti, 

č

ovje

č

anstvo

se nalazi na razme

đ

i. Jedan put vodi u o

č

aj i

krajnje bezna

đ

e, a drugi u potpuno

istrebljenje. Pomolimo se da 

ć

emo imati

mudrosti izabrati ispravno.

Woody Allen, “Popratne pojave” (

1

980)

Prilikom pisanja ove knjige mnogi su nas, s podsmijehom kao da gledaju posljednji
primjerak snježnog leoparda, pitali: “No zašto se bavite C++ jezikom? To je
kompliciran jezik, spor, nedovoljno efikasan za primjenu u komercijalnim programima.
Na kraju, ja to sve mogu napraviti u obi

č

nom C-u.” Prije nego što po

č

nemo objašnjavati

pojedine zna

č

ajke jezika, nalazimo važnim pokušati dati koliko-toliko suvisle odgovore

na ta i sli

č

na pitanja.

Osnovno pitanje je što C++ 

č

ini boljim i pogodnijim op

ć

enamjenskim jezikom za

pisanje programa, od operacijskih sustava do baza podataka. Da bismo to razumjeli,
pogledajmo kojim putem je tekao povijesni razvoj jezika. Na taj na

č

in 

ć

e možda biti

jasnija motivacija Bjarne Stroustrupa, “oca i majke” jezika C++. Dakle, krenimo “od
stolje

ć

a sedmog”.

0.1. Povijesni pregled razvoja programskih jezika

Prva ra

č

unala koja su se pojavila bila su vrlo složena za korištenje. Njih su koristili

isklju

č

ivo stru

č

njaci koji su bili osposobljeni za komunikaciju s ra

č

unalom. Ta

komunikacija se sastojala od dva osnovna koraka: davanje uputa ra

č

unalu i 

č

itanje

rezultata obrade. I dok se 

č

itanje rezultata vrlo brzo u

č

inilo koliko-toliko snošljivim

uvo

đ

enjem pisa

č

a na kojima su se rezultati ispisivali, unošenje uputa – programiranje –

se sastojalo od mukotrpnog unosa niza nula i jedinica. Ti nizovi su davali ra

č

unalu upute

kao što su: “zbroji dva broja”, “premjesti podatak s neke memorijske lokacije na drugu”,
“sko

č

i na neku instrukciju izvan normalnog slijeda instrukcija” i sli

č

no. Kako je takve

programe bilo vrlo složeno pisati, a još složenije 

č

itati i ispravljati, ubrzo su se pojavili

prvi programerski alati nazvani 

asembleri 

(engl. 

assemblers

).

U asemblerskom jeziku svaka strojna instrukcija predstavljena je mnemonikom koji

je razumljiv ljudima koji 

č

itaju program. Tako se zbrajanje naj

č

ć

e obavlja

mnemonikom 

ADD

, dok se premještanje podataka obavlja mnemonikom 

MOV

. Time se

postigla bolja 

č

itljivost programa, no i dalje je bilo vrlo složeno pisati programe i

ispravljati ih jer je bilo potrebno davati sve, pa i najmanje upute ra

č

unalu za svaku

pojedinu operaciju. Javlja se problem koji 

ć

e kasnije, nakon niza godina, dovesti i do

2

0. To C++ or not to C++?

pojave C++ programskog jezika: potrebno je razviti programerski alat koji 

ć

e osloboditi

programera rutinskih poslova te mu dopustiti da se usredoto

č

i na problem koji rješava.

Zbog toga se pojavljuje niz viših programska jezika, koji preuzimaju na sebe neke

“dosadne” programerske poslove. Tako je FORTRAN bio posebno pogodan za
matemati

č

ke prora

č

une, zatim BASIC koji se vrlo brzo u

č

io, te COBOL koji je bio u

pravilu namijenjen upravljanju bazama podataka.

Oko 

1

972. se pojavljuje jezik C, koji je direktna prete

č

a današnjeg jezika C++. To

je bio prvi jezik op

ć

e namjene te je postigao nevi

đ

en uspjeh. Više je razloga tome: jezik

je bio jednostavan za u

č

enje, omogu

ć

avao je modularno pisanje programa, sadržavao je

samo naredbe koje se mogu jednostavno prevesti u strojni jezik, davao je brzi kôd. Jezik
nije bio optere

ć

en mnogim složenim funkcijama, kao na primjer 

skupljanje sme

ć

a

 (engl.

garbage collection

): ako je takav podsustav nekome trebao, korisnik ga je sam napisao.

Jezik je omogu

ć

avao vrlo dobru kontrolu strojnih resursa te je na taj na

č

in omogu

ć

io

programerima da optimiziraju svoj kôd. Do unatrag nekoliko godina, 99% komercijalnih
programa bili su pisani u C-u, ponegdje dopunjeni odsje

č

cima u strojnom jeziku kako bi

se kriti

č

ni dijelovi sustava u

č

inili dovoljno brzima.

No kako je razvoj programske podrške napredovao, stvari su se i na podru

č

ju

programskih jezika po

č

ele mijenjati. Složeni projekti od nekoliko stotina tisu

ć

a, pa i više

redaka više nisu rijetkost, pa je zbog toga bilo potrebno uvesti dodatne mehanizme
kojima bi se takvi programi u

č

inili jednostavnijima za izradu i održavanje, te kojima bi

se omogu

ć

ilo da se jednom napisani kôd iskoristi u više razli

č

itih projekata.

Bjarne Stroustrup (ro

đ

en u Danskoj) je 

1

979. godine zapo

č

eo rad na jeziku “C s

razredima” (engl. 

C with Classes

). Prije toga, on je radio na svom doktoratu u

Computing Laboratory of Cambridge

 te istraživao distribuirane sustave: granu

ra

č

unalne znanosti u kojoj se prou

č

avaju modeli obrade podataka na više jedinica

istodobno. Pri tome koristio se jezikom Simula, koji posjedovao neka važna svojstva
koja su ga 

č

inila prikladnim za taj posao. Na primjer, Simula je posjedovala pojam

razreda: strukture podataka koje objedinjavaju podatke i operacije nad podacima.
Korištenje razreda omogu

ć

ilo je da se koncepti problema koji se rješava izraze direktno

pomo

ć

u jezi

č

nih konstrukcija. Dobiveni kôd je bio vrlo 

č

itljiv i razumljiv, a g.

Stroustrup je bio posebno fasciniran na

č

inom na koji je sam programski jezik upu

ć

ivao

programera u razmišljanju o problemu. Tako

đ

er, jezik je posjedovao sustav tipizacije,

koji je 

č

esto pomagao korisniku u pronalaženju pogrešaka ve

ć

 prilikom prevo

đ

enja.

Naoko idealan u teoriji, jezik Simula je posrnuo u praksi: prevo

đ

enje je bilo

iznimno dugotrajno, a kôd se izvodio izuzetno sporo. Dobiveni program je bio
neupotrebljiv i, da bi ipak pošteno zaradio svoj doktorat, gospodin Stroustrup se morao
potruditi i ponovo napisati cjelokupni program u jeziku BCPL – jeziku niske razine koji
je omogu

ć

io vrlo dobre performanse prevedenog programa. No iskustvo pisanja

složenog programa u takvom jeziku je bilo užasno i g. Stroustrup je, po završetku svog
posla na Cambridgeu, 

č

vrsto sebi obe

ć

ao da više nikada ne

ć

e takav složen problem

pokušati riješiti neadekvatnim alatima poput BCPL-a ili Simule.

Kada se 

1

979. zaposlio u 

Bell Labs

 (kasnije 

AT&T

) u Murray Hillu, zapo

č

eo je rad

na onome što 

ć

e kasnije postati C++. Pri tome je iskoristio svoje iskustvo ste

č

eno

background image

4

0. To C++ or not to C++?

Ovakav programski pristup je bio vrlo uspješan do kasnih osamdesetih, kada su

njegovi nedostaci postajali sve o

č

itiji. Naime, odvajanje podataka i procedura 

č

ini

programski kôd težim za 

č

itanje i razumijevanje. Prirodnije je o podacima razmišljati

preko operacija koje možemo obaviti nad njima – u gornjem primjeru to zna

č

i da o

kocki ne razmišljamo pomo

ć

u koordinata njenih kutova ve

ć

 pomo

ć

u mogu

ć

ih operacija,

kao što je rotacija kocke.

Nadalje, pokazalo se složenim istodobno razmišljati o problemu i odmah

strukturirati rješenje. Umjesto rješavanja problema, programeri su mnogo vremena
provodili pronalaze

ć

i na

č

ine da programe usklade sa zadanom strukturom.

Tako

đ

er, današnji programi se pokre

ć

u pomo

ć

u miša, prozora, izbornika i dijaloga.

Programiranje je 

pogonjeno doga

đ

ajima 

(engl. 

event-driven

) za razliku od starog,

sekvencijalnog na

č

ina. Proceduralni programi su korisniku, u trenutku kada je bila

potrebna interakcija korisnika (na primjer zahtjev za ispis na pisa

č

u) prikazivali ekran

nude

ć

i mu opcije; ovisno o odabranoj opciji, izvo

đ

enje kôda se usmjeravalo na odre

đ

eni

programski odsje

č

ak. 

Pogonjeno doga

đ

ajima 

zna

č

i da se program ne odvija po

unaprijed odre

đ

enom slijedu, ve

ć

 se programom upravlja pomo

ć

u niza doga

đ

aja.

Doga

đ

aja ima raznih: pomicanje miša, pritisak na tipku, izbor stavke iz izbornika i

sli

č

no. Sada su sve opcije dostupne istodobno, a program postaje interaktivan, što zna

č

i

da promptno odgovara na korisnikove zahtjeve i odmah (ovo ipak treba uvjetno shvatiti)
prikazuje rezultat svoje akcije na zaslonu ra

č

unala.

Kako bi se takvi zahtjevi jednostavnije proveli u praksi, razvijen je objektni pristup

programiranju. Osnovna ideja je razbiti program u niz zatvorenih cjelina koje zatim
me

đ

usobno sura

đ

uju u rješavanju problema. Umjesto specijaliziranih procedura koje

barataju podacima, radimo s objektima koji objedinjavaju operacije i podatke. Pri tome
je važno što objekt radi, a ne kako on to radi. To omogu

ć

ava da se pojedini objekt može

po potrebi izbaciti i zamijeniti drugim, boljim, ako oba rade istu stvar.

Klju

č

 za postizanje takvog cilja jest spajanje podataka i operacija, poznato pod

nazivom 

enkapsulacija 

(engl. 

encapsulation

). Pritom su podaci privatni za svaki objekt

te ne smiju biti dostupni ostalim dijelovima programa. To svojstvo se naziva 

skrivanje

podataka

 

(engl. 

data hiding

). Svaki objekt svojoj okolini pruža isklju

č

ivo podatke koji

su joj neophodni da bi se objekt mogao iskoristiti. Ti podaci zajedno s operacijama koje
ih prihva

ć

aju ili vra

ć

aju 

č

ine 

su

č

elje

 objekta. Programer koji 

ć

e koristiti taj objekt više

se ne mora zamarati razmišljaju

ć

i o na

č

inu na koji objekt funkcionira – on jednostavno

traži od objekta odre

đ

enu uslugu.

Kada PC preprodava

č

, vlasnik poduze

ć

a “Taiwan/tavan-Commerce” sklapa

ra

č

unalo, on zasigurno treba ku

ć

ište (iako se i to ponekad pokazuje nepotrebnim). To ne

zna

č

i da 

ć

e on morati po

č

eti od nule (miksaju

ć

i atome željeza u 

č

ašici od Kinderlade);

on 

ć

e jednostavno oti

ć

i kod susjednog dilera i kupiti gotovo ku

ć

ište koje ima priklju

č

ak

na mrežni napon, ATX napajanje, ladice za montažu diskova te otvor za disketu. Tako je
i u programiranju: mogu

ć

e je kupiti gotove programske komponente koje se zatim mogu

iskoristiti u programu. Nije potrebno razumjeti kako komponenta radi – dovoljno je
poznavati njeno su

č

elje da bi ju se moglo iskoristiti.

0.3. Usporedba s C-om

5

Tako

đ

er, kada projektanti u Renaultu žele izraditi novi model automobila, imaju

dva izbora: ili mogu po

č

eti od nule i ponovo prora

č

unavati svaki najmanji dio motora,

šasije i ostalih dijelova, ili mogu jednostavno novi model bazirati na nekom starom
modelu. Kako je kompaniji vrlo vjerojatno u cilju što brže razviti novi model kako bi
pretekla konkurenciju, gotovo sigurno 

ć

e jednostavno uzeti uspješan model automobila i

samo izmijeniti neka njegova svojstva: promijenit 

ć

e mu liniju, poja

č

ati motor, dodati

ABS ko

č

nice. Sli

č

no je i s programskim komponentama: prilikom rješavanja nekog

problema možemo uzdahnuti i po

č

eti kopati, ili možemo uzeti neku ve

ć

 gotovu

komponentu koja je blizu rješenja i samo dodati nove mogu

ć

nosti. To se zove 

ponovna

iskoristivost 

(engl. 

reusability

) i vrlo je važno svojstvo. Za novu programsku

komponentu kaže se da je 

naslijedila 

(engl. 

inherit

) svojstva komponente iz koje je

izgra

đ

ena.

Korisnik koji kupuje auto sigurno ne

ć

e biti presretan ako se njegov novi model

razlikuje od starog po na

č

inu korištenja (primjerice da se umjesto pritiskom na papu

č

icu

gasa auto ubrzava povla

č

enjem ru

č

ice na krovu vozila ili spuštanjem suvoza

č

evog

sjedala): on jednostavno želi pritisnuti gas, a stvar je nove verzije automobila primjerice
kra

ć

e vrijeme ubrzanja od 0 do 

1

00 km/h. Sli

č

no je i s programskim komponentama:

korisnik se ne treba optere

ć

ivati time koju verziju komponente koristi – on 

ć

e

jednostavno tražiti od komponente uslugu, a na njoj je da to obavi na adekvatan na

č

in.

To se zove 

polimorfizam 

(engl. 

polimorphism

).

Gore navedena svojstva zajedno sa

č

injavaju objektno orijentirani model

programiranja. Evo kako bi se postupak rotiranja trodimenzionalnih likova proveo
koriste

ć

i objekte:

1

.

 

Listaj sve objekte redom.

2.

 

Zatraži od svakog objekta da se zarotira za neki kut.

Sada glavni program više ne mora voditi ra

č

una o tome koji se objekt rotira – on

jednostavno samo zatraži od objekta da se zarotira. Sam objekt zna to u

č

initi ovisno o

tome koji lik on predstavlja: kocka 

ć

e se zarotirati na jedan na

č

in, a kubi

č

ni spline na

drugi. Tako

đ

er, ako se bilo kada kasnije program proširi novim tijelima, nije potrebno

mijenjani program koji rotira sve objekte – samo je za novi objekt potrebno definirati
operaciju rotacije.

Dakle, ono što C++ jezik 

č

ini vrlo pogodnim jezikom op

ć

e namjene za izradu

složenih programa jest mogu

ć

nost jednostavnog uvo

đ

enja novih tipova te naknadnog

dodavanja novih operacija.

0.3. Usporedba s C-om

Mnogi okorjeli C programeri, koji sanjaju strukture i dok se voze u tramvaju ili
razmišljaju o tome kako 

ć

e svoju novu rutinu riješiti pomo

ć

u pokaziva

č

a na funkcije,

dvoume se oko toga je li C++ doista dostojan njihovog kôda: mnogi su u strahu od
nepoznatog jezika te se boje da 

ć

e im njihov supermunjeviti program za zbrajanje dvaju

jednoznamenkastih brojeva na novom jeziku biti sporiji od programa za ra

č

unanje

fraktalnog skupa. Drugi se, pak, kunu da je C++ odgovor na sva njihova životna pitanja,

background image

0.4. Usporedba s Javom

7

Sli

č

no je i s objektnom tehnologijom: možda 

ć

e i dobiveni kôd biti sporiji i ve

ć

i od

ekvivalentnog C kôda, no jednostavnost njegove izrade 

ć

e sigurno omogu

ć

iti da

dobiveni program bude bolji po nizu drugih karakteristika: bit 

ć

e jednostavnije izraditi

program koji 

ć

e biti lakši za korištenje, s više mogu

ć

nosti i sli

č

no. Uostalom, manje

posla – ve

ć

a zarada! (Raj zemaljski!) Tehnologija ide naprijed: dok se gubi neznatno na

brzini i memorijskim zahtjevima, dobici su višestruki.

Tako

đ

er, C++ nije svemo

ć

an. Korištenje objekata ne

ć

e napisati pola programa

umjesto vas: ako želite provesti crtanje objekata u tri dimenzije i pri tome ih realisti

č

no

osjen

č

ati, namu

č

it 

ć

ete se pošteno koristite li C ili C++. To niti ne zna

č

i da 

ć

e

poznavanje objektne tehnologije jam

č

iti da 

ć

ete ju i ispravno primijeniti: ako se ne

potrudite prilikom izrade razreda te posao ne obavite u duhu objektnog programiranja,
ne

ć

e biti ništa od ponovne iskoristivosti kôda. 

Č

ak i ako posao obavite ispravno, to ne

zna

č

i da jednog dana ne

ć

ete nai

ć

i na problem u kojem 

ć

e jednostavno biti lakše

zaboraviti sve napisano i po

č

eti “od jajeta”.

Ono što vam objektna tehnologija pruža jest mogu

ć

nost da manje pažnje obratite

jeziku i na

č

inu na koji 

ć

ete svoju misao izraziti, a usredoto

č

ite se na ono što zapravo

želite u

č

initi. U gornjem slu

č

aju trodimenzionalnog crtanja objekata to zna

č

i da 

ć

ete

manje vremena provesti razmišljaju

ć

i gdje ste pohranili podatak o položaju kamere koji

vam baš sad treba, a više 

ć

ete razmišljati o tome kako da ubrzate postupak sjen

č

anja ili

kako da ga u

č

inite realisti

č

nijim.

Objektna tehnologija je pokušala dati odgovore na neke potrebe ljudi koji rješavaju

svoje zadatke ra

č

unalom; na vama je da procijenite koliko je to uspješno, a u svakom

slu

č

aju da prije toga pro

č

itate ovu knjigu do kraja i preporu

č

ite ju prijateljima, naravno.

Jer tak’ dobru i guba knjigu niste vidli ve

ć

 sto godina i baš vam je bilo fora ju 

č

itat

.

0.4. Usporedba s Javom

Nakon što je izašlo prvo izdanje knjige, jedan od 

č

ć

ih komentara je bio: “A zašto

(radije) niste napisali knjigu o Javi?”. Odgovor je vrlo jednostavan: da smo onda
napisali knjigu o Javi, ta knjiga bi ve

ć

 nakon godinu dana bila zastarjela! Kada smo

krajem 

1

995. godine po

č

eli pisati knjigu, Java je bila tek u povojima (u svibnju te

godine objavljena je prva alfa verzija Jave). Danas (listopad 2000.) je to ve

ć

 prili

č

no

zrela tehnologija koja je prošla niz izmjena, a realno je o

č

ekivati još takvih promjena do

njena potpunog “sazrijevanja”. Upravo zbog toga je (barem za sada) nezahvalno raditi
isklju

č

ive usporedbe tipa “ovo je puno bolje napravljeno u jeziku A nego u jeziku B”.

Pokušajmo stoga samo nazna

č

iti koje su zna

č

ajnije razlike izme

đ

u Jave i jezika C++;

kona

č

ne zaklju

č

ke prepuštamo 

č

itatelju.

0.4.1. Java je potpuno objektno orijentirani programski jezik

To zna

č

i da se sve operacije odvijaju isklju

č

ivo kroz objekte, odnosno preko njihovih

funkcijskih 

č

lanova (metoda). Stoga je programer od po

č

etka prisiljen razmišljati na

objektno orijentirani na

č

in. S druge strane, jezik C++ omogu

ć

ava pisanje i

Želiš da pročitaš svih 104 strana?

Prijavi se i preuzmi ceo dokument.

Ovaj materijal je namenjen za učenje i pripremu, ne za predaju.

Slični dokumenti