-
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 ................................................................................. 5
1.1. Vrste programskih jezika ............................................................................................................................ 5
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
-
5
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
-
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 binarnim brojevima (0,1) č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
Matematička definicija formalne gramatike kao ureĎene četvorke:
-
14
Pravila prevoĎenja
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