PROGRAMSKI PREVODIOCI - TFZR...gramskog jezika - napraviti ekvivalencije izme u re£enica dva jezika...
Transcript of PROGRAMSKI PREVODIOCI - TFZR...gramskog jezika - napraviti ekvivalencije izme u re£enica dva jezika...
-
PROGRAMSKI PREVODIOCI
!!! RADNA VERZIJA !!!
Zorica Suvajdºin Raki¢
Miroslav Hajdukovi¢
septembar 2015
-
2
Ova knjiga je napisana za potrebe uvodnog kursa o implementaciji kompaj-lera na FTN, Departman za ra£unarstvo i automatiku, Univerzitet u NovomSadu, Srbija.
Nakon prou£avanja materije date u ovom udºbeniku, £italac se moºe ospo-sobiti da samostalno produbljuje znanja iz prikazanih oblasti i da u£estvujeu razvoju kompajlera ili (²to je verovatnije) nekih njegovih delova ili daimplementira neki sopstveni jezik.
-
Sadrºaj
1 Uvod 5
1.1 Kompajler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2 Primer prevoenja . . . . . . . . . . . . . . . . . . . . . . . . 6
1.3 Prevoenje . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.4 Gramatika programskog jezika . . . . . . . . . . . . . . . . . . 9
1.4.1 Primena formalne gramatike . . . . . . . . . . . . . . . 12
2 HAJ 15
2.1 Hipotetski asemblerski jezik . . . . . . . . . . . . . . . . . . . 15
2.1.1 Operandi . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.1.2 Naredbe . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.1.3 Direktive . . . . . . . . . . . . . . . . . . . . . . . . . 18
Bibliogra�ja 23
3
-
4 SADRAJ
-
Poglavlje 1
Uvod
1.1 Kompajler
Programeri pi²u programe na programskom jeziku visokog nivoa a ra£unarizvr²ava programe koji su napisani na ma²inskom jeziku. Programeri koristeprogramske jezike sa visokim nivoom apstrakcije jer je pisanje programa nama²inskom jeziku vrlo zamorno i sklono gre²kama. Da bi ra£unar mogao daizvr²i program kojeg je napisao programer, potreban je program ¢e taj pro-gram prevesti na jezik ra£unara. Taj program se zove programski prevodilac,odnosno kompajler.
Kompajler prevodi program napisan na jednom programskom jeziku (izvornijezik) na ekvivalentni program napisan na drugom programskom jeziku (ciljnijezik) [1]. Proces prevoenja se zove kompajliranje (compilation) i ne smeda izmeni zna£enje izvornog programa.
Slika 1.1: Kompajler
Izvorni jezik (source language) je programski jezik visokog nivoa koji je prila-goen programerima (ljudima), dok je ciljni jezik (target language) program-ski jezik niskog nivoa koji zahtevaju ra£unari. Primeri izvornog jezika su:
5
-
6 POGLAVLJE 1. UVOD
C, C++, Java, Python, a primeri ciljnog jezika: asemblerski jezik, ma²inskijezik.
Tokom kompajliranja, kompajler prijavljuje korisniku eventualno postojanjegre²aka u izvornom programu.
Da bi kompajler mogao da prevede izvorni kod u neki drugi, potrebno jeda poznaje strukturu izvornog jezika. Tada moºe prevoditi pojedina£neiskaze izvornog jezika u ekvivalentne iskaze ciljnog jezika. Za prevoenje jepotrebno:
1. uspostaviti korespondenciju iskaza (�re£enica�) izvornog i ciljnog pro-gramskog jezika - napraviti ekvivalencije izmeu re£enica dva jezika
2. prepoznati iskaze (�re£enice�) izvornog programskog jezika i3. zameniti ih korespondentnim iskazima (�re£enicama�) ciljnog program-
skog jezika.
1.2 Primer prevoenja
Prevoenje ¢e biti ilustrovano na primeru programa za ra£unanje najve¢egzajedni£kog delioca dva prirodna broja, napisanog programskim jezikom C:
a = 12;
b = 8;
while (a != b)
if (a > b)
a = a - b;
else
b = b - a;
Prethodni segment programa treba prevesti u segment programa koji je na-pisan hipotetskim asemblerskim jezikom (vidi 2.1).
ta su re£i i re£enice u prethodnom primeru? Re£i su: a, =, 12, ;, b, while,!=, itd. A re£enice su: re£enica dodele a = 12; ili �if� re£enica ili �while� .
Za iskaze (re£enice) programskog jezika C treba odrediti korespodentne na-redbe hipotetskog asemblerskog jezika (podrazumeva se da neozna£enoj celo-brojnoj promenljivoj a odgovara memorijska lokacija sa labelom a, a neozna-£enoj celobrojnoj promenljivoj b odgovara memorijska lokacija sa labelomb).
Na primer, iskazu dodele C programskog jezika odgovara MOV naredba hipo-tetskog asemblerskog jezika. U narednoj tabeli navedeni su iskazi dodele iz
-
1.2. PRIMER PREVOÐENJA 7
prethodnog segmenta programa i date njihove korespodencije u hipotetskomasemblerskom jeziku.
C HAJa = 12; MOV $12,a
b = 8; MOV $8,b
a = a - b; SUBU a,b,a
b = b - a; SUBU b,a,b
Za malo sloºenije iskaze programskog jezika C, potrebno je nekoliko naredbihipotetskog asemblerskog jezika koje predstavljaju korespodenciju. Na pri-mer, za while iskaz
while (a != b)
while_telo
korespodentni segment koda bi mogao biti:
@while0:
CMPU a,b
JEQ @false0
@true0:
while_telo
JMP @while0
@false0:
Evo primera korespodentnog segmenta koda za if iskaz:
if (a > b)
then_telo
else
else_telo
@if1:
CMPU a,b
JLEU @false1
@true1:
then_telo
JMP @exit1
@false1:
else_telo
@exit1:
Kada se primeni postupak prepoznavanja navedenih iskaza u izvornom pro-gramu i njihova zamena korespodentnim segmentima naredbi hipotetskogasemblerskog jezika, dobija se slede¢i segment programa:
MOV $12 ,a
MOV $8,b
-
8 POGLAVLJE 1. UVOD
@while0:
CMPU a,b
JEQ @false0
@true0:
@if1:
CMPU a,b
JLEU @false1
@true1:
SUBU a,b,a
JMP @exit1
@false1:
SUBU b,a,b
@exit1:
JMP @while0
@false0:
Analizom nastalog programa, moºe se primetiti nekoliko nesavr²enosti:
� suvi²na naredba: druga CMPU a,b� naredbu JMP @exit1 treba zameniti naredbom JMP @while0 da bi se
izbegla dva uzastopna skoka
Do nee�kasnosti je do²lo zbog parcijalnog pristupa prilikom zamene iskazaizvornog jezika iskazima ciljnog jezika i nesagledavanja ²ireg konteksta ukome se zamena obavlja. Ovim problemom bavi se optimizacija.
1.3 Prevoenje
Prevoenje je zasnovano na prepoznavanju iskaza (re£enica) izvornog pro-gramskog jezika i naziva se jo² i analiza. Analiza se sastoji od nekolikofaza:
leksi£ka analiza prepoznaje re£i, odnosno SIMBOLEsintaksna analiza prepoznaje re£enice (iskaze programskog jezika), odno-
sno POJMOVE. Oslanja se na leksi£ku analizu. Kada od leksi£koganalizatora dobije re£i, proverava da li su te re£i poreane u dobromredosledu, tj. da li obrazuju ispravnu re£enicu (u skladu sa program-skim jezikom)
semanti£ka analiza otkriva semanti£ki pogre²ne iskaze.
U toku prevoenja se otkrivaju i gre²ke koje se prijavljuju korisnicima. Gre-²ka moºe da se pojavi u bilo kojoj fazi analize:
leksi£ka gre²ka: upotreba nedozvoljenih karaktera, npr: cou%ntsintaksna gre²ka: izostavljanje otvorene male zagrade iza if
-
1.4. GRAMATIKA PROGRAMSKOG JEZIKA 9
semanti£ka gre²ka: kori²¢enje nede�nisane promenljive.
Generisanje iskaza ciljnog jezika se zove jo² i sinteza ciljnog programa.
Kompletan proces prevoenja izgleda kao na slici 1.2.
Slika 1.2: Analiza i sinteza ciljnog programa
Program prevodilac se zove kompajler. Dep kompajlera zaduºen za leksi£kuanalizu se zove skener, deo zaduºen za sintaksnu analizu parser a deo zadu-ºen za sintezu ciljnog programa generator koda. Optimizacija izgenerisanogprograma treba da pobolj²a performanse izgenerisanog programa.
1.4 Gramatika programskog jezika
Za leksi£ku i sintaksnu analizu (programskog ili obi£nog) teksta potrebnoje poznavati sintaksu, odnosno gramatiku (programskog ili govornog) jezikakoja odreuje pravila pisanja njegovih iskaza (re£enica).
Gramatika moºe biti zadana neformalno. Na primer, gramatika teksta bimogla da glasi:
� re£ je niz slova� re£enica je niz re£i iza kojih dolazi ta£ka� tekst je niz re£enica.
Meutim, neformalna gramatika je neprecizna.
Gramatika (programskog) jezika se izraºava na formalan na£in, i to obi£nou BNF obliku: Bakus-Naurova forma (Backus-Naur form). Ovako izraºenagramatika se sastoji od pravila koja odreuju dozvoljene na£ine reanja poj-mova i simbola:
pojam � pojmovi i/ili simboli
Pravilo ima levu stranu (pre znaka �) i desnu stranu (iza znaka �). Levastrana pravila sadrºi pojam koji moºe biti zamenjen sekvencom pojmovai/ili simbola koje sadrºi desna strana pravila. Jedan od pojmova predstavljapolazni pojam. Pojmovi su vezani za sintaksnu analizu (nonterminal symbol).
-
10 POGLAVLJE 1. UVOD
Simboli su vezani za leksi£ku analizu (terminal symbol). Na primer, praviloza iskaz dodele bi izgledalo ovako:
dodela � ime �=� izraz �;�
Formalna gramatika teksta bi mogla da glasi ovako:
text
�
� text sentence
sentence
� capital_word words dot
words
�
� words word
� words capital_word
word
� small_letter
� word small_letter
capital_word
� capital_letter
� capital_word small_letter
dot
� "."
capital_letter
� "A"
� "B"
� "C"
...
� "Z"
small_letter
� "a"
� "b"
� "c"
...
� "z"
Pojmovi su napisani uko²enim slovima (italik) dok su simboli napisani obi£-nim fontom.
-
1.4. GRAMATIKA PROGRAMSKOG JEZIKA 11
Pojmovi text , words , word i capital_word su de�nisani rekurzivno. Prvopravilo de�ni²e tekst kao ili prazan tekst (ni²ta) ili kao niz re£enica. Pravilosentence opisuje kako izgleda jedna re£enica: na po£etku re£enice se nalazire£ koja po£inje velikim slovom (capital_word), zatim sledi sredina re£eniceopisana pojmom words i na kraju re£enice stoji ta£ka (dot). Pojam wordsmoºe biti prazan ili se gradi kombinacijom simbola word i capital_word.
Simbol capital_word se sastoji od jednog veliko slova (capital_letter)iza kog, opciono, sledi neograni£en broj malih slova (small_letter). Zna£i,najkra¢i validni simbol capital_word se sastoji od jednog velikog slova.Simbol word se sastoji od jednog ili vi²e malih slova. Najkra¢i validni simbolword se sastoji od jednog malog slova.
Najkra¢a re£enica ima jednu re£ koja po£inje velikim slovom (capital_word)iza koje sledi ta£ka (to se de²ava u slu£aju kada je words prazan).
U praksi se osim BNF forme za pisanje gramatike £esto koristi i pro²irenaBakus-Naurova forma (Extended Bacus-Naur Form). Ona uvodi slede¢eelemente na desnoj strani pravila:
[ ... ] sadrºaj zagrada se moºe pojaviti nijednom ili jednom (0 ili 1){ ... } sadrºaj zagrada se moºe pojaviti nijednom, jednom ili vi²e puta (0+)( ... ) grupisanje| alternative (�ili�).
Kori²¢enjem EBNF forme zapisa, gramatika teksta bi onda izgledala ovako:
text
� { sentence }
sentence
� capital_word words dot
words
� { ( word | capital_word ) }
word
� small_letter { small_letter }
capital_word
� capital_letter { small_letter }
dot
� "."
capital_letter
� "A" | "B" | ... | "Z"
small_letter
� "a" | "b" | ... | "z"
-
12 POGLAVLJE 1. UVOD
1.4.1 Primena formalne gramatike
Gramatika nekog programskoj jezika se sastoji od simbola (terminal sym-bol), pojmova (nonterminal symbol), pravila (productions) i polaznog pojma(start symbol) [2]. Gramatike nude velike prednosti i onima koji projektujujezike i onima koji pi²u kompajlere.
Gramatika jezika je potrebna za proveru ispravnosti teksta. Tokom provereispravnosti ulaznog teksta leva strana pravila se zamenjuje desnom sve dokse ne dobije ulazni niz simbola. Ovaj proces zamene se naziva izvoenje(derivation). Ukoliko se svaki put prvo zameni pojam koji se nalazi krajnjelevo u pravilu, onda se proces naziva izvoenje s leva, a ako se zamenjujekrajnje desni pojam u pravilu, proces se zove izvoenje s desna.
Primer primene tekst gramatike za dokazivanje da je iskaz (re£enica)
Ovo je tekst.
ispravan tekst (odnosno da je u skladu sa gramatikom), uz primenu izvoenjas leva u desno:
text
=> text sentence
=> E sentence
=> sentence
=> capital_word words dot
=> Ovo words dot
=> Ovo words word dot
=>* Ovo word word dot
=> Ovo je word dot
=> Ovo je tekst dot
=> Ovo je tekst .
Znak => ozna£ava izvoenje u jednom koraku, a znak =>* ozna£ava izvo-enje u vi²e koraka: text =>* Ovo je tekst . .
Prikaz ovog izvoenja u obliku stabla dat je na slici 1.3.
-
1.4. GRAMATIKA PROGRAMSKOG JEZIKA 13
Slika 1.3: Stablo izvoenja
-
14 POGLAVLJE 1. UVOD
-
Poglavlje 2
HAJ
2.1 Hipotetski asemblerski jezik
Podrazumeva se da registri i memorijske lokacije zauzimaju po 4 bajta.Ukupno ima 16 registara. Oznaka registra se sastoji od oznake % i rednogbroja registra: %0, %1, ..., %15. Registri od %0 do %12 imaju op²tu namenui sluºe kao radni registri. Registar %13 rezervisan je za povratnu vrednostfunkcije. Registar %14 sluºi kao pokaziva£ frejma. Registar %15 sluºi kaopokaziva£ steka.
Labele zapo£inju malim slovom iza koga mogu da slede mala slova, cifre ipodcrta `_' (alfabet je 7 bitni ASCII). Iza labele se navodi dvota£ka, a ispredsistemskih labela se navodi znak `@'.
2.1.1 Operandi
neposredni operand odgovara celom (ozna£enom ili neozna£enom) broju:$0 ili $-152 a njegova vrednost vrednosti tog broja, dok $lab odgovaraadresi labele lab.
registarski operand odgovara oznaci registra, a njegova vrednost sadrºajutog registra, npr. %0.
direktni operand odgovara labeli, npr. a. Njegova vrednost odgovaraadresi labele, ako ona ozna£ava naredbu i koristi se kao operand na-redbe skoka ili poziva potprograma. Ako direktni operand odgovaralabeli koja ozna£ava direktivu i ne koristi se kao operand naredbe skokaili poziva potprograma, njegova vrednost odgovara sadrºaju adresiranelokacije.
15
-
16 POGLAVLJE 2. HAJ
indirektni operand odgovara oznaci registra navedenoj izmeu malih za-grada: (%0), a njegova vrednost sadrºaju memorijske lokacije kojuadresira sadrºaj registra.
indeksni operand zapo£inje celim (ozna£enim ili neozna£enim) brojem ililabelom iza £ega sledi oznaka registra navedena izmeu malih zagrada:-8(%14) ili 4(%14) ili tabela(%0). Njegova vrednost odgovara sadr-ºaju memorijske lokacije koju adresira zbir vrednosti broja i sadrºajaregistra, odnosno zbir adrese labele i sadrºaja registra.
Operandi se dele na:
ulazne neposredni, registarski, direktni, indirektni i indeksni iizlazne registarski, direktni, indirektni i indeksni.
2.1.2 Naredbe
Neke naredbe postoje u 3 varijante za 3 razli£ita tipa podataka, koje suozna£ene sa x. x moºe biti S (signed) za ozna£ene tipove, U (unsigned) zaneozna£ene, i F (�oat) za realne (ma²inska normalizovana forma).
Naredba poreenja brojeva postavlja bite status registra u skladu sarazlikom prvog i drugog ulaznog operanda
CMPx ulazni operand , ulazni operand
Naredba bezuslovnog skoka sme²ta u programski broja£ vrednost ula-znog operanda (omogu¢uju¢i tako nastavak izvr²avanja od ciljne na-redbe koju adresira ova vrednost)
JMP ulazni operand
Naredbe uslovnog skoka sme²taju u programski broja£ vrednost ulaznogoperanda samo ako je ispunjen uslov odreen kodom naredbe (ispu-njenost uslova zavisi od bita status registra)
JEQ ulazni operand
JNE ulazni operand
JGTx ulazni operand
JLTx ulazni operand
JGEx ulazni operand
JLEx ulazni operand
-
2.1. HIPOTETSKI ASEMBLERSKI JEZIK 17
Naredbe rukovanja stekom omogu¢uju sme²tanje na vrh steka vredno-sti ulaznog operanda, odnosno preuzimanje vrednosti sa vrha steka injeno sme²tanje u izlazni operand (podrazumeva se da %15 sluºi kaopokaziva£ steka, da se stek puni od vi²ih lokacija ka niºim i da %15pokazuje vrh steka)PUSH ulazni operand
POP izlazni operand
Naredba poziva funkcije sme²ta na vrh steka zate£eni sadrºaj program-skog broja£a, a u programski broja£ sme²ta vrednost ulaznog ope-randa:CALL ulazni operand
Naredba povratka iz potprograma preuzima vrednost sa vrha steka isme²ta je u programski broja£RET
Aritmeti£ke naredbe omogu¢uju sabiranje, oduzimanje i mnoºenje ula-znih operanada (uz izazivanje izuzetka ako rezultat ne moºe da staneu izlazni operand) kao i deljenje prvog ulaznog operanda drugim isme²tanje koli£nika u izlazni operandADDx ulazni operand , ulazni operand , izlazni operand
SUBx ulazni operand , ulazni operand , izlazni operand
MULx ulazni operand , ulazni operand , izlazni operand
DIVx ulazni operand , ulazni operand , izlazni operand
Naredba za prebacivanje vrednosti kopira vrednost ulaznog operandau lokaciju izlaznog operandaMOV ulazni operand , izlazni operand
Naredba konverzije celog broja u razlomljeni broj omogu¢uje da sevrednost ulaznog operanda, koja je celi broj, konvertuje u vrednostizlaznog operanda, koja je ekvivalentni razlomljeni broj u ma²inskojnormalizovanoj formiTOF ulazni operand , izlazni operand
Naredba konverzije razlomljenog broja u celi broj omogu¢uje da sevrednost ulaznog operanda, koja je razlomljeni broj u ma²inskoj nor-malizovanoj formi, konvertuje u vrednost izlaznog operanda, koja jeekvivalentni celi broj, ako je konverzija mogu¢a, ina£e se izaziva izu-zetakTOI ulazni operand , izlazni operand
-
18 POGLAVLJE 2. HAJ
2.1.3 Direktive
direktiva zauzimanja memorijskih lokacija omogu¢uje zauzimanje ono-liko uzastopnih memorijskih lokacija koliko je navedeno u operandu
WORD broj
-
Listinzi
19
-
20 LISTINZI
-
Slike
1.1 Kompajler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2 Analiza i sinteza ciljnog programa . . . . . . . . . . . . . . . . 9
1.3 Stablo izvoenja . . . . . . . . . . . . . . . . . . . . . . . . . 13
21
-
Indeks
ciljni jezik, 5
gramatika, 12
izvorni jezik, 5
kompajler, 5kompajliranje, 5
labela, 15
ma²inski jezik, 5
programski jezik visokog nivoa, 5
radni registar, 15registar %13, 15registar %14, 15registar %15, 15, 17
22
-
Bibliogra�ja
[1] A.V. Aho, R. Sethi, and J.D. Ullman. Compilers, principles, techniques,and tools. Addison-Wesley series in computer science. Addison-WesleyPub. Co., 1986.
[2] M.L. Scott. Programming Language Pragmatics. Programming LanguagePragmatics. Elsevier Books, Oxford, 2000.
23