KIV/FJP – vypracované otázky (2011/12) 1. Charakterizujte křížový překladač
Překlad programu probíhá na jiném procesoru, než exekuce. Hlavním důvodem je náročnost překladače – na cílovém stroji by ho nebylo možné rozběhnout.
2. Objasněte pojem silikonový překladač
Slouží pro návrh integrovaných obvodů. Proměnné nejsou položka v paměti ale logická proměnná obvodu. Výstupem je logický obvod.
3. Co to jsou formátory textu? Uveďte příklad Překladače pro sazbu textu, jako je např. TEX či RTF.
4. Charakterizujte kaskádní překladač
Pokud máme A→ B a potřebujeme A→C, řešíme, zda se nám vyplatí řešit B→C nebo spíše A→C. Problémem je, že oba překladače produkují chybové hlášky a uživatel jazyka A nebude rozumět chybám překladače z jazyka B.
5. Porovnejte výhody a nevýhody interpretačních a kompilačních překladačů Kompilační • Rychlejší exekuce • Často platformově závislé – nepřenositelnost Interpretační • Pomalejší exekuce • Dobré možnosti ladění • Přenositelnost mezikódu
6. Jaký je rozdíl mezi fází a průchodem překladače
Fáze je část dílčí část jednoho průchodu překladače (např. lexikální analýza, syntaktická analýza). Fáze může obsahovat více průchodů, např. z důvodu optimalizace. Jeden průchod může obsahovat více fází překladu – rozdělení překladu na více částí.
7. Charakterizujte vnitřní jazyky jednotlivých fází překladače
U vícefázového překladače každá fáze generuje vnitřní jazyk, který je vstupem pro další fázi překladu. První fáze má jako vstup zdrojový kód, poslední fáze má jako výstup cílový kód. Např. 1) Lexikální analyzátor čte zdrojový kód a vytváří tabulku symbolů 2) Syntaktický analyzátor čte lexikální řetězce symbolů a převádí je na derivační strom 3) Sémantické zpracování převádí derivační strom na sémantický 4) Generátor cílového kódu převádí sémantický strom na instrukce cílového jazyka
8. Jaké jsou důvody pro použití víceprůchodového překladače
Obecně se snažíme pouze o jeden průchod – jediné čtení zdrojového kódu, lepší možnosti ladění. Výhodou víceprůchodového překladače je vznik meziproduktů (vnitřní jazyky překladače) a z nich vyplývající lepší možnost kontroly nad překladem a optimalizace
9. Zdůvodněte, proč se nepoužívají čistě interpretační překladače
Provádění zdrojového kódu bez mezipřekladu je velmi pomalé. Proto se používají překlady do mezijazyka, např. Java bytecode, jejichž provádění je mnohem rychlejší (optimalizace při překladu, např. skoky).
10. Co to jsou generátory překladačů, uveďte příklad
Jedná se o systémy, které umožňují generování překladače pro určitý jednoduchý jazyk, který popíšeme například gramatikou. Výstupním jazykem generovaného kompilátoru je vždy předem zvolený jazyk, např. C. Příkladem je např. YACC nebo BISON. V ideálním případě bychom generátoru poskytli pouze popis vstupního a výstupního jazyka, a on by nám vygeneroval kompilátor – to je ovšem utopie.
1
11. Nakreslete schéma překladače kompilačního typu
12. Jaké jsou vnitřní jazyky, které produkují jednotlivé fáze překladače Viz výše
13. Jaká vlastnost gramatiky podmiňuje nekonečnost generovaného jazyka? Rekurzivnost.
14. Popište gramatikou reálná čísla s desetinnou částí c ∈ 〈 0;9〉 S → + A | − A | cB | .C A → cB | .C B → cB | .D C → cD D → cD | e 15. Jaký je nejvyšší možný počet stavů deterministického KA, má-li ekvivalentní NKA 5 stavů? 25-1=31 stavů
16. Popište tvar identifikátoru levou lineární gramatikou S → S 0 | S1| ⋅⋅⋅ | S 9 | Sa | ⋅⋅⋅ | Sz | Xa | ⋅⋅⋅ | Xz
X →e
2
17. Zapište pravou lineární gramatiku čísla real v semilogaritmickém tvaru c ∈ 〈 0;9〉 S → + A | − A | cB | .C A → cB | .C B → cB | .D C → cD D → cD | exp E E → + F | − F | cG F → cG G → cG | e 18. Zapište s co nejmenším počtem pravidel gramatiku popisující binární čísla s lichým počtem jedniček. S→ 0S | 1A A→ 1S | 0A | e
19. Uveďte obecný tvar překladových pravidel používaných v LEX
Překladová pravidla jsou uvedena po deklarační části a před částí s dalšími funkcemi (v cílovém jazyce). Pravidla mají obecný tvar:
:
<pravá strana 1> {sémantická akce 1} | <pravá strana 2> {sémantická akce 2} ... | <pravá strana n> {sémantická akce n}
20. Jaký řetězec rozpoznává LEX, je-li překladové pravidlo dáno výrazem \+?[0-9][0-9]*$ ? Celé kladné číslo na konci řádky (může být včetně znaménka).
21. Jak řeší lexik. analyzátory problém nalezení symbolu v případě, kdy je jeden symbol prefixem jiného? Snaží se hledat co nejdelší symbol.
22. Jaký řetězec rozpoznává LEX, je-li překladové pravidlo dáno výrazem \*[1-9]* ? Celé kladné číslo bez znaménka, kterému předchází hvězdička (např. v násobení).
23. Popište princip způsobu zotavení ze syntaktické chyby v překladači PL/0
Překladač PL/0 používá panické zotavení – vstup je ignorován až do následujícího výskytu platných symbolů.
24. Jaké vlastnosti musí splňovat jazyk analyzovatelný rekurzivním sestupem?
Musí splňovat vlastnosti LL gramatik, nesmí obsahovat levou rekurzi, na základě prvních několika symbolů se musí rozhodnout, jakou použije větev (pravidlo).
25. Vysvětlete funkci procedury Test(s1,s2: symset; n: integer); v překladači PL/0
Funkce slouží pro zotavení po chybě – testuje, zda se jedná o validní symbol, přičemž ten se musí nacházet v množině tzv. následovníků s1. Pokud je načtený symbol v množině stop symbolů s2, procedura zahlásí chybu n.
26. Zapište gramatiku aritmetického výrazu s operátory +, * a závorkami ( ). Zapište levou derivaci věty i + i E→ E+T | T T→ T*F | F F→ i | (E)
E⇒E+T⇒T+T⇒F+T⇒F+F⇒i+F⇒i+i
3
27. Popište princip metody rekurzivního sestupu • • • • •
Každému neterminálnímu symbolu A na levé straně je přiřazena procedura A Tělo procedur je dáno pravými stranami pravidel Pravé strany musí být rozlišitelné na základě symbolů vstupního řetězce Je-li rozpoznána pravá strana, pak se v případě neterminálního symbolu A vyvolá procedura A, v případě terminálního symbolu je ověřena jeho přítomnost ve vstupním řetězci a je zajištěno přečtení dalšího symbolu Rozpoznané pravidlo je oznámeno, stejně jako případná chyba
28. Charakterizujte syntetizované atributy
Hodnota syntetizovaného atributu neterminálního symbolu je závislá na hodnotě příslušného podstromu, jehož je neterminální symbol kořenem.
29. Popište způsob vyhodnocování dědičných atributů.
Hodnota dědičného atributu u určitého neterminálního symbolu závisí na kontextu, ve kterém se příslušný podstrom nachází. Dědičné atributy určujeme pro symboly na pravé straně pravidla v závislosti na atributech předcházejících symbolů v pravidle nebo na dědičných atributech symbolu na levé straně pravidla. Zadanou hodnotu je vhodné přiřadit jako počáteční hodnotu jednomu atributu, nejlépe u kořene překladového stromu. Způsob vyhodnocení je takový, že procházíme strom od rodiče k potomkovi, od nejstaršího bratra k mladšímu.
30. Popište zásady konstrukce postfixového výrazu z infixového
Pořadí operandů zůstává zachováno, mění se pouze pozice operátoru, které musí bezprostředně následovat za svými operandy. Není potřeba používat závorky k vyjádření precedence. Př. 𝐴∎𝐵 (∎ je libovolný operand) ⇒ 𝐴 𝐵 ∎
31. Zapište posloupnost postfixových instrukcí pro příkaz a10 = - (x 20 + y30 )/(x 20 - y30 ) +; -; -; /; =;
20; 30; 100 #0; 100; 101 20; 30; 102 101; 102; 103 10; 103; -
32. Zapište výraz -2*(x + y) ^ 3 pro případ 1) nejvyšší, 2) nejnižší precedence operátoru unárního minus a) v prefixové, b) v postfixové notaci 1.a) * – 2 ^ 3 + x y 1.b) – 2 x y + 3 ^ * 2.a) – * 2 ^ 3 + x y 2.b) 2 x y + 3 ^ * –
33. Přeložte do posloupnosti postfix. instrukcí if (A10 < B20 ) then C30 = (A10 + B20 ) * ( A10 - B20 ) <; 10; 20; IFJ; 100; 7; +; 10; 20; -; 10; 20; *; 101; 102; =; 30; 103;
100 101 102 103 -
4
34. Přeložte do postfixových instrukcí příkaz while x
100; 102; 100; 100; 103; 100; 1;
101; 8; 101; 101; 104; 105; -;
102 103 104 105 -
35. Jaké informace jsou ukládány v tabulce symbolů překladače? 1) 2) 3) 4) 5)
Druh – konstanta, proměnná, procedura, funkce, … Hladina – úroveň zanoření Adresa – adresa v programu, u proměnných dynamická adresa Typ – datový typ Velikost
36. Vysvětlete, jakým mechanismem překladač zajišťuje respektování lokality identifikátorů v blokově strukturovaném jazyce
Lokální identifikátory vznikají při vstupu do bloku a zanikají při výstupu do bloku. Každý blok má přístup pouze tu část tabulky symbolů, která odpovídá jeho úrovni vnoření. V některých jazycích je možné explicitně definovat viditelnost proměnné.
37. Jaká je časová složitost práce s rozptýleně organizovanou tabulkou symbolů v závislosti na počtu symbolů v programu? 𝑛2 𝑘
𝑂 � � , kde n je počet symbolů v programu a k je rozptyl
38. Jaká je závislost časové režie vyhledávání v netříděné uspořádané tabulce symbolů na počtu jmen v tabulce?
m = počet výskytů všech jmen v programu n = počet jmen (položek v tabulce symbolů)
Čím je program obsáhlejší, tím více jmen bude obsahovat, takže 𝛰 = (𝑚 ∙ 𝑛) ⇒ 𝛰 = (𝑛2 )
39. Popište způsob vytváření a práce s frekvenčně uspořádanou tabulkou symbolů
V tabulce jsou symboly uspořádávány podle frekvence výskytu, což zpravidla vede k rychlejšímu nalezení potřebného symbolu. Naopak je ovšem potřeba určitý čas na proces uspořádání.
40. K čemu slouží mapovací funkce pole a z jakých se skládá částí?
Mapovací (hashovací) funkce slouží k výpočtu adresy uložení určitého prvku tabulky.
hodnota mapovací funkce =
n
n
∑ ik ⋅ K k − ∑ Dk ⋅ K k
= k 1= k 1
ik ........indexi prvků pole K k ......koeficient , jehož výpočet je závislý na uspořádání pole Dk ......dolní mez indexů Části: • • • •
Konstantní část, udávající adresu začátku pole Deskriptor pole Indexy prvků Jednotlivé rozměry pole (n-rozměrnost) 5
•
Velikost jednoho prvku
41. K čemu slouží mapovací funkce pole a na jaké části se člení? Viz předchozí odpověď… :-)
42. Jaké informace jsou předávány při volání podprogramu, je-li formálním parametrem procedura? a) v případě statického přidělování paměti, adresa začátku procedury (formální parametr) b) v případě dynamického přidělování paměti adresa začátku procedury (formální parametr), statický ukazatel
43. Co je obsahem deskriptoru třídy? • •
Ukazatel na deskriptor rodiče Seznam datových položek - Offset - Viditelnost • Seznam metod - Vstupní bod - Viditelnost - Static Pokud to jazyk podporuje, je obsahem deskriptoru také VMT – tabulka virtuálních metod.
44. Popište, jak překladač realizuje volání statických metod v OO jazyce
U statických metod se hledá vstupní bod v deskriptoru třídy. Při neúspěchu se hledá v deskriptoru předka.
45. Popište, jak překladač realizuje vyvolání dynamických (virtuálních) metod v OO jazyce
Pokud jazyk podporuje virtuální metody, je v deskriptoru také VMT – tabulka virtuálních metod. Před prvním voláním metody je zapotřebí zavolat konstruktor třídy, který propojí danou instanci s bodem vstupu metody.
46. Kdy překladač vytváří CIR (class instance rekord) a jaké informace v něm ukládá?
CIR ukládá instanční proměnné a odkaz na seznam dynamicky vázaných metod. Vytvoření: a) Objekt vytvořen instanciací: CIR vytvořen výpočtem na haldě b) Objekt vytvořen deklarací: CIR vytvořen výpočtem, jeho zásobníková adresa a velikost určeny při překladu.
47. Co je obsahem VMT (tabulka virtuálních metod) a kdy se VMT vytváří?
Tabulka obsahující vstupní body virtuálních metod třídy. Vytváří se při vytváření instance (volání konstruktoru) třídy. Viz 43, 45.
48. Popište význam částí dynamické adresy (adresové dvojice)
Dynamická dvojice (l, a) kde l = úroveň zanoření programu (báze); a = adresa v rámci daného akt. záznamu.
49. Formulujte podmínku, kterou musí splňovat program, aby statický řetězec výpočtového zásobníku stále splýval s dynamickým řetězcem
Podprogramy mohou volat pouze podprogramy, které jsou jim podřazené. Statický a dynamický ukazatel jsou totožné, pokud je podprogram deklarován a volán ze stejné hladiny.
50. Jakými vlastnostmi jazyka je podmíněno statické přidělování paměti
Paměť je možné přidělovat staticky, pokud jazyk nepřipouští přidělování dynamické – nepovoluje dynamické proměnné ani např. rekurzivní volání podprogramů.
51. Popište odlišnost obsahu aktivačního záznamu v případě jazyka s nemožností/možností vnořování podprogramů Jazyk bez možnosti vnořování podprogramů nepotřebuje mít AZ uložen statický ukazatel.
6
52. Uveďte, jaké údaje ukládá překladač v aktivačním záznamu • • • • •
Lokální proměnné Parametry Návratová adresa Je-li podprogram funkcí, pak funkční hodnota Pomocné proměnné pro mezivýsledky
53. Uveďte datové struktury, které jsou použitelné k přidělování paměti pro a) rekurzivně volané procedury a funkce, zásobník b) dynamické proměnné, halda c) dynamické typy, halda, zásobník d) paralelně proveditelné programové jednotky zobecněný zásobník, halda
54. Popište způsob a důvod použití displeje
Při velké hloubce vnoření podprogramů dochází ke značné časové náročnosti při vyhledávání nelokálních objektů. Proto je zaveden vektor (tzv. displej), který obsahuje bázové adresy aktivačních záznamů, které jsou právě aktivní.
55. Jaká omezení budou důsledkem přístupu do výpočtového zásobníku pomocí displeje, který je realizován jako array[1..3] of adresa_v_zásobníku ?
Hloubka zanoření volání podprogramů je omezena na počet prvků (adres), které se vejdou do displeje; v tomto případě tedy 3.
56. Uveďte příklad víceznačné gramatiky. Víceznačnost dokažte. S → aS | Sa | c Pro tuto gramatiku existuje více derivačních stromů, neboť není splněna nutná podmínka o existenci levé a pravé rekurze u jednoho neterminálního symbolu.
57. Kdy označujeme větu jazyka jako víceznačnou?
Pokud pro větu, která je generovaná gramatikou G, existuje více derivačních stromů.
58. Může pro víceznačnou gramatiku existovat ekvivalentní gramatika jednoznačná? Ano, může. Problém nejednoznačnosti gramatik je však obecně algoritmicky nerozhodnutelný.
59. Operátor umocnění je ve Fortranu pravoasociativní. Zapište G pro aritmetický výraz respektující tuto vlastnost U →U ^ c 60. Popište formálně zásobníkový automat a význam jeho částí ZA je osmice ( K , T , Q, D, δ , q0 , Z 0 , F ) , kde K ...... vnitřní stavy T ....... vstupní symboly Q ....... výstupní symboly D ....... zásobníkové symboly δ ....... zobrazení 𝐾 × (𝑇 ∪ {𝑒}) × 𝑄 ∗ do množiny konečných podmnožin 𝐾 × 𝑄 ∗ × 𝐷 ∗ 𝑞0 ...... počáteční stav ∈ 𝐾 𝑍0 ..... počáteční symbol zásobníku ∈ 𝑄 F........ množina koncových stavů ∈ 𝐾
61. Popište přechodovou funkci zásobníkového automatu akceptujícího s prázdným zásobníkem, který je ekvivalentní gramatice G [S]: S → ( S ) | S ( ) | e ?? :-( Na vrcholu zásobníku S, má 3 možnosti, jak se nahradí, pro všechny terminální symboly, když je na zásobníku a ve vstupu tentýž, tak se dělá srovnání.
7
62. Jaký jazyk popisuje gramatika G [S]:
S→(S)|S()|e ?
Gramatika popisuje posloupnost dvojic závorek, které mohou být i vnořené.
63. Jaký jazyk popisuje gramatika G [S]: S → a S a | b S b | e
Libovolnou posloupnost a a b, přičemž tato posloupnost je symetrická (palindrom).
64. Navrhněte gramatiku jazyka, jehož věty mají tvar wwreverzivní , kde w ∈ {0,1} S → 0 S 0 |1S1| e
∗
65. Charakterizujte vztah mezi jazyky s LL(0) gramatikou a regulárními jazyky
Regulární jazyky vytvářejí derivační strom shora dolů. Jazyky LL(0) jsou podmnožinou regulárních jazyků.
66. Uveďte formální definici LL(1) gramatiky
Jednoduchá LL gramatiká má na levé straně jeden neterminální symbol, na druhé straně je jako první uveden terminální symbol. Navíc nesmí mít podobná přepisovací pravidla, tj. může být A→bX A→cX ale ne již A→xB A→xC protože nelze rozhodnout, které pravidlo se má vybrat. Obecná LL gramatika nemá omezení, ale musí pro ni existovat rozkladová tabulka.
67. Zdůvodněte, proč je každá LL(1) gramatika silná
Při analýze není potřeba používat historii; vystačíme si pouze s právě načteným symbolem.
68. Uveďte nutnou a postačující podmínku pro to, aby gramatika byla silná LL(k)
Jestliže pro jeden neterminální symbol existují různá pravidla 𝑃 ∈ {𝐴 → 𝛼; 𝐴 → 𝛽} pak platí, že 𝑓𝑖𝑟𝑠𝑡𝑘 �𝛼 ∙ 𝑓𝑜𝑙𝑙𝑜𝑤𝑘 (𝐴)� ∩ 𝑓𝑖𝑟𝑠𝑡𝑘 �𝛽 ∙ 𝑓𝑜𝑙𝑙𝑜𝑤𝑘 (𝐴)� = ∅
69. K čemu slouží úprava gramatiky zvaná "pohlcení terminálu"? Uveďte příklad.
Pohlcení řeší situaci, kdy za nějakým neterminálním symbolem následuje symbol, kterým může jiné pravidlo od tohoto neterminálního symbolu začínat. Řeší tedy FIRST – FOLLOW kolizi.
A → BaC B → e | abC C →c
A → [ Ba ] C
→ odstraníme zavedením [Ba] →
[ Ba ] → a | abCa B → e | abC C →c
70. Uveďte příklady algoritmicky nerozhodnutelných problémů z teorie formálních jazyků a) Problém nejednoznačnosti gramatik b) Problém zacyklení programu (nelze detekovat pouze na základě zdrojového kódu) c) Problém určení, pro jaká k je gramatika LL(k).
71. Existuje pro libovolnou gramatiku typu 2 algoritmus pro
a) převod na ekvivalentní nelevorekurzivní gramatiku ANO b převod na ekvivalentní LL (k) gramatiku NE c) převod na ekvivalentní LR (k) gramatiku ANO d) výpočet množin LR (0) položek? NE
72. Zdůvodněte proč LR (k) gramatiky popisují obsáhlejší třídu jazyků než LL(k)
Každá LL(k) gramatika je zároveň LR (k) gramatikou, avšak opačně nikoli. Z toho jasně vyplývá, že LR (k) jsou obsáhlejší třídou, nežli LL(k).
8
73. Porovnejte mohutnosti množin LR (0), LALR (k), LR (k) položek
74. Jaké podmínky musí splňovat množiny LR (0) položek, aby gramatika byla SLR(1)? Pokud je kolize, tečka na konci a uprostřed v jedné množině, pak - Pokud je následující symbol follow(X), provedeme X→a. - Pokud je následující symbol first(X), provedeme X→a.B
75. Popište tvar LR (0) položky a význam jejích jednotlivých částí LR(0) má tvar # :
(A→. α)
+
, kde # je vrchol zásobníku a . je oddělovač dosud nezpracované části vstupu.
A ∈ N , α ∈ (T ∪ N )
∗
76. Jakou metodu syntaktické analýzy používá YACC Zdola nahoru.
77. Jakým způsobem řeší YACC konflikty redukce-redukce Výběrem pravidla dle pořadí jejich uvedení.
9