Professional Documents
Culture Documents
Gnu PDF
Gnu PDF
programerski alati
Aleksandar Samardi
Matematiki fakultet
Univerzitet u Beogradu
Predgovor
Operativni sistem UNIX nastao je na prelazu izmeu 60-tih i 70-tih godina
u AT&T Bell istraivakim laboratorijama kao produkt nastojanja grupe
programera da za svoje potrebe naprave adekvatno radno okruenje, a pod
uti
ajem operativnog sistema Multi
s na ijem je razvoju veina njih prije
toga radila. Od ovakvog ini
ijalno skromno postavljenog
ilja UNIX je vremenom izrastao u moan i veoma rairen operativni sistem i tu svoju pozi
iju
je zadrao do danas.
Postoji vie razloga za veliku popularnost koju je ovaj operativni sistem
stekao; za poetno irenje UNIX -a svakako je najzaslunija njegova implementa
ija u drugoj itera
iji na C programskom jeziku1 , ime je praktino
postao prvi operativni sistem implementiran na viem programskom jeziku
umjesto na asembleru. Ovo je omoguilo portovanje UNIX -a na vei broj
arhitektura koje su tada bile u upotrebi, to je predstavljalo znatnu prednost u odnosu na postojee operativne sisteme koji su bili striktno vezani za
arhitekturu za koju su ini
ijalno bili razvijeni. Takoe, irenju popularnosti
UNIX -a svakako je bitno doprinijelo to to ga je AT&T besplatno dijelio
univerzitetima i drugim zainteresovanim stranama od kojih je pak zauzvrat
dobijao zakrpe za postojee programe, kao i sasvim nove programe kojima je
onda proirivan bazni operativni sistem - duh slobodne
irkula
ije rezultata
programerskog rada od poetka je bio sastavni dio UNIX kulture (sa svim
pozitivnim i negativnim posledi
ama). Ipak, svakako da je najvei razlog uspjeha UNIX -a njegov izuzetan ini
ijalni dizajn; kon
epti na kojima je UNIX
izgraen su izdrali probu vremena i omoguili mu da ak i sada, 30 godina nakon nastanka, bude tehniki superioran u odnosu na ostale operativne
sisteme.
Zajedno sa ekspanzijom UNIX -a tokom sedamdesetih i poetkom osamdesetih godina dolo je i do njegove fragmenta
ije, takoe i do negativnih prom1
C jezik je upravo namjenski razvijen radi implementa ije UNIX operativnog sistema
ii
Predgovor
Sadraj
Predgovor
13
GNU g C
15
21
33
GNU gprof
41
GNU ar
CVS
prevodila
47
51
iv
SADRAJ
Poglavlje 1
nakon ega e biti kreiran novi prozor1 za ema
s program. ema
s se, kao i
sve ispravno pisane X Window System aplika
ije, moe kongurisati preko
tzv. resursa. Izgled ema
s prozora po startovanju je prikazan na sli
i 1.1.
Glavninu prozora zauzima naravno povrina namijenjena za unos teksta, pri
vrhu prozora nalazi se meni, sa lijeve strane je s
roll-bar, a pri dnu prozora nalaze se jedno iznad drugog statusna linija i tzv. minibuer koji slui
za unos dodatnih parametara komandi ema
s -a. I pored toga to program
sadri meni i s
roll-bar kao standardne elemente grakog korisnikog interfejsa, te to reaguje na odreeni broj komandi miem, ema
s je zamiljen
tako da se komande prevashodno zadaju sa tastature. tavie, radi to breg
ku
anja sve komande se mogu (i trebaju) zadavati bez pomjeranja ruku sa
glavnog dijela tastature. Takav rad sa ema
s -om je najekasniji i zato treba
od poetka nastojati da se komande zadaju na ovaj nain.
Za zadavanje komandi sa tastature obino se koriste tasteri Ctrl i Alt u kombina
iji sa nekim slovima. Ovi tasteri se u ema
s dokumenta
iji oznaavaju
1
U tabeli 1.1 dat je pregled ovih komandi. Treba uoiti da se ovdje komande
koje ukljuuju upotrebu Ctrl tastera uglavnom odnose na elementarne jedini
e teksta (karaktere, linije), dok se komande koje ukljuuju upotrebu
Alt tastera odnose na semantike jedini
e teksta (rijei, reeni
e, paragra).
Pored komandi nabrojanih u tabeli, na veini tastatura alternativno se mogu
koristiti standardni tasteri za pomjeranje kursora (tasteri sa streli
ama, tasteri PgUp i PgDn itd.); meutim kombina
ije tastera navedene u tabeli
omoguavaju da se komande izdaju bez pomjeranja ruku sa glavnog dijela
tastature pa ih treba, kako je ve sugerisano, to prije usvojiti. Isto vai i za
pozi
ioniranje kursora korienjem mia - s
roll-bar se moe koristiti za tu
namjenu2
Komanda
C-f
C-b
C-p
C-n
M-f
M-b
C-a
C-e
M-a
M-e
C-v
M-v
M-<
M->
C-l
Efekat komande
pomjeranje kursora za jedan karakter unaprijed
pomjeranje kursora za jedan karakter unazad
pomjeranje kursora na prethodnu liniju
pomjeranje kursora na narednu liniju
pomjeranje kursora za jednu rije unaprijed
pomjeranje kursora za jednu rije unazad
pomjeranje kursora na poetak linije
pomjeranje kursora na kraj linije
pomjeranje kursora na poetak reeni
e
pomjeranje kursora na kraj reeni
e
pomjeranje kursora za jedan ekran unaprijed
pomjeranje kursora za jedan ekran unazad
pomjeranje kursora na poetak teksta
pomjeranje kursora na kraj teksta
pomjeranje teksta tako da linija u kojoj se nalazi kursor doe
na sredinu ekrana
treba da bude izvrena vie puta. Tako npr. ako se eli da se kursor pomjeri
za 5 linija unaprijed, odgovarajua sekven
a komandi bi glasila C-u 5 C-n.
Sa druge strane, zadavanje ili izvravanje neke komande se moe u svakom
trenutku prekinuti komandom C-g.
Unoenje teksta pomou ema
s -a se naravno vri prosto tako to se uku
aju
odgovarajui karakteri. Ukoliko se prilikom unosa teksta doe do kraja linije
na ekranu, dalje uneseni karakeri e biti prikazani u narednoj liniji pri emu
e na kraj prve linije biti stavljena obrnuta kosa
rta (\) da oznai da na tom
mjestu zapravo nije kraj linije. Komanda za zadavanje broja ponavljanja se
moe koristiti i za unos karaktera - ako se iza ove komande i broja ponavljanja
ne zada neka druga komanda ve obian karakter, ema
s e taj karakter
unijeti u tekst zadati broj puta.
Za brisanje teksta u ema
s -u postoji vie naredbi. Brisanje karaktera koji
se nalazi ispred kursora vri se pomou Del tastera. Karakter iza kursora se
brie komandom C-d. Po analogiji, rije ispred kursora se brie istovremnim
pritiskom Alt i Del tastera, dok se rije iza kursora brie M-d komandom.
Slino, tekst od pozi
ije kursora do kraja linije se brie komandom C-k, dok se
tekst od pozi
ije kursora do poetka linije brie komandom M-k. Komanda
C-k, ukoliko je linija prazna brie samu liniju. Za brisanje veih djelova
teksta, treba pritisnuti istovremeno tastere Ctrl i Spa
e na poetku (odn.
kraju) dijela teksta koji se eli obrisati i onda se pozi
ionirati na kraj (odn.
poetak) tog dijela teksta i tamo izvriti komandu C-w. Ovako obrisani dio
teksta moe se u svakom trenutku povratiti naredbom C-y. Ako se eli na
taj nain povratiti neki dio teksta nakon koga je bilo jo slinih brisanja,
treba nakon komande C-y izdavati komandu M-y sve dok se ne pojavi dio
teksta koji se eli povratiti. Ukoliko se neki dio teksta ne eli obrisati na
ovaj nain, ve samo sauvati da bi kasnije bio ubaen na neko mjesto, onda
na kraju (odn. poetku) tog dijela teksta umjesto komande C-w treba zadati
komandu M-w.
Ponitavanje poslednje ak
ije (tzv. undo ) u ema
s -u se vri komandom C-x
u ili alternativno komandom C-_. Komande koje ne mijenjaju tekst se ne
pamte, pa se ne mogu ni ponititi. Sama undo komanda takoe se pamti,
tako da je za ponitavanje njenog efekta potrebno prvo izdati neku komandu
koja ne mijenja tekst (da se ne bi nastavilo sa ponitavanjem efekta prethodnih komandi), npr. pomjeriti kursor na neki nain, a zatim opet izdati undo
komandu.
Otvaranje fajla u ema
s -u se vri komandom C-x C-f nakon ega u minibuer u treba zadati ime fajla. Pritom se moe koristiti standardna shell ekspanzija
- ukoliko se uku
a poetak imena fajla i potom pritisne Tab taster ime fajla
e biti dopunjeno ukoliko je jedinstveno, a ukoliko nije u donjem dijelu ema
s
prozora bie izlistani svi fajlovi koji imaju takav poetak imena (ova lista e
sama nestati kada se uku
a puno ime fajla). ema
s u naelu ne dozvoljava
rad sa neimenovanim fajlovima tako da se kreiranje novog fajla vri tako
to se na isti nain zada C-x C-f komanda i onda spe
i
ira ime koje e u
ovom sluaju biti dato novom fajlu. Snimanje fajla se vri komandom C-x
C-s. Prilikom snimanja ema
s pravi kopiju stare verzije fajla pod imenom
koje je jednako originalom imenu sa karakterom kao suksom. Takoe,
tokom rada ema
s automatski povremeno snima tekuu verziju fajla dodajui karakter # kao preks i suks imenu - ovaj fajl moe da se iskoristi za
oporavak dijela onog to je uraeno u sluaju eventualnog pu
anja programa.
Ime tekueg fajla inae uvijek stoji u statusnoj liniji.
ema s naravno podrava rad sa vie fajlova. Svakom otvorenom fajlu se dodjeljuje tzv. bafer; takoe u ema s -u postoje i neki baferi koji nisu pridrueni
fajlovima. Lista tekuih bafera se moe dobiti komandom C-x C-b. Ova
komanda e podijeliti ema
s prozor na dva potprozora3 ; da bi se oslobodilo
drugog prozora treba pozi
ionirati kursor u onaj prozor u kome se eli ostati
i izdati komandu C-x 1. Da bi se odjednom sauvao sadraj svih bafera
koji su povezani sa fajlovima treba izdati komandu C-x s, nakon ega e za
svaki od takvih bafera koji su editovani biti postavljeno pitanje da li se eli
sauvati njihov sadraj u odgovarajuem fajlu.
minibuer -u).
Za pretraivanje u ema
s -u se koriste komande C-s za pretraivanje unaprijed i C-r za pretraivanje unazad. Po izdavanju ovih komandi u minibuer -u
treba zadati i string koji se trai; pretraivanje e poeti jo dok se string
zadaje. Za ponavljanje pretraivanja treba opet izdati komandu C-s odn.
C-r. Pretraivanje utie na pozi
iju kursora, tj. kursor se pri svakom pretraivanju pozi
ionira na mjesto na kome je pronaen dati string.
Kako je ve reeno, ema
s prozor moe u nekim situa
ijama biti podijeljen na vie potprozora. Da bi se to uradilo dok se edituje neki fajl treba
zadati komandu C-x 2. Nakon toga se prozor dijeli na dva potprozora i
svaki od njih sadri po jedan bafer koji odgovara datom fajlu. Ovi baferi se
mogu nezavisno editovati, mada se najee ovo radi da bi se imao stalno na
pogledu jedan dio fajla dok se edituje drugi njegov dio. Komandom C-x o se
prelazi iz jednog u drugi potprozor. Dok se nalazi u nekom potprozoru, moe
se u njemu otvoriti i neki drugi fajl standardom komandom za otvaranje fajla
C-x C-f.
Ve je pomenuto da statusna linija u ema
s -u sadri ime fajla. Ispred imena
se nalaze zvjezdi
e ukoliko je bafer modikovan - kada se snimi sadraj bafera
u fajl ove zvjezdi
e nestaju. Na desnom kraju statusne linije nalazi se indikator trenutne pozi
ije u okviru teksta i to prvo kao broj linije sa preksom
L, a potom kao pro
enat u odnosu na itav tekst. Izmeu imena fajla i ovih
indikatora nalazi se oznaka ema
s moda. U ema
s -u se razlikuju glavni (major ) i sporedni (minor ) modovi; u jednom trenutku moe biti aktivan samo
jedan glavni mod, dok istovremeno moe biti aktivno vie sporednih modova.
Oznaka u statusnoj liniji se odnosi na glavni mod. Glavni mod se odreuje
prema tipu teksta koji se unosi i ema
s podrava veliki broj ovih modova
koji se odnose na editovanje odgovarajuih vrsta fajlova - tako npr. postoji
mod za pisanje C programa, mod za pisanje obinog teksta, mod za pisanje
TEX dokumenata itd. U svakom od ovih modova ema
s na odgovarajui
nain pomae pri unosu teksta; re
imo u C modu automatski uvlai nove
linije i boji pojedine rijei prema sintaksi jezika, takoe nudi i mnoge druge
mogunosti o kojima e vie rijei biti u ostalim poglavljima. Pored toga,
ema
s stavlja na raspolaganje i posebne komande za rad sa datom vrstom
teksta - neke od ovih komandi su dostupne i preko posebne stavke u meniju
koja se pojavljuje ispred Help stavke. Sporedni modovi se odnose na neke
ire primjenjive naine obrade teksta koji se mogu ukljuivati po elji i kombinovati sa glavnim modom i drugim sporednim modovima. Jedan primjer
ovakvog moda je tzv. Auto Fill mod koji automatski uba
uje novi red nakon
odreenog broja (70 u podrazumijevanom stanju) karaktera. Ovaj mod se
ema
s je visoko kongurabilan program. Pored kongurisanja standardnih parametara X Window System aplika
ije koje je pomenuto na poetku,
svaki segment ema
s -a koji se odnosi na rad sa tekstom se moe kongurisati. Obzirom da se ispod ema
s -a zapravo nalazi Lisp interpreter, to se
ova podeavanja izvode Lisp izrazima za dodjeljivanje vrijednosti odreenim
varijablama odn. za pozivanje funk
ija. Sve komande koje se izdaju sa tastature se zapravo na kraju svode na izvravanje ovakvih izraza. Od posebnog
znaaja su svakako trajna podeavanja, tj. ona podeavanja za koja se eli
da budu na snazi svaki put kada se pokrene ema
s. Ovakva podeavanja
treba kao odgovarajue Lisp izraze upisati u /.ema
s fajl. Tako npr. ako
se eli postaviti podrazumijevani broj karaktera nakon koga e linija biti
prelomljena u ovaj fajl treba staviti liniju:
(setq-default fill-
olumn 78)
a ukoliko se eli da kada je na snazi Text glavni mod da uvijek bude aktivan
i Auto Fill sporedni mod, u ovaj fajl treba dodati liniju:
(add-hook 'text-mode-hook 'turn-on-auto-fill)
Ako se npr. hoe da region teksta bude oznaen pri markiranju sa tastature
na isti nain kao to to biva kada se region markira miem, odgovarajua
linija u /.ema
s fajlu bi glasila:
(setq-default transient-mark-mode t)
Poglavlje 2
Primjer - rjeavanje kvadratne
jednaine
Za demonstriranje GNU programerskih alata bie korien jednostavan primjer programa koji nalazi realne korijene kvadratne jednaine ax2 + bx + c.
U ovom poglavlju dat je izvorni kod po fajlovima koji sainjavaju taj mali
projekat. U duhu UNIX kon
epta pravljenja malih programa koji primaju
ulazne podatke sa standardnog ulaza u tekstulanom formatu i tampaju
rezultate na standardnom izlazu opet u tekstualnom formatu, program e
sa standardnog ulaza itati koe
ijente kvadratne jednaine a, b i c, a na
standardnom izlazu ispisati broj realnih korijena te jednaine, kao i same
korijene (ukoliko ih ima). Sa druge strane, u duhu pro
eduralne paradigme
na kojoj je zasnovan C jezik, izraunavanje korijena jednaine bie izdvojeno
u posebnu funk
iju i poseban fajl u odnosu na glavni program koji sadri kod
za uitavanje ulaznih podataka odn. ispis rezultata.
Pretpostaviemo da je za ovaj projekat kreiran poseban direktorijum sa
imenom quadri
. Fajl u kome se nalazi funk
ija za odreivanje korijena
kvadratne jednaine zvae se quadri
.
i imae sledei sadraj:
#in
lude <math.h>
#in
lude "quadri
.h"
int
quadri
(double a, double b, double
, double *x0, double *x1)
{
double dis
r;
/* Diskriminanta jedna
ine. */
double mul;
/* Re
ipro
na vrijednost imenio
a u razlomku
* koji odredjuje rjesenja jedna
ine. */
10
/*
* Izra
unava se diskriminanta jedna
ine.
*/
dis
r = b * b - 4 * a *
;
/*
* Ukoliko je diskriminanta ve
a od 0, jedna
ina ima dva realna
* rjesenja. Izra
unavaju se rjesenja jedna
ine i upisuju u loka
ije
* na koje ukazuju x0 i x1, a iz funk
ije se vra
a 2 kao broj realnih
* rjesenja.
*/
if (dis
r > 0)
{
dis
r = sqrt (dis
r);
mul = 1 / (2 * a);
*x0 = (-b + dis
r) * mul;
*x1 = (-b - dis
r) * mul;
return 2;
}
/*
* Ukoliko je diskriminanta jednaka 0, jedna
ina ima jedno realno
* rjesenje. Izra
unava se vrijednost tog rjesenja i upisuje u
* loka
iju na koju ukazuje x0, a iz funk
ije se vra
a 1 kao broj
* realnih rjesenja.
*/
if (dis
r == 0)
{
*x0 = -b / (2 * a);
return 1;
}
/*
* Ukoliko je diskriminanta manja od 0 jedna
ina nema realnih
* rjesenja, pa se iz funk
ije vra
a 0.
*/
return 0;
Interfejs ove funk
ije bie dat u quadri
.h fajlu. Obzirom da onaj ko koristi
funk
iju treba da vodi rauna samo o interfejsu (tj. u prin
ipu ne treba da
uopte gleda quadri
.
fajl), u ovom fajlu je funk
ija detaljno dokumentovana. Fajl ima oblik:
#ifndef quadri
_h
#define quadri
_h
/*
*
*
*
*
*
*
11
Na kraju, glavni program u kome se uitavaju koe
ijenti jednaine sa standardnog ulaza, poziva quadri
funk
ija da izrauna realna rjeenja jednaine
i ispisuju ta rjeenja na standardni izlaz bie u fajlu test.
(ime potie od
toga to zapravo ovaj dio koda slui za testiranje ispravnosti implementa
ije
funk
ije quadri
()) i imae oblik:
#in
lude <stdio.h>
#in
lude "quadri
.h"
/*
* Program pronalazi realna rjesenja date kvadratne
* jedna
ine. Koefi
ijenti jedna
ine se u
itavaju sa standardnog ulaza,
* da bi se potom na standardnom izlazu odstampao broj realnih rjesenja
* jedna
ine, a zatim, ako jedna
ina ima realnih rjesenja, i sama
* rjesenja. Program nema ugradjenu provjeru gresaka na ulazu.
*/
int
main ()
{
double a, b,
;
/* Koefi
ijenti kvadratne jedna
ine. */
int
ount;
/* Broj realnih rjesenja jedna
ine. */
double x0, x1;
/* Realna rjesenja jedna
ine. */
/*
* U
itavaju se koefi
ijenti jedna
ine.
*/
s
anf ("%lf%lf%lf", &a, &b, &
);
/*
* Odredjuju se realna rjesenja jedna
ine.
*/
ount = quadri
(a, b,
, &x0, &x1);
/*
* Ispisuje se broj realnih rjesenja jedna
ine.
*/
printf ("%d\n",
ount);
/*
* Ispisuju se rjesenja jedna
ine.
*/
swit
h (
ount)
{
ase 1:
12
return 0;
Mada je za dalji tekst od najveeg znaaja ustvari opisana raspodjela projekta po fajlovima, poeljno je da se u ovom trenutku proui i sam kod i
pritom obrati posebna panja na dekompozi
iju problema na potprobleme,
te na detaljno komentarisanje i davanje deskriptivnih imena promjenljivim u
nastojanju da se kod uini to itljivijim. Sve nabrojano je naravno poeljno
pri bilo kakvom programiranju, ali se smatra i obaveznim u UNIX zajedni
i.
Poglavlje 3
14
kopije - u fajlu sa suksom . Ako se kao argument navede samo jedan fajl,
onda je mogue korienjem op
ije -o2 ekspli
itno zadati ime fajla u koji e
biti smjeten reformatirani kod:
indent hello.
-o beautified.
GNU indent ima jako veliki broj op
ija (vidjeti odgovarajue info strani
e)
koje omoguavaju da se podesi skoro svaki zamislivi aspekat formatiranja
koda. Ipak, najee se koristi nekoliko predenisanih stilova od kojih svaki
podrazumijeva odreenu kombina
iju op
ija formatiranja. Podrazumijevani
stil, koji se primjenjuje kada se ne navede nikakva op
ija (kao u gornjim
primjerima) je obino GNU stil formatiranja3 . Ovaj stil je primijenjen na
formatiranje fajlova iz prethodog poglavlja. Pored GNU stila koji se moe
i ekspli
itno zadati op
ijom -gnu, indent podrava i tzv. Kernigan-Rii stil
(prema formatiranju koda u knjizi Programski jezik C od ovih autora) koji
se zadaje op
ijom -kr, npr.:
indent -kr hello.
kao i tzv. Berkli stil koji se zadaje op
ijom -orig. Ako se pored op
ije za stil
navede ekspli
itno i neka pojedinana op
ija koja se razlikuje od op
ije koju
za odgovarajui aspekt formatiranja propisuje dati stil, onda pojedinano
zadata op
ija ima prioritet i primjenjuje se njome odreeno formatiranje.
na UNIX -u se op
ije programu obino zadaju tako to se navede
rti
a i slovo koje
predstavlja skraeni
u za op
iju; u ovom sluaju u pitanju je op
ija sa argumentom
(imenom fajla) koji se zadaje iza
rti
e i slova
3
GNU stil, odnosno one njegovi aspekti koje editor moe obezbijediti, primjenjuje i
ema
s za reformatiranje tokom editovanja
Poglavlje 4
GNU g C
prevodila
Centralno mjesto u paleti programerskih alata svakako zauzima C prevodila
; GNU verzija ovog programa jeste g
prevodila
. Ukoliko se C program
nalazi u jednom fajlu, npr. sa imenom hello.
, nain pozivanja prevodio
a
je veoma jednostavan:
g
hello.
fajl; u suprotnom e prevodila
ispisati poruke o grekama zajedno sa referen
ama na linije u kojima se te greke javljaju u izvornom fajlu. g
ima
meutim veliki broj op
ija kojima se mogu no podeavati parametri prevoenja; najvanije od njih bie pobrojane u daljem tekstu. Prva od takvih
op
ija jeste op
ija za zadavanje imena izvrnog programa; ako se ova op
ija
ne zada, izvrni program e uvijek nositi ime a.out. Spe
i
iranje imena
izvrnog programa se vri -o op
ijom, pa ako se u gornjem sluaju eli da se
taj fajl zove hello1 , odgovarajua naredba bi glasila:
g
-o hello hello.
GNU g C
16
prevodila
17
GNU g C
18
prevodila
ovo je iz razloga ekasnosti, na taj nain je duina izvrnog fajla kraa ako se ne
koriste funk
ije iz ovog dijela standardne biblioteke
6
lib iz imena biblioteke se nikad na navodi kada se ime biblioteke spe
i
ira -l op
ijom
linkera
19
20
GNU g C
prevodila
Poglavlje 5
22
terminom make alati, a GNU varijanta ovog alata upravo i nosi ime make 1 .
Da bi make mogao da obavi svoj posao, mora mu se zadati skup pravila
na osnovu kojih se vri auriranje fajlova koji zavise od nekih drugih fajlova. Ovaj skup pravila se upisuje u tzv. makele fajl koji najee ima
ime Makefile ili makefile, odn. GNUmakefile ako sadri neke konstruk
ije
spe
ine za GNU verziju make alata. Pod pretpostavkom da se u tekuem
direktorijumu nalazi makele sa odgovarajuim imenom, pozivanje programa
se vri naredbom:
make
Obino makele sadri vei broj pravila; make pritom uvijek izvrava samo
jedno pravilo i to ili ono koje je prvo u listi ako iza naredbe make nije nita
navedeno ili pak ono pravilo iji je
ilj naveden iza make naredbe. Ukoliko se
u zavisnostima ovog
ilja javi neki drugi
ilj iz makele -a onda se rekurzivno
izvava i pravilo koje se odnosi na taj drugi
ilj i tako redom. Na taj nain,
u makele -u za posmatrani primjer kao prvo bi trebalo navesti pravilo za
generisanje samog izvrnog programa, a potom pravila za generisanje objektnih fajlova, pa bi makele mogao imati oblik:
test: quadri
.o test.o
g
-lm -o test quadri
.o test.o
1
slino indent programu, na BSD varija
ijama UNIX -a se ovim imenom referen
ira
originalna verzija ovog alata, dok se GNU make pokree komandom gmake
23
Pod pretpostavkom da je make program pokrenut bez argumenata, bie analizirano prvo pravilo. Prvi elemenat iz liste zavisnosti je
ilj drugog pravila,
pa e make prei na analizu drugog pravila. Ovdje su zavisnosti obini fajlovi, pa e make odrediti (prostim poreenjem datuma zadnje izmjene fajla
koji predstavlja
ilj i fajlova koji predstavljaju zavisnosti) da li je potrebno
aurirati
ilj i eventualno to auriranje uraditi pokretanjem komande koja je
navedena u drugom pravilu. make se nakon toga vraa na analizu prvog pravila, ustanovljava da je i drugi element liste zavisnosti
ilj i prelazi na analizu
odgovarajueg (treeg) pravila. Ovo pravilo se obrauje na isti naina kao
drugo pravilo, ako je potrebno regenerie se fajl test.o i make se opet vraa
na analizu prvog pravila. Ovaj put sve zavisnosti su ve aurirane tako da
se sada mogu porediti vremena njihovih zadnjih izmjena sa vremenom zadnje izmjene
ilja prvog pravila i eventualno pokrenuti komanda navedena u
prvom pravilu da bi se izvrni fajl aurirao. Nakon toga make zavrava rad,
a svi fajlovi u projektu ostaju u auriranom stanju.
Mada je gornji makele potpuno funk
ionalan, on se moe uiniti znatno
itljivijim i lakim za odravanje korienjem promjenljivih. Promjenljive se
u makele -ovima uvode prosto tako to se navede ime promjenljive, potom
znak jednakosti i onda vrijednost koja se dodjeljuje promjenljivoj. Referen
iranje promjenljive se vri tako to se ime promjenljive navede izmeu
obinih zagrada, sa znakom $ kao preksom. U datom primjeru bi se mogla
uvesti jedna promjenljiva da uva egove -ansi -Wall koji se prenose C prevodio
u. Takoe, moe se uvesti jedna promjenljiva da uva listu biblioteka
sa kojima treba linkovati izvrni program, kako bi eventualno dodavanje
biblioteka u tu listu bilo pojednostavljeno. Pored toga, obino se i sam prevodila
referen
ira preko promjenljive zato to razni prevodio
i na UNIX -u
uglavnom rade na isti nain, ali imaju drugaija imena pa se onda postie da
se prostom izmjenom vrijednosti ove promjenljive isti makele moe koristiti
i sa nekim drugim prevodio
em. Sa navedenim izmjenama, makele bi dobio
oblik:
CC
= g
CFLAGS = -ansi -Wall
LDLIBS = -lm
test: quadri
.o test.o
24
U toku pisanja komandi za neko pravilo, na raspolaganju su odreene spe
ijalne promjenljive; tako promjenljiva $ predstavlja
ilj pravila, promjenljiva
$ sadri listu svih zavisnosti pravila, a promjenljiva $< sadri prvu iz liste
zavisnosti. Koristei ove promjenljive, moe se gornji makele kompaktnije
zapisati u obliku:
CC
= g
CFLAGS = -ansi -Wall
LDLIBS = -lm
test: quadri
.o test.o
$(CC) -o $ $^ $(LDLIBS)
quadri
.o: quadri
.
quadri
.h
$(CC) $(CFLAGS) -
-o $ $<
test.o: test.
quadri
.h
$(CC) $(CFLAGS) -
-o $ $<
ako takvog ima, ako je pak zadata samo ova op
ija onda u fajl sa istim imenom kao
ulazni fajl
3
pretpostavlja se da se fajlovi iz standardne biblioteke na datom sistemu nee mijenjati,
te da ih nije potrebno navoditi u listi zavisnosti
25
CC
= g
CFLAGS = -ansi -Wall
LDLIBS = -lm
test: quadri
.o test.o
$(CC) -o $ $^ $(LDLIBS)
quadri
.o: quadri
.
$(CC) $(CFLAGS) -
-o $ -MMD $<
test.o: test.
$(CC) $(CFLAGS) -
-o $ -MMD $<
-in
lude quadri
.d test.d
26
CC
= g
CFLAGS = -ansi -Wall
LDLIBS = -lm
test: quadri
.o test.o
$(CC) -o $ $^ $(LDLIBS)
%.o: %.
=
=
=
=
quadri
.
test.
g
-ansi -Wall
-lm
27
= sr
da bi ovi fajlovi bili pronaeni, a onda bi prevoenje teklo na isti nain kao
i ranije.
Ve je pomenuto da se sa gornjim nainom automatskog generisanja zavisnosti moe pojaviti jedan problem. Radi se o tome da kada se neki od
fajlova sa kodom obrie ili mu se promijeni ime, make nee biti u stanju da
prevede projekat, jer e taj fajl i dalje da stoji u listi zavisnosti, a nee biti
nikakvog pravila da se isti regenerie. Rjeenje ovog problema jeste da se za
svako automatski generisano pravilo o zavisnosti doda jo jednom pravilo u
kome se zavisnosti javljaju kao
iljevi, a lista njihovih zavisnosti (kao i lista
komandi za takvo pravilo) je prazna. Kada make naie na praznu listu zavisnosti u nekom pravilu, smatra se da komande koje sadri to pravilo uvijek
treba da budu primijenjene. Poto u ovom sluaju nema komandi, smatrae
se da je
ilj auriran i, poto je pronaen, make e biti u stanju da nastavi
sa daljom analizom. Generisanje opisanih pravila treba da se vri zajedno
sa automatskim generisanjem liste zavisnosti i najjednostavniji nain da se
to uradi jeste da se, po generisanju liste zavisnosti u fajlu sa ekstenziojom
.d, uzme takav fajl i od njega napravi drugi fajl, re
imo sa ekstenzijom .P
koji e sadrati pravilo koje se nalazi u prvom fajlu, kao i jo jedno pravilo
u kome e lista zavisnosti iz prvog pravila biti
ilj, a ostatak pravila e biti
prazan. Onda treba taj fajl sa ekstenzijom .P ukljuiti u originalni makele
umjesto fajla sa ekstenzijom .d. Navedeni postupak se moe implementirati
tako to e u listi komandi za generisanje objektnih fajlova (kom prilikom e
biti generisani i fajlovi sa ekstenzijom .d) biti dodata komanda koja koristi
program sed 4 da automatski edituje fajl sa ekstenzijom .d u opisanom smislu
4
28
i da od njega kreira fajl sa ekstenzijom .P koji e onda biti ukljuen u makele. Makele bi sa ovom komandom i ukljuivanjem fajlova sa ekstenzijom
.P umjesto fajlova sa ekstenzijom .d imao oblik:
SOURCES
CC
CFLAGS
LDLIBS
=
=
=
=
quadri
.
test.
g
-ansi -Wall
-lm
29
=
=
=
=
=
=
quadri
test
$(PROBLEM).
$(PROGRAM).
g
-ansi -Wall
-lm
lean:
-indent *.h *.
-rm *~
-rm *.o *.P $(PROGRAM)
odnosno:
30
make dist
31
Slika 5.1: Primjer sesije u ema
s -u. Gornji potprozor sadri fajl sa kodom,
u donjem potprozoru su rezultati prevoenja. Poto ima sintaksnih greaka,
odgovarajuom komandom pozi
ioniran je kursor u fajlu sa kodom na
jednu od njih (u pitanju je zapravo isputen terminator na kraju prethodne
naredbe). Opis greke je istovremeno automatski postavljen na vrh potprozora sa rezultatima prevoenja. Sa lijeve strane prozora nalazi se speedbar
sa hijerarhijom direktorijuma projekta.
Na kraju ovog poglavlja trebalo bi da se stekao uvid o velikom mogunostima
32
Poglavlje 6
Nakon ovoga, aktivira se gdb shell koji je veoma slian obinom shell -u, samo
to naravno ovaj prepoznaje samo komande koje se odnose na debagovanje.
Program koji se debaguje se iznova pokree naredbom run, ili krae r - za
sve komande gdb -a dovoljno je navesti samo onoliko karaktera sa poetka
imena koliko ih razlikuje od drugih komandi, to za veinu komandi znai
da je prvo slovo imena dovoljno1 . Dalje se sve odvija kao pri normalnom
pokretanju programa - obzirom da pokazni primjer oekuje da se na poetku
1
gdb shell, ba kao i pravi shell, podrava automatsko kompletiranje imena komande
pritiskom na Tab taster, to takoe treba obavezno koristiti u
ilju izbjegavanja ku
anja
punih imena komandi
34
unesu koe
ijenti kvadratne jednaine ija se realna rjeenja trae, program
e na odgovarajuem mjestu zastati oekujui unos, a potom e biti izraunati korijeni i ispisani rezultati, nakong ega e gdb odtampati poruku o
normalnom zavretku programa i prikazati prompt oekujui dalje naredbe.
Naravno, svrha sesije sa debagerom nije da se izvri program kao to bi
bio izvren i bez debagera, ve da se program izvrava u kora
ima, pratei
ta se tokom tog izvravanja tano deava. Postoje brojne naredbe gdb -a
kojima se moe upravljati ovakvim izvravanjem programa i koje e u ostatku
poglavlja biti opisane. Meutim, prije nego to se pree na razmatranje tih
naredbi treba rei da se iz gdb -a izlazi naredbom quit, dok se pomo moe
u svakom trenutku dobiti naredbom help. Takoe treba pomenuti i da se
koristei komandu shell moe bez izlaska iz gdb shell -a izvriti bilo koja
UNIX naredba, a koristei komandu make moe se pokrenuti make bez i da
se ku
a shell make.
Da bi program mogao da se izvrava korak po korak, potrebno je prije njegovog pokretanja postaviti neku prekidnu taku (breakpoint ). Prekidne take
se postavljaju naredbom breakpoint pri emu se pozi
ija prekidne take
moe zadati na vie naina. Najjednostavnije je za spe
i
iranje prekidne
take navesti ime funk
ije na ijem poetku se hoe da se gdb zaustavi. Tako
bi postavljanje prekidne take na poetak posmatranog programa bilo izvedeno naredbom breakpoint main. Nakon ovoga gdb ispisuje poruku da je
postavio prekidnu taku, navodei u toj poru
i redni broj prekidne take. Sve
dalje opera
ije sa tom prekidnom takom zahtijevaju ovaj broj kao argument.
Alternativno, prekidna taka se esto zadaje i tako to se navedu razdvojeni
dvotakom ime fajla i broj linije u koje se prekidna taka postavlja. Ako se
prekidna taka postavlja u tekui fajl, onda je dovoljno navesti samo broj
linije; obzirom da je po pokretanju gdb -a tekui fajl onaj koji sadri main()
funk
iju, prethodno pomenuta prekidna taka se mogla postaviti i naredbom
breakpoint 17. esto se za postavljanje prekidne take kao argument koriste + ili - praeni nekim brojem u kom sluaju se prekidna taka postavlja
onoliko linija koda iza odn. ispred tekue pozi
ije u izvravanju programa
koliko iznosi dati broj.
Kada se nakon postavljanja prekidne take pokrene program naredbom run,
izvravanje e biti zaustavljeno na poetku main() funk
ije. Treba naglasiti da se izvravanje zaustavlja uvijek ispred linije u kojoj je postavljena
prekidna taka, tj. instruk
ija koja se nalazi u toj liniji ne biva izvrena.
Izvravanje moe biti nastavljeno na vie naina. Jedna mogunost je da se
postavi prekidna taka re
imo na sledeoj liniji koda naredbom breakpoint
20, pa da se onda nastavi program naredbom
ontinue. Naredba
ontinue
35
36
37
38
zadatu liniju. Naredbom return vri se trenutni povratak iz tekue funk
ije
(ako je funk
ija deklarisana da vraa neku vrijednost, onda se obavezno iza
ove naredbe mora zadati neka povratna vrijednost).
Na kraju, ukoliko se eli u nekom trenutku tokom debagovanja pogledati
listing mainskih instruk
ija u koje je preveden posmatrani program, to se
moe uraditi naredbom disassemble. Sintaksa asemblera je ve pomenuta
AT&T sintaksa.
Mada je u gdb -u uloeno dosta napora da se korienje debagera uini jednostavnijim, ipak stalno ku
anje komandi moe biti zamorno. Za programere
koji su navikli na debagovanje u nekom grakom okruenju reenje je GNU
DDD (Data Display Debugger ). Radi se praktino o grakom omotau
oko gdb -a, gdje se komande gdb -a mogu izdavati preko menija i toolbar -a,
a prekidne take postavljati ili vrijednosti promjenljivih i izraza oitavati
pomou mia. Primjer sesije sa DDD -om je prikazan na sli
i 6.1. Treba
uoiti kako se u donjem dijelu prozora vidi gdb -ov prompt u kome se moe
sa gdb -om raditi na uobiajeni nain, ku
anjem komandi.
Meutim, DDD spada u onu grupu GNU programerskih alata koji se obino
ne isporuuju uz UNIX distribu
ije, ve se moraju naknadno nabavljati i
instalirati. Zbog te injeni
e, kao i zato to je prirodno da se debagovanje vri
u okruenju u kome se obavljaju ostali programerski zada
i, najbolje je za
ovu svrhu koristiti ema
s, koji u odgovarajuem reimu rada podrava slian
nain debagovanja kao i DDD. Naime, u Tools meniju ema
s -a postoji op
ija
Debugger... kojom se pokree gdb, pri emu interak
ija sa njime ide kroz
poseban ema
s bafer. Kao i kod pokretanja make -a iz ema
s -a, u minibuer u je nakon pokretanja ove komande mogue zadati parametre komandne
linije za pokretanje debagera (obavezno je navesti bar ime programa), nakon
ega se otvara prozor za interak
iju sa njime.
U trenutku kada je pokrenut debager, meni za fajlove koji sadre kod dobija
podmeni Gud3 sa komandama debagera. Stavkama iz ovog menija, naravno
i odgovarajuim kombina
ijama tastera, mogue je postaviti prekidnu taku
na liniju koda u kojoj se nalazi kursor, upravljati tokom izvravanja programa, odtampati vrijednost promjenljive ili izraza nad kojom se nalazi
kursor i tome slino. Tokom debagovanja, ema
s prozor je podijeljen na
dva potprozora (jedan za debager, drugi za fajl sa kodom), kao na sli
i 6.2.
Pritom, komande koje se izdaju u potprozoru sa debagerom poinju sekven
om C-
(npr. komanda up se poziva sa C-
<), dok komande koje se izdaju
u potprozoru koji sadri kod poinju sekven
om C-
C-a (npr. komanda up
3
39
40
Poglavlje 7
GNU gprof
program za
GNU gprof
42
<stdio.h>
<stdlib.h>
<math.h>
<assert.h>
"quadri
.h"
/*
* Program testira funk
iju za odredjivanje realnih korijena kvadratne
* jedna
ine. Koefi
ijenti jedna
ine se generisu kao slu
ajni brojevi iz
* datog intervala, a onda se poziva funk
ija za odredjivanje korijena
* da bi se potom korijeni uvrstili u jedna
inu i ispitivalo se koliko
* tako dobijena vrijednost odstupa od 0. Ni za jednu kombina
iju
* koefi
ijenata ne smije ova vrijednost pre
i zadatu ta
nost; u
* suprotnom se program prekida i smatra se da metoda nije dovoljno
* pre
izna.
*/
int
main ()
{
onst int n = 1000000;
/* Broj testova. */
onst double lo = -10, hi = 10;
/* Opseg iz koga
e uzimati vrijednosti
* koefi
ijenti jedna
ine. */
onst double epsilon = 0.000001;
/* Ta
nost na koju se vrsi testiranje. */
double a, b,
;
/* Koefi
ijenti kvadratne jedna
ine. */
int
ount;
/* Broj realnih rjesenja jedna
ine. */
double x0, x1;
/* Realna rjesenja jedna
ine. */
int i;
/* Broja
u petljama. */
/*
* Zadati broj puta...
*/
for (i = 0; i < n; i++)
{
/*
* ...generisu se slu
ajne vrijednosti koefi
ijenata iz datog
* opsega,...
*/
a = lo + (hi - lo) * rand () / RAND_MAX;
b = lo + (hi - lo) * rand () / RAND_MAX;
= lo + (hi - lo) * rand () / RAND_MAX;
/*
* ...odredjuju se realna rjesenja jedna
ine...
*/
ount = quadri
(a, b,
, &x0, &x1);
/*
* ...i ispituje se ta
nost rjesenja.
*/
swit
h (
ount)
{
43
ase 1:
assert (fabs (a * x0 * x0 + b * x0 +
) < epsilon);
break;
}
}
ase 2:
assert (fabs (a * x0 * x0 + b * x0 +
) < epsilon);
assert (fabs (a * x1 * x1 + b * x1 +
) < epsilon);
break;
}
return 0;
tj. iza imena programa navode se op
ije i ime izvrnog fajla. Pritom je
vano da se proler pokrene iz istog direktorijuma iz koga je pokretan i
izvrni program odn. iz onog direktorijuma u kome se nalazi fajl gmon.out.
Op
iju -b treba uvijek koristiti jer e u suprotnom proler pored rezultata
analize uvijek ispisivati i objanjenje o nainu interpretiranja rezultata.
Postoje dva osnovna skupa rezultata koje ispisuje proler i to tzv. at prole,
te graf poziva. Za dati primjer ispis proler -a bi bio oblika
Flat profile:
Ea
h sample
ounts as 0.01 se
onds.
%
umulative
self
self
time
se
onds
se
onds
alls ns/
all
72.12
1.50
1.50
27.88
2.08
0.58 1000000
580.00
total
ns/
all
580.00
name
main
quadri
Call graph
granularity: ea
h sample hit
overs 4 byte(s) for 0.48% of 2.08 se
onds
index % time
self
hildren
alled
name
<spontaneous>
1.50
0.58
main [1
0.58
0.00 1000000/1000000
quadri
[2
----------------------------------------------0.58
0.00 1000000/1000000
main [1
[2
27.9
0.58
0.00 1000000
quadri
[2
----------------------------------------------[1
100.0
[2 quadri
44
GNU gprof
Razmotrimo prvo at prole. U poslednjoj koloni dato je ime funk
ije na
koju se poda
i iz odgovarajueg reda odnose. U prvoj koloni se nalazi pro
enat ukupnog vremena tokom izvravanja programa koje je provedeno u
posmatranoj funk
iji. U drugoj koloni je dato zbirno vrijeme, odn. vrijeme
koje je tokom izvravanja programa provedeno u datoj funk
iji i funk
ijama
koje su iznad nje na listi, dok je u treoj koloni dato vrijeme provedeno
u samoj funk
iji. U etvrtoj koloni nalazi se broj pozivanja te funk
ije u
programu. U petoj koloni dato je prosjeno vrijeme izvravanja funk
ije
po jednom pozivu, u pikosekudnama. Ovo vrijeme se odnosi na kod same
funk
ije, ne i na pozive nekih drugih funk
ija iz nje, dok je ukupno vrijeme
po pozivu provedeno u samoj funk
iji i funk
ijama koje su iz nje pozivane
dato u estoj, pretposlednjoj koloni.
Pokazni primjer je opet veoma jednostavan i pravolinijske strukture, tako
da su gornji poda
i sasvim oekivani. Ipak, ak i na tako jednostavnom
primjeru interesantno je uporediti odnos vremena utroenog na generisanje
koe
ijenata i ispitivanje ispravnosti rjeenja sa vremenom samog rjeavanja
jednaine - moda pomalo neoekivano, ispostavlja se da rjeavanje jednaine
traje krae. Kod komplikovanijih programa, at prole omoguava da se vrlo
lako uoe djelovi programa u kojima se potroi najvie vremena i koje prema
tome ima najvie smisla optimizovati.
Graf poziva predstavlja sline informa
ije kao i at prole, samo interpretirane na neto drugaiji nain. Kod ovog grafa su, razdvojeni linijama sa
rti
ama, dati poda
i za svaku funk
iju ponaosob o funk
ijama iz kojih je ona
pozvana i o funk
ijama koje ona poziva. Svakoj funk
iji je dodijeljen redni
broj (ispisan u uglastim zagradama) i u prvoj koloni je oznaena funk
ija
na koju se dati blok podataka odnosi. U drugoj koloni za tu funk
iju je dat
pro
enat vremena ukupnog izvravanja programa koji je proveden u datoj
funk
iji i funk
ijama koje su iz nje pozvate. U treoj koloni je dat iznos vremena proveden u posmatranoj funk
iji, ne raunajui vrijeme u funk
ijama
koje su iz nje pozvate, koje je dato u etvrtoj koloni. U narednoj koloni je
dat broj pozivanja te funk
ije, dok je u poslednjoj koloni dato ime funk
ije
sa indeksom iz liste. Za funk
ije iz kojih je pozivana funk
ija posmatrana
u datom bloku grafa poziva, vrijeme u treoj koloni se odnosi na vrijeme
provedeno u pozivima posmatrane funk
ije, a u etvrtoj koloni na vrijeme
provedeno u funk
ijama pozivanim iz posmatrane funk
ije. U pretposlednjoj
koloni nalaze se dva broja, od kojih se prvi odnosi na broj poziva posmatrane funk
ije iz funk
ije iz koje je ona pozivana, dok se drugi odnosi na ukupan broj nerekurzivnih poziva posmatrane funk
ije. Tako se npr. u drugom
bloku gornjeg grafa vidi da je iz funk
ije main() funk
ija quadri
() pozivana
45
1000000 puta dok je istovremeno ukupan broj nerekurzivnih poziva funk
ije
quadri
takoe jednak 1000000. Za funk
ije koje su pozivane iz funk
ije posmatrane u datom bloku grafa poziva trea kolona predstavlja vrijeme provedeno u toj funk
iji, ne raunajui funk
ije koje su iz nje pozivane i za koje
je vrijeme provedeno u njima dato u etvrtoj koloni. U petoj koloni su opet
data dva broja od kojih prvi predstavlja broj poziva te funk
ije iz funk
ije
posmatrane u datom bloku, dok je drugi ukupan broj nerekurzivnih poziva
te funk
ije. U prvom bloku gornjeg grafa opet se iz ove kolone vidi da je
funk
ija quadri
() pozivana 1000000 puta iz funk
ije main() dok je ukupan
broj nerekurzivnih poziva te funk
ije takoe jednak 1000000. U sluajevima
uzajamno rekurzivnih ili samorekurzivnih poziva u svakom bloku se izdvaja
po jedan red za svaki
iklus ovakvog tipa.
Ukoliko se prilikom pozivanja proler -a navede op
ija -l, onda su jedini
e
prikazivanja pojedinane linije koda umjesto funk
ija. Da bi ova op
ija mogla
da se koristi, potrebno je prilikom prevoenja pored -pg op
ije zadati i -g
ili -ggdb op
iju. Op
ija -l proler -a je korisna uglavnom za at prole, kod
grafa poziva je korienje funk
ija kao jedini
a prikaza znatno informativnije.
Sa druge strane, ukoliko se pri prevoenju zada i op
ija -a, istom prilikom e
u fajl pod imenom bb.out biti upisan broj prolaza kroz svaki blok koda, to
takoe moe biti veoma korisna informa
ija za optimiza
iju programa. Ovaj
fajl nije meutim u previe itljivom formatu, pa je bolje konvertovati ga u
format koji gprof moe da obradi, to se radi pomou skripta bb
onv.pl.
Ovaj skript se naalost obino ne nalazi u distribu
ijama UNIX -a, ve je
potrebno izvaditi ga iz originalne verzije GNU binutils paketa, koji u sebi
obuhvata i gprof. Kada se instalira ovaj skript (dovoljno ga je staviti negdje
u path ), tada prvo treba konvertovati format fajla bb.out i smjestiti rezultat
re
imo u fajl bb.gmon.out naredbom:
bb
onv.pl <bb.out >bb.gmon.out
46
GNU gprof
-s oznaava da kao ulaz u gprof treba umjesto samo gmon.out fajla korisiti
vie fajlova, ija e imena biti navedena iza imena izvrnog programa koji
se analizira (ovi fajlovi e biti povezani u fajl sa imenom gmon.sum i taj
fajl e biti korien kao ulaz u gprof. Jedan segment izlaza ovakve naredbe
na pokaznom primjeru za fajl quadri
.
ima oblik (sa komentarima runo
izbaenim radi bolje preglednosti):
1000000 ->
628162
628162
628162
628162
628162
->
->
->
->
->
371838 ->
##### ->
##### ->
if (dis
r > 0)
{
dis
r = sqrt (dis
r);
mul = 1 / (2 * a);
*x0 = (-b + dis
r) * mul;
*x1 = (-b - dis
r) * mul;
return 2;
}
if (dis
r == 0)
{
*x0 = -b / (2 * a);
return 1;
}
Poglavlje 8
biblioteka
Funk
ija quadri
() iz pokaznog primjera je napisana tako da rjeava pre
izno odreen problem nezavisno od konteksta u kome se taj problem javlja.
Zato se moe oekivati da ova funk
ija bude korisna i za neke druge programe, a ne samo za konkretan program koji je u pokaznom primjeru uz
nju napisan. Izdvajanjem ove funk
ije u poseban fajl znatno je olakano
njeno korienje i u nekim drugim projektima, ali ipak jo uvijek treba svaki
put ukljuivati i prevesti fajl quadri
.
u svakom projektu u kome e ova
funk
ija da se koristi. Bolje rjeenje bi bilo prekompajlirati ovu funk
iju, zajedno sa eventualno jo nekim funk
ijama sline namjene, i onda je u takvom
obliku ukljuivati u projekte u kojima je potrebna. Skup prekompajliranog
koda ovog oblika naziva se bibliotekom. U zavisnosti od toga kako se taj kod
povezuje sa projektom u kome e funk
ije sadrane u bibliote
i biti koriene
razlikuju se statike i dinamike biblioteke; u ovom tekstu bie razmotrene
samo statike biblioteke koje nisu nita drugo do skup objektnih fajlova objedinjenih u jedan fajl (uz jo neke dodatne informa
ije upisane u taj fajl,
a koje se odnose na sadraj objektnih fajlova, pre
iznije na listu funk
ija
koje su implementirane u tim fajlovima). Alat koji se koristi za kreiranje
biblioteka na UNIX -u jeste obian arhiver ar. Biblioteka se kreira tako to
se iza imena arhivera navedu odgovarajue komandne op
ije, potom ime
biblioteke, a onda imena objektnih fajlova koji e ui u sastav biblioteke.
Po konven
iji, ime fajla koji sadri biblioteku na UNIX -u poinje preksom
lib, a ekstenzija za fajlove sa statikim bibliotekama je .a, pa bi naredba
za kreiranje biblioteke od fajla quadri
.obj glasila:
GNU ar
48
=
=
=
=
=
=
=
quadri
test
quadri
.
g
-ansi -Wall
-L.
-lm -l$(LIBRARY)
49
lean:
-indent *.h *.
-rm -f *~
-rm -f *.a *.o *.out *.P *.sum $(PROGRAM)
50
GNU ar
Poglavlje 9
52
CVS
53
Ovdje je
he
kout naredba za kreiranje radne kopije, dok je quadri
ime direktorijuma u skladitu koji sadri projekat na kome eli da se radi. Nakon
ovoga u tekuem direktorijumu bie kreiran direktorijum quadri
sa radnom kopijom projekta u koji se moe ui i normalno raditi sa projektom.
Treba primijetiti da e ovaj direktorijum, kao i svi njegovi poddirektorijumi,
sadrati pored originalnih fajlova i poddirektorijuma i poddirektorijum pod
imenom CVS - u pitanju su poddirektorijumi u koje CVS smjeta svoje administrativne fajlove i koji se ne smiju mijenjati ili brisati.
Po kreiranju radne kopije se, kako je reeno u prethodnom pasusu, normalno radi sa njome. Nakon to su unesene odreene izmjene, moe se
aurirati verzija projekta u skladitu. Pretpostavimo da je promijenjen fajl
quadri
.
, kao i makele, u tom sluaju bi slanje izmjena bilo izvreno
naredbom (pod pretpostavkom da se nalazimo u korenom direktorijumu
radne kopije projekta):
vs -d ~/
vsroot
ommit -m "Razne izmjene" quadri
.
Makefile
CVS
54
vs -d ~/ vsroot update .
55
Tokom rada na projektu svakako e doi do situa
ije da neke fajlove ili direktorijume treba dodati u projekat ili obrisati iz njega. Ovo se radi naredbama
add odn. remove. Da bi fajl ili direktorijum bio dodat u skladite, isti treba
da postoji u radnoj kopiji; da bi bio obrisan iz skladita isti treba da bude
obrisan iz radne kopije. Ovim naredbama se samo naznaava CVS -u da treba
da unese odgovarajue izmjene u skladite, stvarne opera
ije e biti obavljene pri narednom izdavanju
ommit naredbe. Za razliku od veine drugih
CVS naredbi, naredbe add i remove nisu rekurzivne, to znai da treba da
se izdaju za svaki fajl ponaosob. Ako se npr. odlui da se u biblioteku doda
rjeavanje linearne jednaine i isto implementira u fajlovima linear.h, odn.
linear.
, tada bi se unoenje ovih fajlova u skladite sprovelo naredbama
(pod pretpostavkom da se nalazimo u korenom direktorijumu radne kopije):
CVS
56
Dalje treba obrisati radnu kopiju verzije 1.0.0 i kreirati radnu kopiju na
osnovu verzije 1.0.1 (prethodno se naravno treba pozi
ionirati u direktorijum
iznad direktorijuma sa radnom kopijom):
vs -d ~/
vsroot release -d quadri
vs -d ~/
vsroot
he
kout -r quadri
-1_0_1 quadri
57
Nakon ovoga se normalno radi sa radnom kopijom - sve izmjene bie unoene
u granu 1.0.1 i nee niim uti
ati na glavnu granu 1.1.0 razvoja projekta.
Kada se eli da se ispravke napravljene u verziji 1.0.1 ukljue u glavnu granu
projekta (tj. da se spoje razdvojene grane projekta), to se jednostavno moe
uraditi -j (od join ) op
ijom update naredbe. Pod pretpostavkom da se
nalazimo u korenom direktorijumu radne kopije kreirane na osnovu glavne
1.1.0 verzije projekta, povezivanje bi se izvrilo naredbom:
vs -d ~/
vsroot update -j quadri
-1_0_1 .
58
CVS
6
treba imati na umu da jedan broj GNU alata nije predstavljen u ovom pregledu:
npr. ex i bison alati za generisanje parsera ili auto
onf i automake alati za automatsko
kongurisanje projekta, odnosno kreiranje makele-ova