1. Koja su mane mašinski zavisnih programskih jezika? Programer mora da bude upoznat sa detaljima računara za koje piše program i mora da piše novu verziju za druge arhitekture. 2. Koje su prednosti viših programskih jezika? Čine programiranje lakšim i udobnijim, sakrivaju detalje arhitekture od programera. 3. Zašto postoji veliki broj programskih jezika? Iako su vrlo slični, različiti programski jezici su specijalizovani za rešavanje različitih problema. 4. Čemu služe programskih prevodioci? Pretvaraju programski jezik višeg nivoa u mašinski kod. 5. Šta meri TIOBE indeks? Popularnost programskih jezika koristeći razne faktore. 6. Koja je osnovna razlika izmedu proceduralnog i deklarativnog programiranja? Navesti primere jezika koji pripadaju proceduralnoj i jezika koji pripadaju deklarativnoj paradigmi. Proceduralni zahtevaju od programera da precizno opiše proceduru rešavanja problema, a deklarativni od programera zahtevaju da precizno opiše problem, dok se programski jezik bavi njegovim rešavanjem. Primeri proceduralnih jezika: C, Pascal, Python, Java Primeri deklarativnih jezika: Prolog, SQL 7. Koje su četiri osnovne programske paradigme? Navesti osnovne karakteristike svake od njih. Imperativna - stanje programa se sadrži u promenljivama koje se transformišu naredbama Funkcionalna - posmatraju programiranje kao proces izračunavanja matematičkih funkcija Objektno-orijentisana - stanje se čuva u objektima i menja se pozivanjem njihovih metoda Logička - oslanja se na matematičku logiku (metod rezolucije) 8. Koja četiri značajna programska jezika su prva istorijski nastala? Kojim paragimama pripadaju ti jezici? Fortran - imperativni Lisp - funkcionalni Cobol - imperativni Algol - imperativni 9. Koje su osnovne karakteristike imperativne paradigme? Navesti bar četiri jezika koji pripadaju imperativnoj paradigmi. Stanje programa se sadrži u promenljivama koje se transformišu naredbama Fortran, Cobol, Basic, C 10. Koje su osnovne karakteristike funkcionalne paradigme? Navesti bar četiri jezika koji pripadaju funkcionalnoj paradigmi. Posmatraju programiranje kao proces izračunavanja matematičkih funkcija (lambda račun) Lisp, Haskel, Erlang, Elixir 11. Koje su osnovne karakteristike objektno-orjentisane paradigme? Navesti bar četiri jezika koji pripadaju objektno-orjentisanoj paradigmi. Program se sastoji iz objekata čije se stanje menja pozivanjem njihovih metoda. C++, Java, C#, Objective C 12. Koje su osnovne karakteristike logičke paradigme? Koji jezik se koristi kao sinonim za logičko programiranje? Oslanja se na matematičku logiku (metod rezolucije). Prolog 13. Koje su osnovne karakteristike i ciljevi skript programiranja? Koji poddomeni skript programiranja postoje? Koji jezici podržavaju ovu paradigmu? Koristi se za pisanje kratkih, jednostavnih programa koji automatizuju zadatke ili upravljaju funkcijama većih softvera. Jednostavno se koriste. Postoje skript jezici koji se koriste u domenu veb programiranja, opšte namene, obradu teksta, komandni jezici i s specifičnim domenom. (matematika, statistika). Perl, Python, PHP, Javascript, Lua, Ruby, Bash, R i S 14. Koje su osnovne karakteristike i ciljevi konkurentnog programiranja? Kada je nastalo konkurentno programiranje i kako je dobilo na značaju? Koji jezici podržavaju ovu paradigmu? Koji funkcionalni programski jezici podržavaju konkurentno programiranje? Omogućava izvršavanje više zadataka u istom vremenskom intervalu. Pomaže u poboljšanju korišćenja dostupnih resursa i povećanju performansi. Razvijalo se od jezika Algol ali je steklo popularnost početkom 21. veka zbog veće dostupnosti mašina s više procesora. Skoro svi jezici opšte namene mogu da ga koriste, ali postoje specifično napravljeni jezici (Go, Rust, Kotlin). Haskel, Erlang, Elixir 15. Koje su osnovne karakteristike i domeni upotrebe komponentnog programiranja? Kojoj osnovnoj paradigmi je komponentno programiranje najsličnije i zašto? Razvoj softvera korišćenjem nezavisnih, ponovo upotrebljivih komponenti. Domeni: biblioteke, moduli, mikroservisi. Najsličnije objektno orijentisanoj jer je princip rada komponenti skriven i posledice otkrivene preko metoda komponenti. (Podržavaju ga apsolutni svi „moderniji“ jezici) 16. Koje su osnovne karakteristike i ciljevi vizuelnog programiranja? Koja okruženja podržavaju ovu paradigmu? (deklarativna paradigma) Koristi grafičko okruženje za kreiranje programa. Intuitivnije i pristupačnije za početnike, i može biti korisno i u nekim kompleksnim sistemima. Scratch, Blockly, Node-RED, LabVIEW, Unreal Engine Blueprints. 17. Koje su osnovne karakteristike i ciljevi generičkog programiranja? Koji jezici podržavaju ovu paradigmu? Omogućava pisanje koda koji može da se koristi s različitim tipovima podataka. Uopšteno rešenje za probleme. Svi moderni jezici (C++, Java, C#) 18. Koje su osnovne karakteristike i domeni upotrebe paradigme upitnih jezika? Koji jezici podržavaju ovu paradigmu? (deklarativna paradigma) Efikasna pretraga, manipulacija i upravljanje podacima u različitim vrstama baza podataka (relacione, in-memory, rdf, xml). Jezici: SQL, SPARQL, XQuery 19. Koje su osnovne karakteristike i domeni upotrebe paradigme programiranja оgraničenja? Koji jezici podržavaju ovu paradigmu? (deklarativna paradigma) Programer detaljno opisuje uslove u sistemu za koji se traži rešenje. Domeni: Optimizacija, rešavanje kombinatornih problema Jezici: (svi imaju biblioteke) C, C++, Java, Python, C# 20. Zašto jezici za obeležavanje teksta ne pripadaju programskim paradigmama? Koji su najbitniji jezici za obeležavanje teksta? Njima se definiše struktura nekog tekstualnog dokumenta, ne programa. HTML, CSS, Latex, Markdown 21. Navesti primer logičkog jezika, primer funkcionalnog programskoj jezika i primer objektno-orijentisanog programskog jezika. Prolog, Haskel, Java 22. Kojoj grupi jezika pripada Lisp? Kojoj grupi jezika pripada Prolog? Kojoj grupi jezika pripada C++? Kojoj grupi jezika pripada Hasklell? Kojoj grupi jezika pripada C? Kojoj grupi jezika pripada Go? funkcionalni jezik logički jezik imperativni, objektno orijentisani funkcionalni imperativni konkurentni 23. Za veliki broj savremenih programskih jezika kažu da su muliparadigmatski (engl. multiparadigm). Šta to znači? Dopuštaju korišćenje više od jedne programske paradigme istovremeno. 24. Na kojoj logičkoj metodi je zasnovan jezik Prolog? Predikatskoj logici. 25. Na kojem formalizmu izračunavanja je zasnovan jezik Lisp? Lambda računu. 26. U objektno-orijentisanoj paradigmi, šta čini jednu klasu? Polja (promenljive) i metode (funkcije koje manipulišu poljima) 27. Šta definiše leksika, a šta sintaksa programskih jezika? Leksika se bavi opisivanjem osnovnih gradivnih elemenata jezika, a sintaksa načinima za kombinovanje tih osnovnih elemenata u ispravne jezičke konstrukcije. 28. Navesti primer leksički ispravnog, ali sintaksički neispravnog dela programa. Primer leksički ispravnog, ali sintaksički neispravnog dela programa je onaj koji koristi samo dozvoljene tokene, ali ih kombinuje na način koji ne odgovara gramatici jezika. C++: int = x 5; 29. Šta definiše semantika programskih jezika? Pridružuje značenje sintaksički ispravnim rečenicama jezika. 30. Navesti primer sintaksički ispravnog, ali semantički neispravnog dela programa. int x = 0; int x = 5; 31. Koja je razlika izmedu statičke i dinamičke semantike? Neki aspekti semantičke korektnosti programa se mogu proveriti tokom prevođenja programa (na primer, da su sve promenljive koje se koriste u izrazima definisane i da su odgovarajućeg tipa), dok se neki aspekti mogu proveriti tek u fazi izvršavanja programa (na primer, da ne dolazi do deljenja nulom). Na osnovu toga, razlikuju se statička i dinamička semantika. 32. Čime se bavi pragmatika programskih jezika? Navesti primere. Govori o izražajnosti jezika i o odnosu različitih načina za iskazivanje istih stvari. Odnosi se na praktičnu upotrebu jezika u stvarnim situacijama programiranja, tj. kako se jezik koristi u praksi za postizanje specifičnih ciljeva (efikasnost, čitljivost, održivost koda). Kako i zašto programeri koriste odredene elemente jezika u različitim kontekstima. primer: while(true) ili for(;;) 33. Šta je kompilator, a šta interpretator? Koje su osnovne prednosti, a koje su mane korišćenja kompilatora u odnosu na korišćenje interpretatora? Kompilatori su programski prevodioci kod kojih su faza prevođenja i faza izvršavanja programa razdvojene. Nakon analize izvornog koda programa višeg programskog jezika, kompilatori generišu izvršivi (uglavnom mašinski) kôd i dodatno ga optimizuju, a zatim čuvaju u vidu izvršivih (binarnih) datoteka. Interpreteri su programski prevodioci kod kojih se faza prevodenja i faza izvršavanja programa preklapaju. Interpretatori analiziraju deo po deo (najčešće naredbu po naredbu) izvornog koda programa i odmah nakon analize vrše i njegovo izvršavanje. Rezultat prevođenja se ne smešta u izvršive datoteke, već je ponovo kreira prilikom svakog izvršavanja. Prednosti kompilatora: Jednom sačuvani mašinski kôd moguće je izvršavati neograničen broj puta, bez potrebe za ponovnim prevođenjem. Krajnjim korisnicima nije neophodno dostavljati izvorni kôd programa na višem programskom jeziku, već je dovoljno distribuirati izvršivi mašinski kôd. Prevođenjem se gubi svaka veza izmedu izvornog i izvršivog koda programa. Mane kompilatora: Svaka (i najmanja) izmena u izvornom kodu programa zahteva ponovno prevođenje programa ili njegovih delova pri čemu samo prevođenje zahteva značajne, pre svega vremenske resurse. 34. Ako se koristi kompilator, da li je za izvršavanje programa korisniku neophodno dostaviti izvorni kôd programa? Ako se koristi interpretator, da li je za izvršavanje programa korisniku neophodno dostaviti izvorni kôd programa? Ne. Da. 35. U čemu je razlika izmedu interpretatora i kompilatora? Kod kompilatora su faza prevođenja i faza izvršavanja programa razdvojene, dok su kod intepretera spojene. 36. Da li se, generalno, brže izvršava program koji se interpretira ili onaj koji je preveden kompilatorom? Zašto? Onaj koji je preveden kompilatorom zato što ne mora da se prevodi dok se izvršava. 37. Na koji načine se interpretacija i kompilacija mogu kombinovati? Prevedemo jezik visokog nivoa u poluprevedeni kod (bytecode) koji se interpretira odvojeno za svaku platformu (Java, C#). 38. Prvim implementiranim kompilatorom se smatra onaj napravljen za jezik Fortran. Kada je on nastao? Prvi interpreter za Fortran: 1953. Prvi kompilator za Fortran: 1956. 39. Navesti osnovne slojeve kompilatora i objasniti šta se u kojem sloju dešava. Zašto postoje ovi slojevi i koja je njihova uloga? Razlaganje kompilatora na slojeve omogućava kombinovanje različitih prednjih slojeva (koji omogućavaju prevođenje različitih programskih jezika na međukod) i različitih zadnjih slojeva (koji su prilagođeni različitim arhitekturama računara) sa jednim srednjim slojem, koji je i najkompleksniji sloj kompilatora. Prednji sloj - čita program zapisan programskim jezikom višeg nivoa, obrađuje i čuva u vidu nekog međukoda • Leksički analizator • Sintaksički analizator • Semantički analizator • Generator međukoda Srednji sloj - optimizuje međukod i priprema ga za prevođenje u ciljni jezik (uglavnom mašinski) • Optimizator međukoda Zadnji sloj - prevodi internu reprezentaciju (međukod) u ciljni jezik • Generator i optimizator ciljnog koda srednji i zadnji sloj se često prepliću 40. Navesti osnovne faze u prevođenju programskih jezika. Leksička analiza Sintaksička analiza Semantička analiza Generisanje međukoda Optimizacija međukoda Generisanje i optimizacija ciljnog koda 41. Koja faza kompilacije najviše utiče na efikasnost izvršivog programa? Optimizacija međukoda 42. Šta je rezultat leksičke analize programa? Šta leksički analizator dobija kao svoj ulaz, a šta vraća kao rezultat svog rada? Rezultat je niz leksičkih jedinica (tokena) Ulaz: izvorni program kao niz karaktera Izlaz: tokeni 43. Šta je to leksička analiza i koji se poslovi vrše tokom nje? Proces izdvajanja tokena, osnovnih jezičkih elemenata, iz niza ulaznih karaktera (programa). Tokenizacija (prepoznavanje tokena) Eliminacija nepotrebnih elemenata (komentara, tabulatora, novih redova) Formiranje izlazne sekvence tokena (svaki token ima pridodatu vrednost) Popunjavanje tabele simbola Prepoznavanje i prijava leksičkih grešaka 44. Navesti niz leksema i niz odgovarajućih tokena koji su rezultat rada leksičkog analizatora nad izrazom a=3; token + leksema par (ID, "a") (OP_ASSIGN, "=") (NUMBER, "3") (SEMICOLON, ";") (izmislio sam ovo) 45. Kako se zovu programi koji vrše leksičku analizu? Leksički analizatori ili lekseri 46. U kom vidu se opisuju pravila koja se primenjuju u fazi leksičke analize? Regularni izrazi Primeri osnovnih konstrukcija regularnih izraza (regex-a): • primer karakterske klase: [0-9] označava cifru • primer alternacije: a|b označava slovo a ili slovo b • primer opcionog pojavljivanja: a? označava da slovo a može, a ne mora da se javi • primer ponavljanja: a* označava niz od nula ili više slova a • primer pozitivnog ponavljanja: [0-9]+ označava neprazan niz cifara 47. U opisu regularnih jezika, kako se označava ponavljanje jednom ili više puta? pozitivno ponavljanje (+) 48. Navesti nekoliko primera reči koje pripadaju regularnom jeziku [a-z][0-9]+[0-9]. macka13 m12 32m 9100mnmm 49. Zapisati jezik studentskih naloga (na primer, mi10123, mr10124, aa10125) na studentskom serveru Alas u vidu regularnog izraza. [a-z]{2}[0-9]{5} 50. Navesti regularni izraz koji opisuje: (a) niske u kojima se na početku mogu (a ne moraju) pojavljivati cifre (od 0 do 9), zatim sledi neprazan niz karaktera a, a zatim sledi neprazan niz cifara. [0-9]*a+[0-9]+ (b) niske u kojima se na početku može (a ne mora) pojaviti neka cifra (od 0 do 9), zatim sledi neprazan niz karaktera a, a zatim sledi niz (moguće prazan) karaktera b. [0-9]?a+b* (c) neprazne konačne niske u kojima se na početku može (a ne mora) pojaviti karakter a, a zatim sledi neprazan niz cifara. a?[0-9]+ (d) konačne niske u kojima se na početku može (a ne mora) pojaviti karakter a ili karakter b, a zatim sledi niz cifara (moguće i prazan). (a|b)?[0-9]* (e) neprazne konačne niske u kojima se pojavljuju ili samo karakteri a ili samo karakteri b. (a+)|(b+) (f) neprazne konačne niske u kojima se pojavljuju samo karakteri a i b. (a|b)+ 51. Koja analiza se u kompilaciji programa vrši nakon leksičke analize? Sintaksička analiza 52. Šta je to sintaksička analiza? Sintaksička analiza, poznata i kao parsiranje, je proces organizovanja leksema izdvojenih u fazi leksičke analize u ispravnu jezičku konstrukciju. (provera gramatičkih pravila) 53. Šta je zadatak sintaksičke analize programa? Šta sintaksički analizator dobija kao svoj ulaz, a šta vraća kao rezultat svog rada? Provera da li je niz tokena dobijen iz leksičke analize, u skladu sa sintaksičkim pravilima programskog jezika, odnosno sa njegovom formalnom gramatikom. Ulaz: Tokeni Rezultat: Sintaksičko stablo 54. Kako se zovu programi koji vrše sintaksičku analizu? Sintaksički analizatori ili parseri. 55. U kom obliku se opisuju pravila koja se primenjuju u fazi sintaksičke analize? Konteksno-slobodne gramatike 56. Da li su regularni jezici su obavezno i kontest-slobodni? da Da li su kontekstno-slobodni jezici su obavezno i regularni? ne Da li metajezik BNF ima istu izražajnost kao regularni jezici? ne Da li metajezik BNF ima istu izražajnost kao kontekstno-slobodni jezici? da Da li metajezik BNF ima istu izražajnost kao metajezik EBNF? ne 57. Od čega dolazi skraćenica EBNF? Proširena Bakus-Naurova forma. 58. Kako se u EBNF-u, zapisuje izraz koji se može ponavljati proizvoljan broj (nula ili više)? U EBNF-u, izraz koji se može ponavljati proizvoljan broj puta (nula ili više) zapisuje se unutar vitičastih zagrada { }. A = { "a" }; 59. Koji od sledećih metajezika je najizražajniji: (a) kontekstno-slobodne gramatike; (b) BNF; (c) EBNF; (d) svi navedeni metajezici imaju istu izražajnost. (d) svi 60. Zapisati jezik {aⁿ bⁿ | n > 0} u vidu konteksno-slobodne gramatike i u vidu EBNF izraza. S → aSb | ab S = "a", S, "b" | "a", "b" ; 61. Koji su osnovni ciljevi optimizacije međukoda? Dobijanje efikasnijeg i kvalitetnijeg ciljnog koda. 62. Navesti primere optimizacija međukoda. Eliminacija mrtvog koda, propagacija konstantni, promena poretka naredbi, transformacija petlji (može i eliminacija). 63. Koja je poslednja faza u kompilaciji i za šta je ona odgovorna? Generisanje koda. Završava pretvaranje programskog koda u mašinski. 64. Ukoliko je raspoloživ kôd nekog programa na nekom višem programskom jeziku (na primer, na jeziku C), da li je moguće jednoznačno konstruisati odgovarajući mašinski kôd? Ukoliko je raspoloživ mašinski kôd nekog programa, da li je moguće jednoznačno konstruisati odgovarajući kôd na jeziku C? Da. Ne.