To C++ or not to C++?
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š
ć
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

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,

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
č
eš
ć
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
Ovaj materijal je namenjen za učenje i pripremu, ne za predaju.
Slični dokumenti