64
UNIVERZITET U NOVOM SADU TEHNIČKI FAKULTET "MIHAJLO PUPIN" ZRENJANIN OSNOVE PROGRAMSKIH PREVODILACA - Radna verzija udžbenika (v. 1.0) Autor: doc. dr Ljubica Kazi Zrenjanin, 2020.

OSNOVE PROGRAMSKIH PREVODILACA Radna verzija udžbenika … · UNIVERZITET U NOVOM SADU TEHNIČKI FAKULTET "MIHAJLO PUPIN" ZRENJANIN OSNOVE PROGRAMSKIH PREVODILACA -Radna verzija

  • Upload
    others

  • View
    12

  • Download
    0

Embed Size (px)

Citation preview

  • UNIVERZITET U NOVOM SADU

    TEHNIČKI FAKULTET "MIHAJLO PUPIN" ZRENJANIN

    OSNOVE PROGRAMSKIH PREVODILACA

    - Radna verzija udžbenika (v. 1.0) –

    Autor: doc. dr Ljubica Kazi

    Zrenjanin, 2020.

  • 2

    PREDGOVOR

    Skripta je nastala na osnovu materijala sa časova predavanja i vežbi iz predmeta

    Programski prevodioci, koje je u školskoj 2019/20 godini na Tehničkom fakultetu „Mihajlo Pupin“ Zrenjanin realizovala doc. dr Ljubica Kazi.

    Namena ove skripte je da bude materijal za pripremu teorijskog dela ispita iz predmeta

    “Programski prevodioci” na Tehničkom fakultetu „Mihajlo Pupin“ Zrenjanin.

    Osnovna tri aspekta, koja su definisana akreditacionom dokumentacijom za nastavu programskih prevodilaca, obuhvaćena su ovom skriptom:

    1. Gramatika programskih jezika

    2. Provera kvaliteta programskog koda, kroz leksičku, sintaksnu i semantičku analizu

    3. Osnove funkcionisanja i konstrukcije programskih prevodilaca

    Svakako, cilj je na bude unapreĎena i poprimi formu kompletnijeg udžbenika koji će obuhvatiti sve relevantne elemente osnova progamskih prevodilaca, ali i srodnih tema

    koje su blisko povezane sa problematikom rada i funkcionisanja programskih prevodilaca. Dodatne srodne teme koje nisu obuhvaćene u ovoj početnoj verziji skripte, ali su

    planirane da budu obuhvaćene kompletnijim udžbenikom su:

    1. Opšte teme iz oblasti specifikacije, modelovanja softvera i programiranja

    2. Napredne tehnike primene i implementacije programskih prevodilaca 3. Napredne teme iz oblasti računarski-podržane lingvistike i primene ontoloških

    jezika

    4. Teme u oblasti kvaliteta softvera i podrške detekciji i korekciji grešaka

    programskog koda i grešaka korisnika softvera.

    Autor se zahvaljuje prof. Dr Dragici Radosav na analizi i verifikaciji početnog koncepta kompletnog udžbenika, gde ova skripta predstavlja jedan deo. TakoĎe, zahvaljuje se i

    doc. dr Eleonori Brtka na sugestijama u oblasti specifikacije zahteva putem algoritama i elemenata strukturnog programiranja, kao i doc. dr Kazi Zoltanu na materijalu koji se

    odnosi na ontološke jezike. Saradnja sa navedenim kolegama će se nastaviti u pripremi

    zajedničkog udžbenika, koji će osim tema iz programskih prevodilaca uključiti i dodatne

    srodne teme.

    U Zrenjaninu, maj 2020. Autor Doc. Dr Ljubica Kazi

  • 3

    Sadržaj

    1. PROGRAMSKI JEZICI I PROGRAMSKI PREVODIOCI ................................................................................. 4

    1.1. Vrste programskih jezika ............................................................................................................................ 4

    1.2. Računarska arhitektura i mašinski zavisni jezici ................................................................................ 6

    1.3. Definicija i vrste programskih prevodilaca ........................................................................................... 9

    2. GRAMATIKA PROGRAMSKIH JEZIKA ............................................................................................................................... 10

    2.1. Lingvistika i računarska lingvistika ............................................................................................................................... 10

    2.2. Formalni jezici i gramatike ......................................................................................................................................... 12

    2.3. Forme opisa programskih jezika ............................................................................................................................. 20

    3. GREŠKE PROGRAMSKOG KODA ...................................................................................................................................... 27

    3.1. Kategorizacija grešaka programskog koda .................................................................................................................. 27

    3.2.Primeri grešaka u C# ..................................................................................................................................................... 29

    4.OSNOVE FUNKCIONISANJA I KONSTRUKCIJE KOMPAJLERA ................................................................................................ 31

    4.1. Zadaci i faze rada kompajlera ...................................................................................................................................... 31

    4.2. Komponente arhitekture kompajlera .......................................................................................................................... 32

    4.3. Primeri procesa rada kompajlera različiih programskih jezika ............................................................................... 33

    4.4. Namena i principi funkcionisanja elemenata kompajlera ...................................................................................... 35

    5. TEORIJA AUTOMATA ........................................................................................................................................................... 40

    5.1. Pojam, opšti model i predstavljanje načina rada automata ........................................................................................ 40

    5.2. Karakteristike i kategorizacija automata ..................................................................................................................... 41

    5.3. Konačni deterministički automat ................................................................................................................................. 42

    5.4. Povezanost automata i formalnih gramatika .............................................................................................................. 43

    5.5. Opšti model automata u procesiranju jezika ............................................................................................................... 44

    5.6. Klasifikacija automata za rad sa formalnim jezicima ................................................................................................... 44

    5.7. Tjuringova mašina i Univerzalna Tjuringova mašina ................................................................................................... 45

    5.8. Druge vrste automata .................................................................................................................................................. 46

  • 4

    6.KOMPAJLIRANJE STRUKTURNOG I OBJEKTNO-ORJENTISANOG KODA ................................................................................ 48

    7. ALATI ZA GENERISANJE PROGRAMSKIH PREVODILACA ...................................................................................................... 49

    7.1. PP simulator ................................................................................................................................................................. 49

    7.2. Primeri generatora programskih prevodilaca .............................................................................................................. 58

    ORJENTACIONA ISPITNA PITANJA ZA TEORIJSKI TEST ............................................................................................................ 61

    DODATNE SRODNE TEME ....................................................................................................................................................... 64

    1. PROGRAMSKI JEZICI I PROGRAMSKI PREVODIOCI

    1.1. Vrste programskih jezika

    Opšta klasifikacija softvera

    • Sistemski: skup programa opšte namene, koji služe za kontrolisanje rada računara

    • Aplikativni: skup programa namenjenih realizaciji specifičnih zadataka za korisnika

    Vrste programskih jezika prema zavisnosti u odnosu na tip mašine na kojoj se izvršava program

    - Viši programski jezici (mašinski nezavisni)

    - Niži programski jezici (mašinski zavisni): asemblerski jezik, mašinski jezik

    Vrste programskih jezika prema nameni:

    Programski jezici opšte namene: BASIC, ALGOL (Algoritamski jezik), PL-1 Programski jezici specifične namene: Fortran (Formula translation), COBOL

    (Common Business Oriented Language)

    Komparacija viših programskih jezika i asemblerskog jezika

  • 5

  • 6

    1.2. Računarska arhitektura i mašinski zavisni jezici

    Blok-šema mikroračunarskog sistema:

    Osnovni delovi mikroprocesora:

    Registri predstavljaju internu memoriju samog mikroprocesora. U mikroprocesor stižu

    adrese, podaci i upravljački signali putem 3 odvojene linije (izvodi) i oni se privremeno

    smeštaju u register, a zatim obraĎuju od strane upravljačke i aritmetičko logičke jedinice. Svaki tip mikroprocesora ima specifičnu internu organizaciju. Za registre model

    mikroprocesora Intel 8086-8088 dat je pregled na sledećoj slici:

  • 7

    Prvobitni računari su funkcionisali tako što se fizički morala izvršiti izmena strujnih kola u okviru procesora. Kombinacija nula (nema protoka struje kroz odreĎeni strujni vod) i

    jedinice (ima protoka struje) je davala instrukcije i podatke. Primer je dat u nastavku.

    Npr. prva instrukcija zadata je trojkom nula i jedinica koja predstavlja samu operaciju koja se realizuje, druga 2 predstavljaju ciljni element (registar gde se nalaze podaci), a poslednja dva izvorni element (registar gde se nalaze podaci) nad kojim se izvršava

    operacija.

    Džon fon Nojman (1903-1957) predložio je koncept unutrašnjeg programiranja, gde se

    instrukcije, umesto ručnog fizičkog menjanja, memorišu i trajno čuvaju. Tumačenjem instrukcija mikroprocesor izvršava program. Fon Nojmanov koncept odnosi se na čuvanje

    veze izmeĎu instrukcija i bitova u memoriji, izmene strujnih kola se mapiraju u naredbe

    mašinskog programa. Naredbe mašinskog programa se tumače od strane posebnog registra dekodiranja, koji transformiše te instrukcije u izmene strujnih kola

    mikroprocesora (CPU).

    Skup svih instrukcija procesora kodiranih brojevima čini MAŠINSKI JEZIK tog

    PROCESORA.

  • 8

    Program napisan mašinskim jezikom procesor izvršava direktno, instrukciju po

    instrukciju i jedino takav program razume.

    Ako se svakoj instrukciji mašinskog jezika, koja je predstavljena brojem, pridružimo neki

    naziv dobijamo simbolički mašinski jezik ili ASEMBLERSKI JEZIK. Simbolička imena osmišljava proizvoĎač procesora, tako da što slikovitije opišu šta ta naredba radi.

    Asemblerski jezik je namenjen ljudima i računar ga ne razume.

    PrevoĎenje naredbi simboličkog jezika u mašinski jezik (tj. zapis brojevima) realizuje program ASEMBLER.

  • 9

    1.3. Definicija i vrste programskih prevodilaca

    Definicija programskog prevodioca

    Program koji prevodi programski tekst sa jednog programskog jezika na drugi programski

    jezik.

    Vrste programskih prevodilaca u odnosu na način prevoĎenja:

    • Kompajler – prevodi ceo program (prevoĎenje sa višeg programskog jezika na mašinski jezik).

    • Interpreter – prevodi u toku izvršavanja jednu po jednu naredbu.

    Komparacija načina rada kompajlera i interpretera:

  • 10

    2. GRAMATIKA PROGRAMSKIH JEZIKA

    2.1. Lingvistika i računarska lingvistika

    Opšta lingvistika izučava opšte osobine različitih jezika kroz različite nivoe strukture –

    zvuke (slova), reči i rečenice.

    Oblasti koje izučava opšta lingvistika:

    • Fonetika – zvuci kao glasovi, osobine, artikulacija

    • Fonologija – fonemi kao klase glasova

    • Prozodija – izgovaranje reči prema akcentu, intonaciji, slogovima • Morfologija – oblik reči i varijacije (u odnosu na rod, broj, vreme...)

    • Leksikografija – struktura rečnika

    • Sintaksa – uzajamni odnosi reči u grupama (fraze, rečenice)

    • Semantika – značenje reči, funkcije koje ih povezuju, njihova upotreba

    Računarska lingvistika je interdisciplinarna oblast koja se odnosi na računarski podržanu obradu ljudskog (prirodnog) jezika.

    Ključni segmenti koje računarska lingvistika izučava su: • Obrada ljudskog (prirodnog) govora u smislu prepoznavanja elemenata (ne

    uključuje fizičke realizacije zvukom – time se bavi Speech recognition) • Generisanje ljudskog (prirodnog) govora.

    Treba razlikovati računarsku lingvistiku i “Speech recognition”.

    Prepoznavanje govora (Speech recognition) bavi se mašinskim dekodiranjem govornog materijala, tj. automatskom detekcijom i identifikacijom reči i rečenica iz

    zvukovnog materijala. Kombinuje fonetiku-fonologiju i inženjerstvo.

    Neke od najvažnijih metoda RAČUNARSKE LINGVISTIKE:

    • Morfološka analiza – prepoznavanje reči u tekstu iz izdvajanje korena i nastavka. Izdvojeni elementi se nazivaju morfemi i uporeĎuju se sa rečnikom (leksikon).

    • Sintaksna analiza – analiza strukture rečenica, predstavlja se putem sintaksnog

    stabla. UporeĎuje se sa pravilima gramatike. Proces sintaksne analize naziva se

    parsiranje. Programi koji realizuju ovu analizu nazivaju se parseri.

    • Semantička analiza- analiza značenja reči i rečenica. Značenje zavisi od

    konteksta (okruženja) i namene, odnosno čemu će to tumačenje značenja biti

    korisno (pragmatički aspekt). Može se koristiti jezik veštačke inteligencije Meaning

    Representation Language.

    Problemi koji se javljaju u okviru računarske lingvistike odnose se na sinonime (reči

    različitih oblika istog značenja) i homonime (reči istog oblika, različitog značenja u

  • 11

    zavisnosti od konteksta). Jedno od rešenja problema predstavljaju domenski-zavisni

    rečnici koji daju podskup reči i značenja u odnosu na odreĎenu namenu.

  • 12

    2.2. Formalni jezici i gramatike

    Kada su u pitanju programski jezici, izuzetno je važno predstaviti sam programski jezik

    na formalan način.

    Formalni sistem se koristi za transformaciju (izvoĎenje) jednog izraza iz drugog ili više

    drugih izraza.

    Formalni sistem se sastoji iz:

    – Formalnog jezika

    – Deduktivnog sistema (skup transformacionih pravila, skup aksioma i

    mehanizam zaključivanja - inference)

    Formalni jezik je odreĎen:

    – Alfabetom, tj. skupom dozvoljenih simbola (slova)

    – Gramatikom, tj. skupom pravila za formiranje ili transformisanje reči i izraza – Skupom reči formiranih od slova alfabeta, u skladu sa gramatikom

    OPŠTA DEFINICIJA FORMALNOG JEZIKA

    Formalni jezik je skup reči, tj. konačnih stringova koji se sastoji iz simbola alfabeta nad

    kojim je jezik definisan, a koji su formirani u skladu sa pravilima gramatike.

    Vrste jezika u odnosu na skup dozvoljenih reči: • Konačan – Jezik je opisan skupom reči nabrajanjem, npr. L = {a, b, ab, cba}, gde

    reči odgovaraju pravilima • Beskonačan – skup prihvatljivih reči definisan je pravilima, ali konkretne reči nisu

    unapred poznate i ne mogu se sve nabrojati.

    Metajezik je jezik koji se koristi da bi se opisao neki drugi jezik (najčešće nazvan objektni jezik).

    Elementi napisani metajezikom razlikuju se od elemenata napisanih objektnim jezikom

    jer su napisani posebno formatiranim slovima i specifičnim simbolima.

    Struktura fraza i rečenica napisane metajezikom definisana je metasintaksom.

    Metaprogramiranje je tehnika programiranja gde računarski program može da tretira

    druge programe kao podatke koje obraĎuje, tj. može da ih čita, analizira, transformiše itd.

  • 13

    Matematička definicija formalnog jezika

    Ako sa Σ obeležimo alfabet nekog jezika, a Σ* skup svih mogućih reči koje se mogu

    kreirati pomoću tog alfabeta, onda možemo definisati formalni jezik L kao podskup svih

    reči koje se mogu kreirati na osnovu alfabeta (Σ), tako da je L Σ*. Podskup reči je

    takav da svaka reč odgovara pravilima gramatike.

    Definicije formalnog jezika u teoriji formalnih jezika u odnosu na ključne procese:

    Generativni pristup - Formalni jezik je skup stringova generisanih od strane

    gramatike.

    Rekognitivni pristup - Formalni jezik je skup stringova koji je prepoznat kao

    korektan.

    REČ predstavlja string, odnosno konačnu sekvencu simbola iz alfabeta nekog jezika.

    Reč koja ima dužinu nula označava se: ε

    LITERAL je reč koja predstavlja nepromenljivu vrednost u programskom kodu.

    Literali mogu biti: konstante, ključne reči programskog jezika i sl.

    IzvoĎenje reči – postupak generisanja reči primenom pravila gramatike.

    Dužina reči – broj slova koja čine reč. Primer: |abc| = 3

    Formalna gramatika

    Pravila prevoĎenja

  • 14

    Data je formalna gramatika G = (V, T, S, P). Formalni jezik generisan formalnom gramatikom L(G) definisan je kao:

    w – reči kreirane na osnovu početne promenljive S, a sastavljene od terminalnih simbola T.

    Formalni jezik L definisan gramatikom G označava se L(G) i predstavlja skup reči

    izvedenih iz startnog simbola gramatike, a koje se sastoje od terminalnih simbola.

    Primeri HTML jezika Varijable (promenljive) – , , , …

    Terminali – karakteri alfabeta: slova, cifre, specijalni karakteri

    - Literali konstante: “”, "“ ...

    Start -

    Pravila – skup prethodno navedenih pravila, npr.

  • 15

    Kategorizacija formalnih gramatika prema Avram Noam Chomsky, u odnosu na

    vrste elemenata leve i desne sekvence produkcionih pravila (alfa i beta), tj. pravila P formalne gramatike G:

    Tip 0 – Opšte gramatike (Unrestricted grammar, Turing-recognizable)

    Tip 1 – Konteksno-zavisne gramatike (Context-sensitive) Tip 2 – Konteksno-nezavisne gramatike (Context-free) Tip 3 – Regularne gramatike (Regular)

    Tip 0 - Opšta gramatika

    • Desna sekvenca pravila može biti prazna • Prepoznatljiva za Turing-mašinu

    • Svaka formalna gramatika koja zadovoljava opšte uslove za formalne gramatike

  • 16

    Tip 1 - Konteksno-zavisne formalne gramatike

    • Nije dozvoljeno pravilo da je desna sekvenca prazna

    • Isti pojam (neterminal, promenljiva) može imati više raznih izvoĎenja u zavisnosti od konteksta

    • Dužina leve sekvence pravila je manja ili jednake dužine kao desna sekvenca

    pravila Tip 2- Konteksno-nezavisne formalne gramatike

    • Nazivi: kontekst-slobodne, beskonteksne

    • Leva sekvenca pravila sadrži samo jedan neterminal (promenljivu, pojam), a desna može biti kombinacija terminala i neterminala.

    • Kontekst ne može uticati na izvoĎenje datog pojma

    PRIMENA: Za opis programskih jezika se obično koriste beskonteksne gramatike.

  • 17

    Tip 3 - Regularne formalne gramatike

    • Leva sekvenca sadrži samo jedan pojam, a desna najviše jedan pojam(promenljivu,

    neterminal) i jedan terminalni element

    • Postoje 2 vrste regularnih gramatika – leva i desna (u zavisnosti od odnosa neterminala i terminala).

    Primer desne regularne gramatike (desno se nalazi promenljiva/neterminal):

  • 18

    PRIMENA: Regularne gramatike generišu regularne izraze koji se prepoznaju konačnim

    automatima. Koriste se kod programskih prevodilaca za opis leksičkih elemenata jezika:

    identifikatora, konstanti, literala...

    Atributivna gramatika je proširenje konteksno-slobodne gramatike, gde je svaki

    simbol (terminal i neterminal) opisan dodatnim atributima. Na ovaj način dodaje se

    mogućnost pridruživanja semantike.

  • 19

    U atributivnoj gramatici, svakom simbolu je dodeljen skup atributa. Vrednosti atributa se

    odreĎuju u skladu sa semantičkim pravilima. Vrednost atributa s leve strane pravila se

    izvodi iz vrednosti atributa elemenata sa desne strane pravila.

    Primena atributivnih gramatika omogućava rešavanje problema nejednoznačnosti,

    odnosno tumačenja višestrukih značenja i višestrukih pojava rečenica istog značenja.

    Atributivne gramatike se koriste za konstrukciju kompajlera, kako bi im omogućilo procesiranje semantike programskih jezika.

    Primer:

  • 20

    2.3. Forme opisa programskih jezika

    Pravila gramatike programskog jezika se najčešće predstavljaju primenom:

    Bekus-Naurove forme

    Proširene Bekus-naurove forme (EBNF) notacije

    Sintaksnih dijagrama

    Bekus-Naurova forma

    Backus Naur forma (BNF) predstavlja meta jezik, odnosno notaciju za predstavljanje

    drugih jezika.

    Namena: U računarskim naukama, BNF se koristi za predstavljanje sintakse, odnosno

    sintaksnih pravila računarskih programskih jezika, formata dokumenata, skupa instrukcija ili komunikacionih protokola. BNF je uobičajeni način predstavljanja

    konteksno-slobodnih gramatika programskih jezika.

    BNF specifikaciju čini skup pravila izvoĎenja, napisanih u formi: ::== izraz

    Napomene u vezi elemenata metasintakse: Naziv elementa sa leve strane je uvek u zagradama < >

    ::== je znak da se naziv sa leve strane može zameniti izrazom s desne strane. “” – za literale (konstante)

    | - za opciono pojavljivanje (ili) izmeĎu alternativa

    Istorijat – Prvobitni naziv BNF je bio Bekusova normalna forma. Backus Normal Form

    (John Backus – osmislio programski jezik Fortran). Peter Naur primenio je BNF na

    programski jezik Algol 60 i izložio drugačiji pristup. Od 1964. naziv je promenjen na

    Backus-Naur form (predložio je Donald Knuth).

    Pravila primene BNF data su primenom samog BNF:

  • 21

    Ilustracija primene BNF data je za primer programskih jezika i uobičajenih programskih

    strktura.

    Napomena:

    Naredni primer ima greške, jer konstantne vrednosti (literali) treba da su navedeni u

    navodnicima, prema pravilima BNF. Dakle, trebalo bi: “{“, “:=”, “if”, “else”, “while” Prihvatljiva je i primena apostrofa, tj. „{„, „:=‟, „if‟, „else‟, „while‟.

    Proširena Bekus-Naurova forma (EBNF)

    EBNF (Extended Backus Naur Form) predstavlja grupu metasintaksnih notacija, koje

    se koriste za predstavljanje konteksno slobodnih gramatika (kao što je npr. gramatika

    programskog jezika), koje je proširenje osnovne BNF.

  • 22

    Prvo proširenje je predložio Niklaus Wirth (osmislio programske jezike: Pascal, Modula,

    Modula-2), a ISO organizacija je prilagodila EBNF kao standard ISO/IEC 14977.

    Osnovni doprinos koje je dao Niklaus Wirth je proširenje uvoĎenjem metasintaksnih elemenata:

    [ ] za opciono pojavljivanje, { } za višestruko pojavljivanje elementa, ( ) za grupisanje

    elemenata

    Ranije su se koristili meta-simboli koji su se pisali iza osnovnih elemenata i označavali: * Kleene zvezda – 0 ili više pojavljivanja, umesto toga se koristi u EBNF vitičasta

    zagrada{}

    + Kleene krst – 1 ili više pojavljivanja

    ? za 0 ili 1 pojavljivanja – umesto toga se koristi u EBNF uglasta zagrada [ ]

    EBNF prema ISO/IEC 14977 standardu:

    Pravila korišćenja EBNF prikazana pomoću samog EBNF:

  • 23

    PRIMERI:

    BNF EBNF

    ::= „A‟ | „B‟ | „C‟ :>= „0‟ | „1‟ | „2‟

    ::=

    |

    |

    ::= { |

    }

    ::= „a‟ ::= „a‟ {„a‟}

    ::= „a‟ | „a‟ ::= „a‟ []

    Primer EBNF za C# gramatiku:

    ::=| ::= '//'

    ::= ';' ::=

    ||

    Nastavak (neispravan je samo simbol dodele, umesto :== treba ::=)

  • 24

    Sintaksni dijagrami

    Sintaksni dijagram grafički opisuje sintaksu programskog jezika i predstavlja alternativu prikazu u EBNF formi.

    Korišćenje jednog konkretnog simbola, tj. literala X1

    Korišćenje jednog elementa, čija će struktura naknadno biti detaljnije objašnjena

    Izbor jednog od više mogućih elemenata:

  • 25

    Mogućnost da se element može uzeti, ali ne mora

    Mogućnost izbora jednog od više elemenata ili nijednog

    Niz elemenata koji slede jedan za drugim:

  • 26

    Element koji se može ponavljati više puta, ali ne mora nijednom da se pojavi:

  • 27

    3. GREŠKE PROGRAMSKOG KODA

    3.1. Kategorizacija grešaka programskog koda

    Vrste grešaka u odnosu prema procesu kompajliranja:

    1. Logićke greške

    2. Greške u toku kompajliranja

    3. Greške u toku izvršavanja

    Objašnjenje i primeri pojedinih tipova grešaka:

    1. Logičke greške – nezavisne od procesa kompajliranja ili izvršavanja, Program ne

    daje očekivan izlaz jer kod nije napisan u skladu sa specifikacijom zahteva. Ovu

    vrstu greške kompajler ne može da detektuje.

    2. Greške u toku kompajliranja (compile-time errors):

    a) Leksičke greške – nedozvoljeni simbol ili oblik reči (reč nije moguće prepoznati,

    tj. tokenizovati – klasifikovati i zameniti tokenom).

    PRIMERI: nije moguće prepoznati naredbu ili atribut neke klase, jer

    takav ne postoji (kucačka greška).

    b) Sintaksne greške – nepravilna konstrukcija rečenica, nedostaje neki element

    rečenice. Rečenica nije napisana u skladu sa sintaksnim pravilima.

    1.1. PRIMERI: nedostaje ; na kraju rečenice, prilikom navoĎenja atributa

    stavlja se () a ne treba, kod poziva metode zaboravljen (), u okviru

    izraza zaboravljena zatvorena zagrada, u okviru blokova zaboravljena {

    ili } itd....

    c) Semantičke greške – kompajler ulazi u tumačenje značenja programskog koda,

    uporeĎujući delove šireg programskog koda aplikacije i vezanih biblioteka klasa.

    Proverava generalnu usklaĎenost i potpunost. U okviru compile-time mogu se

    detektovati statičke semantičke greške.

    PRIMERI: Greške ovog tipa su vezane za tipove podataka, deklaraciju

    promenljivih, primenu operatora, parametre poziva procedura. Npr.

    promenljiva nije deklarisana, a koristi se. Objekat nije instanciran. Promenljiva

    je deklarisana, a nije korišćena. U using delu nije navedena potrebna

    biblioteka, a koristi se klasa iz te biblioteke. Procedura ima manje ili više

    parametara nego što je potrebno, tipovi podataka parametara ne odgovaraju.

    Primena operatora nad tipovima podataka koji ne odgovaraju, udruživanje

  • 28

    promenljivih u operatorima neadekvatnih tipova. Promenljiva je deklarisana

    unutar bloka i izvan njega je nevidljiva i ne može se koristiti, a pozvana je...itd.

    3. Greške u toku izvršavanja aplikacije (run-time errors):

    PRIMERI:

    2.1. Nedefinisano stanje programa u odnosu na unete podatke u toku

    korišćenja aplikacije – rešava se validacijama, tj. delom koda kojim se

    proveravaju očekivane tj. moguće greške korisnika i adekvatno reaguje

    ukoliko nastupe.

    2.2. Nedostaje ili je neispravna prateća biblioteka klasa od koje osnovna

    aplikacija zavisi.

    2.3. Dinamičke semantičke greške – često se dešava da se tek prilikom izvršavanja aplikacije dinamički spajaju moduli u jednu celinu i tek tada se

    mogu, u kombinaciji sa podacima, desiti greške. TakoĎe, dinamičke

    semantičke greške nastaju prilikom primene aplikacije nad podacima kada nisu validacijama sprečene situacije neispravnog unosa. 2.4. Logičke greške – kompajler ih ne može detektovati, već su vidljive

    putem inspekcije koda (statičko white box testiranje) ili prilikom pokretanja (black box testiranje), kada kod ne daje očekivani izlaz. Razlog je što kod

    nije napisan u skladu sa specifikacijom zahteva. 2.5. Greške eksternih podataka – problem u ispravnosti i dostupnosti

    eksternih izvora podataka (datoteka, baza podataka) 1) ne postoji data putanja, mreža ne funkcioniše a zahtevaju se podaci iz lokalne mreže,

    internet ne funkcioniše a zahtevaju se podaci primenom nekog URL,

    nepostojeći ili nefunkcionalan URL, nepostojeća datoteka sa tim imenom, 2)

    neispravan SQL upit- ukazuje na nepostojeću bazu podataka, tabelu, polje i sl.

  • 29

    3.2.Primeri grešaka u C#

    Neki od primera grešaka prema ranije navedenim kategorijama:

    Logička greška

    Public int Saberi (int a, int b)

    {

    return a - b ;

    }

    Leksička greška

    int i =ч9; simbol ч se ne koristi

    intz i=9; intz ne može biti prepoznat kao validna ključna-službena reč C# jezika

    Sintaksna greška

    int i=9 nedostaje ; na kraju reda

    Statička semantička greška

    1. primer

    int i=3; promenljiva j nije prethodno deklarisana

    i=j+2*i;

    2. primer

    int i=3; ne mogu se sabirati string i broj bez prethodnog type casting

    string j=“pozdrav”;

    i=j+2*i;

    Dinamička semantička greška:

    a=b/c za c je uneta vrednost 0, pa će biti generisana greška „Division by

    ZERO“.

    Tipična run-time greška:

    SQL upit u kojem se navodi naziv baze podataka, tabele ili polja koje ne postoji,

    odnosno komanda samog SQL jezika koja ne može biti prepoznata. Tumačenje SQL

    naredbe u smislu sintaksne ispravnosti se vrši tek kada sam SQL upit stigne do DBMS,

    a ne na nivou aplikacije. Kompajler ove greške ne može da detektuje.

  • 30

    PRIMER:

    PRIMER SA GREŠKOM KOREKTAN PRIMER

    Xf (Textbox1.Text

    {

    a=b+c; }

    IF (Textbox1.Text.Length>0)

    {

    a=b+c; }

    U ovom primeru:

    Leksička greška – Xf nije validna reč za uslov

    Sintaksna greška – nije zatvorena zagrada oko uslova

    Semantička greška – uslov mora imati bool vrednost, ne može biti string

  • 31

    4.OSNOVE FUNKCIONISANJA I KONSTRUKCIJE KOMPAJLERA

    4.1. Zadaci i faze rada kompajlera

    Ulaz i izlaz za kompajlere predstavlja:

    - Izvorni (source) program – tekst programa napisan na jeziku višeg nivoa

    - Ciljni (target) program - naziva se objektni kod, a predstavlja izvršni program, koji

    nastaje nakon prevoĎenja. Izvršni program je napisan kao mašinski kod u odnosu

    na ciljni računar na kom treba da se izvršava.

    Osnovni zadaci kompajlera su: - Transformacija iz izvornog programa napisanog na jeziku višeg nivoa u ciljni izrvšni

    program - Detekcija grešaka izvornog programskog koda

    Osnovne dve faze rada kompajlera su:

    1. Analiza (“front-end” grupa aktivnosti) – ulaz je izvorni kod napisan na višem programskom jeziku, a rezultat rada je meĎukod.

    2. Sinteza (“back-end” grupa aktivnosti) – ulaz je meĎukod, a izlaz je mašinski kod.

  • 32

    4.2. Komponente arhitekture kompajlera

    Osnovne komponente arhitekture kompajlera predstavljaju moduli, koji mogu biti realizovani i kao zasebni alati, ali su najčešće integrisani u okviru kompajlera. Svaki od

    modula realizuje odreĎenu grupu aktivnosti.

    Osnovne komponente kompajlera su odreĎene fazama i aktivnostima:

    I FAZA – ANALIZA (“Front-end”)

    1. LEKSIČKI ANALIZATOR - SKENER realizuje leksičku analizu izvornog programskog

    koda.

    2. SINTAKSNI ANALIZATOR - PARSER realizuje sintaksnu analizu nad prethodno

    tokenizovanim tekstom.

    3. SEMANTIČKI ANALIZATOR 4. GENERATOR MEĐUKODA

    II FAZA – SINTEZA (“Back end”) 1. MAŠINSKI NEZAVISAN OPTIMIZATOR MEĐUKODA

    2. GENERATOR ASEMBLERSKOG KODA 3. MAŠINSKI ZAVISAN OPTIMIZATOR ASEMBLERSKOG KODA

    4. GENERATOR MAŠINSKOG KODA

    Transformisana slika na osnovu: PROGRAMSKI PREVODIOCI, Elektronski fakultet Niš, 2017.

  • 33

    4.3. Primeri procesa rada kompajlera različiih programskih jezika

    Fortran

    Većina programskih jezika

    C

    Ranije verzije C++

  • 34

    Java

    Mnogi sistemi kombinuju aspekte kompajlera i interpretera. Jedan primer je Java. Java kao programski jezik pripada grupi kompajliranih, ali se ne kompajlira za neki konkretan

    realan CPU, već za Java Virtualnu Mašinu (JVM). S obzirom da za JVM ne postoji realan

    CPU, on se emulira.

  • 35

    4.4. Namena i principi funkcionisanja elemenata kompajlera

  • 36

    Generisanje međukoda

    Generisanje međukoda rezultuje kodom koji je na apstraktnijem nivou, a može biti transformisan u jezike raznih konkretnih ciljnih mašina. Upravo generisanje međukoda omoguduje da se nad njim izvrši potrebna optimizacija, a tek nakon toga prevodi u mašinski-zavisni oblik. Prezentacija međukoda (Intermediate Representation IR) može biti:

    - IR višeg nivoa – oblik naredbi međukoda je sličan višem programskom jeziku

    - IR nižeg nivoa – bliža ciljnoj mašini, ali još uvek mašinski nezavisna.

    Primena IR je u omogudavanju da se realizuje front-end nezavisan od mašine, izvrši potrebna

    optimizacija I omogudi kasniji rad back-enda za više vrsta CPU nad istim međukodom.

  • 37

    Generisanje međukoda

    Generator asemblerskog koda

    Generator asemblerskog koda transformiše meĎukod u konkretan asemblerski kod za odreĎeni tip

    mašine.

    Primer asemblerskog koda

    Instrukcije asemblerskog jezika Simboličke instrukcije procesora zavise od vrste procesora. Ovde su date neke najvažnije

    instrukcije asemblerskog jezika za Intel procesore x86.

    ADD – dodaje vrednost drugog operanda prvom cuva rezultat u prvom operandu

    SUB – realizuje razliku (oduzimanje) vrednosti drugog operanda od prvog,

    cuva rezultat u prvom operandu CMP - uporedjuje vrednost prvog i drugog operanda

    AND – izvrsava logicko I na nivou bitova i cuva rezultat u prvom operandu

    OR – izvrsava logicko ILI na nivou bitova i cuva rezultat u prvom operandu

    NOT – izvršava inverziju bitova u jednom operandu i čuva vrednost u istom operandu Ove instrukcije se koriste u kombinaciji sa prethodnim CMP, gde se uporedjuju vrednosti

    registara.

    JE – jump if equal

    JNE – jump if not equal JB – jump if below

  • 38

    JBE – jump if below or equal JA – jump if above

    JAE – jump if above or equal

    JMP – unconditional jump – skok na lokaciju koja je naznacena,

    bez prethodnog uslova Ostale instrukcije:

    Brk – prekida program, ali može biti pokrenut ponovo

    Iret – vraca kontrolu sa interapt servisa

    Halt – prekida izvrsavanje programa

    PRIMER:

    PrevoĎenje C programa u kod napisan asemblerskim jezikom za odreĎeni procesor.

    Izvor: https://www.cs.princeton.edu/courses/archive/fall15/cos375/lectures/01-Introduction-2x2.pdf

  • 39

    Generisanje izvršnog koda

    Generisanje izvršnog koda nastavlja se nad asemblerskim oblikom i rezultuje mašinskim

    kodom. Zavisi od mašine i seta instrukcija njenog procesora.

    PRIMER:

    PrevoĎenje iz asemblerskog zapisa u mašinski kod odreĎenog procesora.

    Izvor: https://www.cs.princeton.edu/courses/archive/fall15/cos375/lectures/01-Introduction-2x2.pdf

  • 40

    5. TEORIJA AUTOMATA

    5.1. Pojam, opšti model i predstavljanje načina rada automata

    Izraz automat ("Automata“) izveden je iz grčke reči "αὐτόματα" što znači "selfacting“, odnosno

    „samostalno delovanje“.

    Definicija:

    Automat je apstraktni funkcionalni računarski ureĎaj koji samostalno izvršava unapred

    definisanu sekvencu operacija. Automat je apstraktni model digitalnog računara i kao takav

    poseduje sve osnovne osobine računara – u mogućnosti je da čita ulaz, obraĎuje ulazne podatke i

    daje izlaz, uz primenu kontrolne jedinice koja vrši obradu i privremene memorije.

    Izvor: teorija automata (izvor TutorialsPoint, 2016), Peter Linz: An Introduction to Formal

    Languages and Automata, Fifth Edition, Jones&Bartlett, 2012.

    Opšti model automata

    Način rada automata se predstavlja tabelom ili grafom tranzicije stanja (dijagram stanja).

  • 41

    5.2. Karakteristike i kategorizacija automata

    IZVOR: AUTOMATA THEORY, TUTORIALS POINT, 2016.

  • 42

    5.3. Konačni deterministički automat

    Formalna definicija konačnog determinističkog automata:

    Primer:

  • 43

    5.4. Povezanost automata i formalnih gramatika

    U kontekstu automatskog prepoznavanja jezika, tj. utvrĎivanja da li reč pripada jeziku definisanim odreĎenom gramatikom koriste se automati.

    Iz knjige: PROGRAMSKI PREVODIOCI, Elektronski fakultet Niš, 2017

  • 44

    5.5. Opšti model automata u procesiranju jezika

    5.6. Klasifikacija automata za rad sa formalnim jezicima

  • 45

    5.7. Tjuringova mašina i Univerzalna Tjuringova mašina

  • 46

    5.8. Druge vrste automata

  • 47

    Jednosmerni deterministički konačan automat

  • 48

    6.KOMPAJLIRANJE STRUKTURNOG I OBJEKTNO-ORJENTISANOG KODA

    Osnovni koncept strukturnog programiranja zasniva se na:

    top-bottom pristupu podele programa na podprograme, module i procedure, pri

    čemu moduli mogu da budu nezavisni fajlovi I potrebno je integrisati ih u

    funkcionalnu celinu. MeĎutim, prilikom pisanja koda, centralno rešenje I svi moduli

    su blisko semantički povezani I fokusirani na zajednički problem koji rešavaju.

    primeni tzv. Strukturne teoreme. Strukturna teorema (Boehm & Jacopini): “Rešenje bilo kog problema, koji je po svojoj prirodi rešiv pomoću računara, može se

    izraziti kao superpozicija sledećih struktura: sekvence, selekcije i iteracije”.

    Sekvenca – ureĎen niz instrukcija gde se po završetku i-te instrukcije izvršava i+1 instrukcija,

    Selekcija – omogućava izbor jedne od više mogućih putanja izvršavanja instrukcija, a izbor odreĎuje ispunjenost uslova koji je definisan kao logički izraz

    (if-then-else, case),

    Iteracija – omogućava ponavljanje operacija tela iteracije odreĎeni broj puta, gde se broj ponavljanja kontroliše uslovom (while, for, repeat).

    Objektno-orjentisano programiranje zasniva se na: Bottom-up pristupu izgradnji klasa, koje su udružene u biblioteke klasa, uz

    nastojanje da budu univerzalno kreirane i na taj način da se omogući ponovna iskoristivost programskog koda i lako održavanje.

    Višeslojni pristup softvera kroz više biblioteka klasa, gde svaki sloj realizuje pojedini aspekt složene strukture. Na ovaj način

    Principima – enkapsulacije (skrivanje detalja implementacije klasa), nasleĎivanja

    (preuzimanja realizovane klase uz mogućnost proširenja ili redefinisanja) i

    polimorfizma (raznovrsno ponašanje objekata klasa u zavisnosti od tipa objekta na koji se odnosi, što je omogućeno konceptom istoimenih metoda različitih

    implementacija u baznoj i izvedenoj klasi prilikom nasleĎivanja). Klase predstavljaju jedinstvo structure podataka (atributi) i funkcionalnosti

    (metode). Uz nastojanje da se što više enkapsulira implementacija, suštinski

    atributi koji čuvaju stanje objekata klasa mogu da izmene svoje vrednosti samo

    pozivima metoda tih klasa.

    U oba slučaja, izuzetno je važno obratiti pažnju na moguće greške posebno u okviru

    zasebnih modula u odgovarajućim strukturama. Testiranjem modula (unit testing) i zasebnim kompajliranjem, a kasnijim povezivanjem u celinu potrebno je obratiti pažnju i

    na samu povezanost modula i rizična mesta gde se moduli povezuju. Prilikom

    kompajliranja, kompajler detektuje greške i u povezanim modulima (bibliotekama klasa).

  • 49

    7. ALATI ZA GENERISANJE PROGRAMSKIH PREVODILACA

    7.1. PP simulator

    U okviru priprema vežbi iz predmeta Programski prevodioci na Tehničkom fakultetu „Mihajlo Pupin“

    Zrenjanin u školskoj 2019-20 godini je doc. dr Ljubica Kazi kreirala softver koji treba da ilustruje način rada

    programskog prevodioca u 1. fazi rada – analizi programskog koda. Ovaj softver je nazvan PP simulator i

    obuhvata aktivnosti:

    1. Rekonstrukcija programskog koda (priprema koda eliminisanjem nepotrebnih elemenata)

    2. Leksička analiza – analiza karaktera i reči i povera u skladu sa dozvoljenim elementima i oblikom

    3. Sintaksna analiza – provera konstrukcija rečenica u skladu sa sintaksnim pravilima

    4. Semantička analiza – provera sadržinskog, značenjskog dela programskog koda komparacijom

    različitih naredbi, njihove povezanosti i načina primene.

    Ovaj alat PP simulator osmišljen je da bude univerzalan u odnosu na programski jezik, jer ima eksterne

    šifarnike kojima se detaljnije opisuju ograničenja konkretnog jezika.

    PP simulator je kreiran kao objektno-orjentisana C# aplikacija. Izgled osnovnog ekrana aplikacije prikazan

    je na sledećoj slici:

    Sastoji se iz 3 segmenta:

    SEGMENT OPIS FAJLOVI IZVRŠNE VERZIJE

    KORISNIČKI

    INTERFEJS

    Desktop

    aplikacija PP_simulator.exe

    KLASE Biblioteke

    klasa

    Analiza_Lib.dll

    Simboli_Lib.dll

    Util_Lib.dll

  • 50

    PODACI XML fajlovi

    XML fajlovi predstavljaju izvor podataka za pravila – dozvoljene karaktere, reči, semantičke I sintaksne

    šablone. TakoĎe, predstavlja i ciljni oblik snimanja rezultata prepoznavanja elemenata koda (leksema) i

    dodeljenih zamenskih tokena.

    Prvi deo predstavlja analizator karaktera reči.

    U cilju simulacije definisana je tabela sa dozvoljenim

    karakterima:

    Uneta je reč za koju se očekuje da neće biti prepoznata i dobijamo rezultat:

    Uneta je reč koja se očekuje da bude ispravna i prepoznata:

  • 51

    Drugi deo PP simulatora je analizator jedne rečenice. Nastavak u odnosu na prethodni deo je spisak

    dozvoljenih reči.

    Drugi osnovni deo je spisak semantičkih šablona:

    Uneta neispravna rečenica namerno, jer znamo da neka slova nisu u tabeli dozvoljenih. Dobiljamo:

  • 52

    Uneta je ispravna rečenica što se tiče karaktera, ali sintaksno neispravna. Jedino sintaksno pravilo je

    provera da li na kraju reda postoji “;”. Dobijamo sledeći izveštaj:

    Uneta je leksički i sintaksno ispravna rečenica, ali nije semantički.

  • 53

    Konačno, uneta je leksički, sintaksno i semantički ispravna rečenica.

  • 54

    Kreiran je poseban deo za analizu segmenta programskog koda C#.

    Da bi se takva analiza realizovala, potrebne su posebne pomoćne tabele:

    Unet je kod za analizu koji je ispravan:

  • 55

    Nakon izbora opcije ANALIZIRAJ dobijamo po okončanju analize poruku:

    Nakon toga pristupamo ekranskoj kartici za rekonstrukciju:

  • 56

    TakoĎe, možemo pogledati i ekransku karticu za leksičku analizu:

    Opcije za sintaksnu i semantičku analizu nisu finalizirane.

    KADA BISMO NAMERNO DODALI ?!^$ tj. karaktere koji nisu u spisku specijalnih karaktera koji se mogu prepoznati

    (ovo je hipoteticki primer gde namerno ih nismo uvrstili u tabelu specijalnih karaktera) KAKO BISMO PROVERILI KAKO

    REAGUJE U TAKVOJ SITUACIJI:

  • 57

  • 58

    7.2. Primeri generatora programskih prevodilaca

    Primeri javno dostupnih generatora programskih prevodilaca: Sajt generatora programskog prevodioca GOLD: http://goldparser.org/getting-started/6-how-gold-

    works.htm Sajt izvornog koda Flex https://github.com/westes/flex

    Sajt uputstva i download za Bison: http://www.gnu.org/software/bison/bison.html

    Pregled najpoznatijih generatora programskih prevodilaca

    (http://dinosaur.compilertools.net/):

    Lex - A Lexical Analyzer Generator

    M. E. Lesk and E. Schmidt

    Lex helps write programs whose control flow is directed by instances of regular

    expressions in the input stream. It is well suited for editor-script type transformations and for segmenting input in preparation for a parsing routine.

    Lex source is a table of regular expressions and corresponding program

    fragments. The table is translated to a program which reads an input stream, copying it to an output stream and partitioning the input into strings which

    match the given expressions. As each such string is recognized the corresponding program fragment is executed. The recognition of the

    expressions is performed by a deterministic finite automaton generated by

    Lex. The program fragments written by the user are executed in the order in which the corresponding regular expressions occur in the input stream.

    Yacc: Yet Another Compiler-Compiler

    Stephen C. Johnson

    Computer program input generally has some structure; in fact, every computer program that does input can be thought of as defining an ``input

    http://goldparser.org/getting-started/6-how-gold-works.htmhttp://goldparser.org/getting-started/6-how-gold-works.htmhttps://github.com/westes/flexhttp://www.gnu.org/software/bison/bison.html

  • 59

    language'' which it accepts. An input language may be as complex as a

    programming language, or as simple as a sequence of numbers. Unfortunately, usual input facilities are limited, difficult to use, and often are

    lax about checking their inputs for validity.

    Yacc provides a general tool for describing the input to a computer program. The Yacc user specifies the structures of his input, together with code to be

    invoked as each such structure is recognized. Yacc turns such a specification

    into a subroutine that han- dles the input process; frequently, it is convenient and appropriate to have most of the flow of control in the user's application

    handled by this subroutine.

    Flex, A fast scanner generator

    Vern Paxson

    flex is a tool for generating scanners: programs which recognized lexical

    patterns in text. flex reads the given input files, or its standard input if no file names are given, for a description of a scanner to generate. The description is

    in the form of pairs of regular expressions and C code, called rules. flex

    generates as output a C source file, `lex.yy.c', which defines a routine `yylex()'. This file is compiled and linked with the `-lfl' library to produce an

    executable. When the executable is run, it analyzes its input for occurrences of the regular expressions. Whenever it finds one, it executes the corresponding

    C code.

    Bison, The YACC-compatible Parser Generator

    Charles Donnelly and Richard Stallman

    Bison is a general-purpose parser generator that converts a grammar

    description for an LALR(1) context-free grammar into a C program to parse that grammar. Once you are proficient with Bison, you may use it to develop a

    wide range of language parsers, from those used in simple desk calculators to

    complex programming languages.

    Bison is upward compatible with Yacc: all properly-written Yacc grammars

    ought to work with Bison with no change. Anyone familiar with Yacc should be

    able to use Bison with little trouble.

    GOLD generator nastao je timskim radom većeg broja programera koji su usavršavali pojedine segmente i

    omogućili njegovu primenu za razne programske jezike. Svoj rad zasniva na principima DFA

    (Deterministički konačni automat). Struktura i način rada opisan je na sledeći način:

  • 60

    1. Pisanje gramatike kao tekstualne datoteke (primenom

    Notepad alata ili Gold editora u okviru Buildera. Veoma je važno da sadržaj te datoteke bude napisan primenom

    GOLD meta jezika.

    2. Provera napisane gramatike u okviru Buildera i generisanje tabela parsiranja koje će biti potrebne, u

    formi specifičnih datoteka koje prepoznaje Engine. 3. Na osnovu ulaznog izvornog koda i tabela parsiranja,

    Engine može da izvrši odgovarajuće transformacije i rezultat je stablo parsiranja.

  • 61

    ORJENTACIONA ISPITNA PITANJA ZA TEORIJSKI TEST

    1. Programski jezici i programski prevodioci

    Opšta klasifikacija softvera.

    Vrste programskih jezika prema zavisnosti u odnosu na mašinu na kojoj se

    izvršava progam.

    Vrste progamskih jezika prema nameni.

    Objasniti zavisnost nižih programskih jezika u odnosu na računarsku arhitekturu. Objasniti doprinos Fon Nojmana u odnosu na programiranje.

    Šta je mašinski jezik?

    Šta je simbolički mašinski jezik?

    Šta je asemblerski jezik? Šta je assembler?

    Koja je uloga asemblera?

    Koja je razlika izmeĎu asemblera i asemblerskog jezika?

    Definicija programskog prevodioca. Vrste progamskih prevodilaca.

    2. Gramatika programskih jezika

    Definicija računarske lingvistike.

    Razlika računarske lingvistike i prepoznavanja govora. Metode računarske lingvistike.

    Definicija formalnog sistema. Komponente formalnog sistema.

    Opšta definicija formalnog jezika. Komponente formalnog jezika.

    Vrste jezika u odnosu na skup dozvoljenih reči. Definicija metajezika.

    Definicija metasintakse. Definicija metaprogramiranja.

    Matematička definicija formalnog jezika. Dva pristupa formalnim jezicima u odnosu na ključne procese.

    Definicija formalnog jezika u generativnom pristupu.

    Definicija formalnog jezika u rekognitivnom pristupu.

    Razlika generativnog i rekognitivnog pristupa definiciji formalnog jezika. Pojam literala u programiranju.

    Definicija formalne gramatike.

    Objasniti pravila prevoĎenja formalne gramatike.

    Definicija formalnog jezika generisan formalnom gramatikom.

    Navesti primer jednog pravila prevoĎenja u kontekstu programiranja (npr HTML

    element).

    Kategorizacija formalnih gramatika prema Avram Noam Chomsky.

    Osobine formalne gramatike tip 2 – konteksno nezavisne.

    Osobine formalne gramatike tip 3 – regularne.

  • 62

    Primena konteksno-nezavisnih gramatika.

    Primena formalnih gramatika.

    Primena atributivnih gramatika. Navesti i kratko objasniti 2 forme predstavljanja pravila gramatike programskih

    jezika.

    Namena Bekus-Naurove forme.

    Specifikacija Bekus-Naurove forme. Objasniti proširenje EBNF u odnosu na BNF.

    Objasniti meta simbole za ponavljanje, opciono pojavljivanje i grupisanje elemenata u EBNF.

    Navesti primer primene EBNF za jednu uobičajenu programsku strukturu –

    sekvenca, selekcija, iteracija.

    Definicija sintaksnog dijagrama. Nacrtati i objasniti osnovne elemente koji se koriste u okviru sintaksnih

    dijagrama.

    3. Greške programskog koda

    Vrste grešaka programskog koda u odnosu na process kompajliranja – objasniti. Objasniti logički tip greške programskog koda.

    Objasniti greške programskog koda u toku kompajliranja (compile-time errors). Objasniti greške programskog koda u toku izvršavanja(run-time errors).

    Objasniti leksički tip greške programskog koda.

    Objasniti sintaksni tip greške programskog koda.

    Objasniti semantički tip greške programskog koda. Navesti primer logičke greške.

    Navesti primer run-time greške.

    Navesti primer leksičke greške.

    Navesti primer sintaksne greške. Navesti primer semantičke greške.

    4. Osnove funkcionisanja i konstrukcije kompajlera

    Navesti i objasniti ulaz i izlaz za kompajlere.

    Navesti osnovne zadatke kompajlera.

    Navesti osnovne faze rada kompajlera. Navesti osnovne module arhitekture kompajlera u fazi analize.

    Navesti osnovne module arhitekture kompajera u fazi sinteze.

    Opisati proces rada kompajlera kod većine programskih jezika. Objasniti Java Virtualnu Mašinu.

    Objasniti leksičku analizu – namena i elementi implementacije.

    Objasniti sintaksnu analizu – namena i elementi implementacije.

    Objasniti semantičku analizu – namena i elementi implementacije.

    Objasniti generisanje meĎukoda – namenu i vrste prezentacija.

  • 63

    5. Teorija automata

    Definicija automata.

    Nacrtati opšti model automata.

    Navesti i objasniti oblike predstavljanja načina rada automata.

    Vrste automata u odnosu na broj mogućih stanja. Vrste automata u odnosu na izvesnost prelaska iz jednog stanja u drugo.

    Vrste automata u odnosu na karakteristike izlaznog rezultata. Formalna definicija i elementi konačnog determinističkog automata.

    Objasniti karakteristike konačnog determinističkog automata.

    Objasniti povezanost automata i formalnih gramatika u smislu srodnih elemenata.

    Opisati elemente i karakteristike opšteg modela automata u procesiranju jezika. Navesti vrste automata za rad sa formalnim jezicima – prema organizaciji

    memorije.

    Objasniti razliku izmeĎu Tjuringove mašine i Univerzalne Tjuringove mašine.

    Nacrtati šemu Tjuringove mašine. Navesti formalnu definiciju Tjuringove mašine.

    Opisati karakteristike Linearno ograničenog automata. Opisati karakteristike Magacinskog automata.

    Opisati karakteristike jednosmernog determinističkog konačnog automata.

  • 64

    DODATNE SRODNE TEME U nastavku su date dodatne, srodne teme koje su obrađene u okviru nastave predavanja i vežbi Programskih prevodilaca u školskoj 2019/20, ali materijal u vezi tih tema nije uvršten u ovu verziju udžbenika i spisak ispitnih pitanja. Razlozi su:

    1. Preporuka Ministarstva za smanjenjem obima gradiva I ispitnih pitanja, zbog pandemije COVID-19 koja je onemogudila redovan rad, ved je deo semestra realizovan putem on-line nastave

    2. Srodne teme iz drugih oblasti poslužile su radi postavljanja problematike Programskih prevodilaca u širi kontekst I izučavaju se u okviru drugih nastavnih predmeta ili možda nisu obuhvadene drugim nastavnim predmetima, ali ipak nisu neposredno u fokusu ovog nastavnog predmeta, te nije primereno postavljati ispitne zahteve iz navedenog razloga.

    TEME IZ OBLASTI PROGRAMSKIH PREVODILACA

    Teme iz oblasti Programskih prevodilaca koje su predviĎene akreditacijom (nisu obuhvaćene ovom verzijom udžbenika, jer je skraćen

    20% zbog preporuke Ministarstva)

    1. Napredne teme implementacije elemenata programskih prevodilaca (npr. Parsiranje s dna ka vrhu)

    2. PrevoĎenje sa jednog na drugi programski jezik

    Dodatne teme iz oblasti Programskih prevodilaca i računarski-podržane lingvistike koje nisu obuhvaćene akreditacijom

    1. Softverski razvojni okviri i specifične gramatike

    2. Cross-kompajleri

    3. Linkeri i meĎuzavisnost modula

    4. Proširenje gramatike programskog jezika

    5. Domensko znanje, interoperabilnost softvera i ontološki jezici

    DODATNE TEME IZ DRUGIH SRODNIH OBLASTI

    Opšte teme iz drugih nastavnih predmeta

    1. Programska razvojna okruženja

    2. Apstraktni prikaz specifikacije programa

    3. Strukturno progamiranje

    4. Objektno-orjentisano programiranje

    Dodatne teme iz oblasti kvaliteta softvera

    1. Oblasti i standardi kvaliteta softvera

    2. UnapreĎenje kvaliteta programskog koda

    3. Konvencije i heuristike programskog stila

    4. Refaktorisanje koda

    5. Testiranje softvera i agilne test-bazirane specifikacije

    6. Obrada grešaka softvera

    7. Greške i obrada grešaka u programu

    8. SOLID principi pravilne organizacije objektno-orjentisanog programskog koda

    9. Performanse softvera

    10. Softverske metrike

    11. Strukturni kvalitet softvera

    12. Optimizacija programskog koda