PROGRAMSKI PREVODIOCI - TFZR...gramskog jezika - napraviti ekvivalencije izme u re£enica dva jezika...

23

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