130 likes | 284 Views
INF5110 – 23. april, 2013 Svar på noen oppgaver til kap . 8 Beklager noe trykkfeil og rot på forelesningene Håper dette er bedre (lagt ut 24/4). Nå fredag (26/4): Det blir ikke undervisning Oblig 2:
E N D
INF5110 – 23. april, 2013Svar på noen oppgaver til kap. 8Beklager noe trykkfeil og rot på forelesningeneHåper dette er bedre (lagt ut 24/4) Nå fredag (26/4): Det blir ikke undervisning Oblig 2: Merk at den må levers før fristen (senest 1/5). Dersom den ikke aksepteres får man den tilbake for retting.
SVAR: Oppgave 8.1.c plusslitt r + Lag for hånd TA-kode for følgende uttrykk: a * b + a * b * c Du skal ikke prøve å optimalisere koden. Velg variabelnavn på temporære som t1, t2, osv. : t1 = a * b Lages av node x t2 = a * b Lages av node z t3 = t2 * c lages av node y t4 = t1 + t3 lages av node r Og node r skal melde «oppover» at svaret ligger i t4 y x * * z b a c * Det lages altså ikke kode i blad-nodene! a b Her er et ADT for uttrykket, og det er en metode i hver node. Angi i hvilken node de forskjellige deler av TA-koden blir produsert.
SVAR: Oppgave 8.1.c, med optimalisering • Lag for hånd TA-kode for følgende uttrykk: • a * b + a * b * c • Du skal nå prøve å optimalisere koden, ved ikke å beregne samme subuttrykk om igjen: • t1 = a * b • t2 = t1 * c • t3 = t1 + t2 • For å kunne lage slik kode må kompilatoren: • Oppdage om det er subtrær som er like, og hvor. Dette må gjøres med et slags søk, som vi ikke går inn på her. • I vårt tilfelle kan dette markeres med en peker fra node y til node x i treet over (alternativt sette z.left til å peke direkte til x) • Kodegeneratoren må ta hensyn til dette ved å markere i x når det er generert kode for subtreet x, og angi i x i hvilken tempoærvariabel verdien ligger. + z x * * y b a c * a b Her er et ADT for uttrykket, og det er én kodegen.-metode i hver node. Tenk på hvordan en kompilator skulle kunne gjøre slike optimaliseringer.
SVAR: Oppgave 8.2.c P-kode z + y u Lag for hånd P-kode for følgende uttrykk: a * b + a * b * c Du skal her ikke prøve å optimalisere koden. lod a lages av x lod b lages av w muli lages av y lod a lages av q lod b lages av r muli lages av v lod c lages av p muli lages av u addi lages av z * * p x v w b a c * r q a b Ved P-kode lages det alstå kode fra alle noder Her er et ADT for uttrykket, og det er én metode i hver node. Angi i hvilken node de forskjellige deler av P-koden blir produsert.
SVAR: Oppgave 8.2.c, P-kode med optimalisering Lag for hånd P-kode for følgende uttrykk: a * b + a * b * c Du skal nå prøve å optimalisere koden, ved ikke å beregne samme uttrykket om igjen. Foreslå en ekstra P-instruksjon slik at dette går an. Vi foreslår: en «dup»-instruksjon som dupliserer toppen av stakken. Koden kan da skrives lod a lod b mul loda lodb muli lod c muli addi Koden blir da: loda lod b muli dup lod c muli addi Erstattes av dup
Oppgave: If-setningeroppg. 1. P-kode • I den følgende if-setninger b, c ogd boolske variable • if (b and c or d) a = x else x = a ; Bet. tolkes slik: ((b and c) or d) • Lag P-kode for denne pr. hånd der betingelsen ikke er kortsluttet, og slik at betingelsen blir beregnet til en logisk verdi: • lod b • lod c • and • lod d • or • jfalse L1 • lda a Load adressen til a! • lod x • sto Begge forsvinner • jmp L2 • label L1 • ldax Load adresse! • loda • sto • label L2
SVAR: If-setningeroppg. 2. P-kode med kortslutning • I den følgende if-setninger b, c ogd boolske variable • if (b && c || d) a = x else x = a ; • Lag P-kode for denne der betingelsen blir kortsluttet og slik at alle hopp går så direkte som mulig • lodb • jfalse Ld • lodc Her er b true • jfalse Ld • jmpLstart Her er b&&c true • label Ld Her er b&&c altså false • lod d • jfalseLelse Betingelsen er false fordi også d er false • labelLstart • ldaa • lod x • sto • jmpLslutt • labelLelse • ldax • lod a • sto • labelLslutt Det kan her virke som denne koden blir laget på helt ad.hoc.-basis, men, se i pensum-filene at det er greit nok å produsere slik kode. Trikset er å gi med til hver kodegen-metode i uttrykks-noder (to String-parametere) hvilken label det skal hoppes til så fort man vet at svaret blir hhv. true eller false.
SVAR: Oppgave: If-setningeroppg. 3, TA-kode • I den følgende if-setninger b, c ogd boolske variable • if (b and c or d) a = x else x = a ; • Lag TA-kode for denne der betingelsen ikke er kortsluttet og slik at den blir beregnet til en logisk verdi • t1 = b and c • t2 = t1 or d • jfalseLelse • a = x • jmpLslutt • labelLelse • x = a • labelLslutt
Oppgave: If-setningeroppg. 4, Med kortslutning • I den følgende if-setninger b, c ogd boolske variable • if (b && c || d) a = x else x = a ; • Lag TA-kode for denne der betingelsen blir kortsluttet og slik at alle hopp går så direkte som mulig. Kodegenereings-metode diskuteres i pensum-foilene. Det blir altså lite vanlige TA-instruksjoner her! • jfalse b Ld • jfalse c Ld • jmpLstart // Hopp om hele b && c er true • labelLd // Hele b && c er false • jfalse d Lelse // Hopp om hele (b && c || d) er false • labelLstart • a = x • jmpLslutt • labelLelse • x = a • labelLslutt
Lag OO-versjonav program somgenererer TA-kode med kortslutning for betingelser • Et program fra pensumfoilene som gjør dette ligger på neste foil. Oppgaven er å skrive det i en objektorientert stil. • Oppsett for svar ligger på foilen deretter.
Men heller ikke denne vil lage helt god kode! Hvorfor?? (se helt nederst) Genere TA-kode for boolskeuttrykk Vi bryr oss ikke med retur-navnet, siden de alltid vil hoppe ut For ”||”: voidgenBoolCode(StringlabT, labF) { … case ”||”: { Stringlabx = genLabel(); left.genBoolCode(labT, labx); emit2(”label”, labx); right.genBoolCode(labT, labF); } case ”&&”: { Stringlabx = genLabel(); left.genBoolCode(labx,labF); // som over emit2(”label”, labx); right.genBoolCode(labT, labF); // som over } case ”not”: { // Har bare ”left”-subtre left.genBoolCode(labF,labT); // Ingen kode lages!!! } case ”<”: { String temp1, temp2, temp3; // temp3 skal holde den boolsk verdi for relasjonen temp1 = left.genIntCode(); temp2 = right.genIntCode(); temp3 = genLabel(); emit4(temp3, temp1, «lt», temp2); // temp3 får (det boolske) svaret på relasjonen emit3(«jmp-false», temp3,labF); emit2(«ujp»,labT); // Denne er unødvendig dersom det som følger etter er labT // Dette kan vi oppdage med en ekstra parameter som angir labelenbak } } // den konstrusksjonen man kaller kodegenererings-metoden for. true left labT false labx true right labT false labF
GenBoolCodegenerererriktig TA-kodepå OO-manerMerk:noenavnavneneer her forandretfraforrige foil abstractclass Expression { abstractStringgenBoolCode(StringLabT, LabF); } classOrOpextendsExpression { StringgenBoolCode(StringLabT, LabF){ Stringlabx = genNewLabel(); left.genBoolCode(labT, labx); emit2(”label”, labx); right.genBoolCode(labT, labF); } } classAndOpextendsExpression { StringcodeGen(StringLabT, LabF){ Stringlabx = genNewLabel(); left.genBoolCode(labx,labF); emit2(”label”, labx); right.genBoolCode(labT, labF); } } Svar: Dette må stå i Expression-klassen! NB: Selv om alle metoder her leverer en String(altså navnet på variablen der svaret ligger) så bruker vi ikke dette, fordi alt foregår med hopp! Unntaket er LessThanOp (”<”).
Fortsettelsefraforrige foil classNotOpextendsExpression { StringgenBoolCode (StringLabT, LabF){ expr.genBoolCode(labF,labT); // «expr» er peker til subtreet i Not-noder } } classLessThanOpextends Expression { StringgenBoolCode (StringLabT, LabF){ Stringtemp1, temp2, temp3; // temp3 skal holde verdi av relasjonen temp1 = left.genIntCode(); temp2 = right.genIntCode(); temp3 = genNewLabel(); emit4(temp3, temp1, «lt», temp2); emit3(«fjmp», temp3,labF); emit2(«ujp»,labT); } }