Københavns Universitet Naturvidenskabelig Embedseksamen Oversættere Vejledende løsninger til Skriftlig eksamen onsdag d. 24. januar 2007 Eksamenstiden er to timer. Opgavernes vægt i procent er angivet ved hver opgave. Den skriftlige eksamen i Oversættere er bestået, hvis minimum 50% af opgaven er besvaret tilfredsstillende, eller en proportionalt større del er løst delvist tilfredsstillende. Hver opgaves vægt i procent er angivet ved opgavens start. Ligeledes er de enkelte spørgsmåls andel i denne vægt angivet. lle de sædvanlige hjælpemidler må benyttes, herunder også lydløse elektroniske lommeregnere og PD ere (f.eks. Palm Pilot), dog ikke hvis disse har trådløs netadgang eller telefoni. En almindelig bærbar P vil ikke være tilstrækkelig lydløs p.g.a. blæser, harddisk og støjende tastatur. I tvivlstilfælde gælder eksamensvagtens afgørelse. Det er tilladt at bruge blyant til besvarelsen, såfremt denne er tydeligt læselig.
Vejledende løsning til skriftlig eksamen januar 2007 i Oversættere side 1 af 5 Opgave 1: Syntaksanalyse (32%) Betragt følgende grammatik: Spørgsmål 1.1 (5%) a B B b B B Vis at grammatikken er tvetydig ved at vise to forskellige syntakstræer for samme tegnfølge. a B a Spørgsmål 1.2 (8%) Beregn FIRST for hver højreside i grammatikken og FOLLOW for hver nonterminal. Husk at medtage $ i beregningen af FOLLOW. Vink: Der er ingen tomme produktioner, så du behøver ikke beregne Nullable (den kan antages falsk for alle nonterminaler). FIRST (a) = {a} FIRST (B) = {a, b} FIRST (b B) = {b} FIRST () = {a, b} FOLLOW() = {$} FOLLOW(B) = {$}
Vejledende løsning til skriftlig eksamen januar 2007 i Oversættere side 2 af 5 Spørgsmål 1.3 (10%) Lav en LL(1) syntaksanalysetabel for grammatikken. B a b $ a B B B B b B B Spørgsmål 1.4 (9%) Da grammatikken er tvetydig, har LL(1) tabellen konflikter. Fjern konflikterne (uden at ændre på det sprog, der genkendes) ved at fjerne produktioner fra tabellen. Vis den konfliktfri tabel. a b $ a B B B B b B Opgave 2: Regulære udtryk (5%) Spørgsmål 2.1 (5%) Lav en funktion minlength, der givet et regulært udtryk finder størrelsen af den korteste tegnfølge, som det regulære udtryk genererer (genkender). Lav funktionen, så den er rekursiv over strukturen af det regulære udtryk, dvs. på formen minlength(a) =... minlength(ε) =... minlength(s t) =...minlength(s)...minlength(t)... minlength(st) =...minlength(s)...minlength(t)... minlength(s ) =...minlength(s)...
Vejledende løsning til skriftlig eksamen januar 2007 i Oversættere side 3 af 5 minlength(a) = 1 minlength(ε) = 0 minlength(s t) = min(minlength(s), minlength(t)) minlength(st) = minlength(s) + minlength(t) minlength(s ) = 0 Opgave 3: Regulære udtryk (6%) Heltalskonstanter i kan være oktale, decimale eller hexadecimale. En følge af cifre, der starter med 0, betragtes som en oktal konstant, og kan følgelig kun indeholde cifre under 8. En følge af decimale cifre, som ikke starter med 0, er en almindelig decimal konstant. Tegnfølgen 0x efterfulgt af hexadecimale cifre er en hexadecimal konstant. Hexadecimale cifre er 0 9 samt F. Spørgsmål 3.1 (6%) Opskriv et regulært udtryk for heltalskonstanter i, sådan som de er beskrevet herover. 0[0 7] [1 9][0 9] 0x[0 9 F] + Opgave 4: Endelige automater (9%) Man kan udvide NFer, så man tillader mere end en starttilstand. I stedet for en starttilstand s 0 er der altså en mængde S 0 af starttilstande (ligesom der er en mængde F af accepterende tilstande). Man kan ved genkendelse af en tegnfølge vælge en vilkårlig starttilstand, ligesom man kan vælge frit mellem overgange med samme symbol. Spørgsmål 4.1 (3%) ngiv en metode, der kan konvertere en sådan NF til en NF med kun en starttilstand.
Vejledende løsning til skriftlig eksamen januar 2007 i Oversættere side 4 af 5 Tilføj en ny tilstand s 0 og lad der være epsilonovergange til alle starttilstandende fra NFen. Gør s 0 til den eneste starttilstand. Spørgsmål 4.2 (3%) ngiv, hvordan delmængdekonstruktionen (algoritme 2.3 i Basics of ompiler Design) 1 skal modificeres, så den kan konvertere en NF med flere startilstande til en DF (der som sædvanligt kun har en starttilstand). I stedet for får vi s 0 = ε-closure({s 0 }) s 0 = ε-closure(s 0 ) lt andet er uændret. Spørgsmål 4.3 (3%) Kom med et eksempel (evt. flere) på situationer, hvor det bliver (en smule) lettere, når man kan have flere starttilstande i en NF. I afsnit 2.9 i Basics of ompiler Design, bliver konstruktionen af den kombinerede NF lettere, da man ikke behøver at tilføje en ny starttilstand. Endvidere bliver konstruktionen af NFer for præfiks og omvendte sprog i opgave 2.11 fra Basics of ompiler Design lettere, da disse begge tilføjer en ny starttilstand, som udelukkende har epsilonovergange til andre tilstande. Ved at gøre disse andre tilstande til starttilstande, kan man undvære den nye starttilstand. Opgave 5: Bootstrapping (16%) En kildetekstoptimisator (source code optimizer) er et program, der kan optimere programmer på kildetekstniveau, dvs. at det tager et program P i kildetekst og 1 Side 37 i 2006 udgaven og side 35 i 2004 og 2005 udgaverne
Vejledende løsning til skriftlig eksamen januar 2007 i Oversættere side 5 af 5 returnerer et program P i samme sprog, hvor P er ækvivalent med P, men er mere optimeret. En kildetekstoptimisator kan betragtes som en oversætter, hvor kildesprog og målsprog er ens. En kildetekstoptimisator, der er skrevet i og som optimerer -programmer kan f.eks. beskrives med T-diagrammet Spørgsmål 5.1 (4%) Udover ovenstående kildetekstoptimisator har du følgende komponenter: En oversætter fra til RM-kode, skrevet i RM-kode. En RM maskine (der kan afvikle RM-kode). Et uspecificeret program skrevet i. Vis disse komponenter som Bratman diagrammer. Brug bogstavet til at indikere RM-kode. Spørgsmål 5.1 (12%) Vis med Bratman diagrammer, hvordan man givet disse komponenter kan optimere og afvikle det uspecificerede program. Vi skal først have oversat optimisatoren:
Vejledende løsning til skriftlig eksamen januar 2007 i Oversættere side 6 af 5 Dernæst skal vi optimere og oversætte programmet, og afvikle det oversatte program på RM maskinen. Opgave 6: Registerallokering (32%) Spill-metoden i Basics of ompiler Design gør to ting: 1. Omdøber hver forekomst af den spill ede variabel ved at tilføje et løbenummer (som subscript). 2. Indsætter lagerflytninger før og efter instruktioner, der bruger de nye variabler. Nedenstående figur viser programmet fra figur 8.2 i Basics of ompiler Design efter omdøbning af forekomsterne af variablen a, men inden indsættelsen af lagerflytninger.
Vejledende løsning til skriftlig eksamen januar 2007 i Oversættere side 7 af 5 1: a 1 := 0 2: b := 1 3: z := 0 4: LBEL loop 5: IF n = z THEN end ELSE body 6: LBEL body 7: t := a 2 + b 8: a 3 := b 9: b := t 10: n := n 1 11: z := 0 12: GOTO loop 13: LBEL end I stedet for at indsætte lagerflytninger, kan man på passende steder indsætte tildelinger, der kopierer en af de nye variabler over i en anden af de nye variabler, sådan at værdien af den oprindelige a hele tiden ligger i en af de nye variabler. Da a er levende ved udgangen af programmet, skal værdien til slut kopieres fra en af de nye variabler over i den oprindelige. Ideen er, at hver af de nye variabler vil have kortere levetid end den oprindelige, så de vil hver især interferere med færre andre variabler, og det kan (måske) gøre det muligt at registerallokere de nye variabler. Spørgsmål 6.1 (8%) Indsæt kopisætninger af formen a i := a j eller a := a i (hvor i og j er 1, 2 eller 3), sådan at ovenstående program er ækvivalent med programmet i figur 8.2 (dvs. før omdøbning af forekomsterne af a). Brug kun a := a i til sidst i programmet (efter sætning 13). Giv de nye sætninger numre, der er 0.5 større end de foregående sætninger, f.eks. vil kopieringen a := a i have nummer 13.5.
Vejledende løsning til skriftlig eksamen januar 2007 i Oversættere side 8 af 5 1: a 1 := 0 2: b := 1 3: z := 0 3.5: a 2 := a 1 4: LBEL loop 5: IF n = z THEN end ELSE body 6: LBEL body 7: t := a 2 + b 8: a 3 := b 9: b := t 10: n := n 1 11: z := 0 11.5: a 2 := a 3 12: GOTO loop 13: LBEL end 13.5: a := a 2 Spørgsmål 6.2 (12%) ngiv for hver af variablerne a, a 1, a 2 og a 3 numrene på de instruktioner, hvor den pagældende variabel er levende ved udgangen af instruktionen. Se sidste kolonne i figur 8.4 i Basics of ompiler Design for levendehed for alle de oprindelige variabler. Vink: Når a er levende i det oprindelige program, er præcis en af a, a 1, a 2 eller a 3 levende i det nye program. a : 13.5 a 1 : 1, 2, 3 a 2 : 3.5, 4, 5, 6, 11.5, 12, 13 a 3 : 8, 9, 10, 11 Spørgsmål 6.3 (12%) ngiv for alle tildelingssætninger, hvori a, a 1, a 2 eller a 3 forekommer på enten venstre- eller højresiden, hvilken interferens disse sætninger genererer (jvf. definition 8.2 i Basics of ompiler Design) 2. Vis det på samme måde som tabellen 2 side 180 i 2006 udgaven og 178 i 2004 og 2005 udgaverne
Vejledende løsning til skriftlig eksamen januar 2007 i Oversættere side 9 af 5 sidst i afsnit 8.4 i Basics of ompiler Design). Vink: De andre variabler (dvs. n, z, b og t) er levende ved udgangen af en af de nye kopisætninger, netop hvis de er levende ved udgangen af den foregående sætning. Instruction Left-hand side Interferes with 1 a 1 n 2 b n,a 1 3 z n,a 1,b 3.5 a 2 z,n,b 8 a 3 t,n 9 b n,a 3 10 n a 3,b 11 z n,a 3,b 11,5 a 2 z,n,b 13,5 a