proces kompilacije

Upload: david

Post on 16-Jul-2015

81 views

Category:

Documents


0 download

TRANSCRIPT

Literatura: The Essence of Compilers, Robin Hunter, Prentice Hall Europe 1999. ISBN 0-13-727-835-71.1 Uvod

1 Proces kompilacije

Funkcija kompajlera je transformacija softverskih reprezentacija (programa na visem programskom jeziku) na reprezentaciju koja je masinski orijentisana. Posao koji komplajer obicno obavlja se deli u dva dela: 1. Analiza u kome se analizira ulazni tekst, i 2. Sinteza u kome se generise masinski orijentisana reprezentacija. Ulaz u deo analize se obisno naziva izvorni kod ili izvorni tekst, a izlaz iz sinteze se naziva objektni kod, odnosno objektni tekst. Transformacija izvornog u objektni kod se obicno naziva proces kompilacije i njega vrsi kompajler. Kompajler se takodje naziva i implementacijom jezika. Objektni kod koji formira kompajler moze biti u obliku ili asemblerskog koda, ili u obliku masinskog koda za neku konkretnu masinu, ili u obliku nekog medjukoda koga je potrebno dalje transformisati posebnim alatima u asemblerski ili masinski kod neke konkretne masine. Ukoliko se medjukod direktno da se izvrsava tada se program koji to radi naziva interpretator.

1.2 Proces kompilacije

Proces kompilacije predstavlja transformaciju iz jednog jezika u drugi: iz izvornog koda u kome u objektni kod.Izvorni kod +--------------------+ Objektni kod -------------->! proces kompilacije !-------------> +--------------------+

Pored izvornog i objektnog, kompajler takodje ukljucuje i treci jezik, nazvan implementacioni jezik. Ovaj jezik moze biti isti kao i izvorni ili objektni jezik, ali to nije neophodno. Jezik za pisanje kompajlera se bira tako da omoguci jednostavno pisanje uz raspolozivost i kompatibilnost sa razvojnim alatima. Uobicajeno je da se tri jezika prikazuju u obliku T dijagrama. Npr kompajler pisanu C-u koji prevodi JAVU u Bytekod se predstavlja na sledeci nacin:+------------------------------+ ! ! ! JAVA Bytecod ! +----------+ +------------+ Pascal ! ! M-CODE ! ! ! ! ! ! ! ! +------------------------------+ ! ! ! C++ T-code ! +----------+ +------------+ ! ! ! ! ! ! ! ! ! !

1

! C ! +------+ M-code

!H-code! +------+

Dijagram na desnoj strani predstavlaj prevodjenje koje se koristi ukoliko se izvorni kod prevodi na jednom racunaru a dobijeni prevod izvrsava na drugom. Kako obicno kompajler treba da bude u masinskom kodu masine na kojoj se izvrsava, takav kod vrlo cesto nije odgovarajuci za pisanje kompajlera jer je vrlo niskog nivoa. U tom slucaju uobicajeno je da se kompajler pise u visem programskom jeziku i prevodi na jezik niskog nivoa pomocu nekog vec postojeceg kompajlera. U ovom slucaju je ulaz i izlaz za takav kompajler izvorni i izvrsni kod kompajlera.+------------------------------+ +------------------------------+ ! ! ! ! ! C++ M-code ! ! C++ M-code ! +----------+ +------------+--------+----------+ +------------+ ! ! ! ! ! ! C++ M code ! ! ! +------------+ +-----------+ ! ! ! ! ! ! ! ! ! ! ! ! ! ! C++ ! ! ! !M-code! +------+ ! ! +------+ ! ! ! M-code! +-------+

Kranje levi kompajler je kompajler koji je originalno napisan u C++-u, dok je kompajler na vrhu desno izvrsni kompaljer, dobijen njegovim kompiliranjem pomocu komapjlera na dnu. (sada umesto da komapjler napisan na C++-u prevodi C++ programe u M kod, njegova objektna verzija koja se izvrsava na M-kodu prevodi programe sa C++-a na M-kod).

1.3 Nivoi, faze i prolazi

Logicki proces kompilacije se deli u nivoe, koji se dele u faze. Fizicki, kompajliranje se deli u prolaze. Postoje 2 nivoa (koraka): 1. Analiza u kojoj se izvorni kod analizira radi odredjivanja njegove strukture i znacenja, i 2. Sinteza u kojoj se izgradjuje (sintetise) objektni kod. Pored njih postoji odredjen broj nivoa preprocesiranja u kojima se ukljucuju datoteke, izvrsavaju makroi, itd. (npr. kod jezika C, C++, PL/I, ...) Tipicne faze procesa kompajliranja su prikazane na narednoj slici. Nivo analize obicno sadrzi tri razlicite faze: 1. Leksicka analiza 2. Sintaksna analiza 3. Semanticka analiza 2

Nivo sinteze moze da sadrzi sledece faze: 1. generisanje koda nezavisnog od masine 2. Optimizacija koda nezavisnog od masine 3. alokacija memorije 4. generisanje masinskog koda 5. optimizacija masinskog koda+----------------------------------------------------------------------+ !+--------------------------------------------------------------------+! !! +----------+ +-----------+ +------------+ !! !! ! Leksicka ! ! Sintaksna ! ! Semanticka ! !! !! ! analiza !-------->! analiza !------->! analiza ! !! !! +----------+ +-----------+ +------------+ !! !! A N A L I Z A !! !+--------------------------------------------------------------------+! ! ! ! ! ! ! !+--------------------------------------------------------------------+! !!+-----------+ +------------+ +---------+ +---------+ +---------+!! !!!Generisanje! !Optimizacija! ! ! !Generi- ! !Optimiza-!!! !!!koda ! ! koda ! !Alokacija! !sanje ! !cija !!! !!!nezavisnog !->! nezavisnog !->!memorije !->!masinskog!->!masinskog!!! !!!od ! ! od ! ! ! !koda ! !koda !!! !!!masine ! ! masine ! ! ! ! ! ! !!! !!+-----------+ +------------+ +---------+ +---------+ +---------+!! !! !! !! S I N T E Z A !! !+--------------------------------------------------------------------+! +----------------------------------------------------------------------+

U fazi leksicke analize vrsi se fromrianje simbola (tokena) jezika. U ovoj fazi se citaju niske karaktera i zamenjuju se simbolima jezika koji predstavljaju ulaz u sintaksnu i semanticku analizu.; number int return do == ++ var do + begin

Prethodna dva reda predstavljaju leksicki ispravne konstrukcije jezika. Leksicki analizator ne ispituje znacenje konstrukcija. Pogodan je za automatizaciju. Postoje razliciti alati, mi cemo raditi sa FLEX-om. U fazi sintaksne analize se proverava celokupna struktura programa, ukljucujuci i ispravnost redosleda navodjenja simbola u programima. Ovaj posao obavlja sintaksni analizator ili parser. Parser mora da poznaje kontekst u kome se javlja odredjena konstrukcija jezika. Izlaz iz parsera je takozvano sintaksno drvo. Npr. za izraz (aaaa + bbbbb) (cccc + dddd) sintaksno drvo je 3

* + aaaa

HH bbbb

HH H H

+

cccc dddd

HH

Ova reprezentacija je poznata pod nazivom apstraktno sintaksno drvo. Kompletan program se predstavlja u obliku jednog apstraktnog sintaksnog drveta. Efekat parsera zavisi i od ugradjenih procedura za obradu greske. (dati primer { nedostaje ; ili begin expected. Neke osobine programskih jezika ne mogu biti proverene u jednom prolasku koda sleva u desno bez postavljanja vrednosti u pojedinim tabelama. Na primer, informacije o tipu i oblasti vazenja promenljvih spadaju u ovu grupu. Provera ovih osobina (poznata pod nazivom staticka semantika) se u normalnim situacijama ne primenjuje u fazi sintaksne analize vec u fazi semanticke analize. Faza sinteze Postojanje svih faza nije obavezno. Npr. ako kompajler kompajlira direktno u masinski kod prve dve faze ne postoje. Takodje, optimizacija moze da postoji bili za masinski nezavisan kod, bilo za masinski zavisan, bilo za oba ili nijedan od njih. Faza alokacije memorije je vrlo bitna i usko je povezana sa jednom od faza generisanja koda. Postoje dobri razlozi za generisanje masinski nezavisnog koda kao prvog primerka. Jedan od tih razloga je i portabilnost kompajlera prema razlicitim hardverskim platformama. Veliki broj kompajlera formira neku vrstu medjukoda koji je nezavisan od izvornog jezika, nezavisan od konkretne masine ili od oba. Ne postoji jedan medjukod koji bi bio univerzalan - (UIL - Universal Intermediate Language). Medjutim, postoji veise medjuejzika koje koriste kompajleri pojedinacnih jezika: P-kod za PASCAL, DIANA za ADU, Bytecode ja JAVU. Takodje postoje medjukodovi za kompajliranje na pojedinacne masine kao ciljne hardverske platforme. Optimizacija koda je povezana sa vecim utroskom vremena, memorije, i drugih resursa. Vecina dobro napravljenih kompajlera poseduje mogucnost izbora zeljenog nivoa optimizacije u zavisnosti od opcije izabrane pri njihovom pozivu. Za vreme faze zauzimanja memorije dodeljuju se memorijske lokacije konstantama i promenljivima u programu. Zauzeti prosto moze da bude: 1. Staticka memorija { poznato iz ORS-a 2. Dinamicka memorija { poznato iz ORS-a 3. Globalna memorija - vreme njenog zivot aje nede nisano u doba kompjaliranja i ona se zauzima i oslobadja u vreme izvrsavnaja. E kasna kontrola ove memorije obicno zahteva dodatne utroske resursa u vreme izvrsavnaja (run-time overheads). Posle ove faze adrese se prosledjuju generatoru koda koji ih dalje koristi. Prolazi Kompajliranje je zicki organizovano u prolazima. Za vreme svakog od prolaza cita se izvorni kod ili njegova reprezentacija. Neki kompajleri su jednoprolazni a neki vise (dvo) prolazni. 4