1 / 13

Nå fredag (26/4): Det blir ikke undervisning Oblig 2:

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:

arlais
Télécharger la présentation

Nå fredag (26/4): Det blir ikke undervisning Oblig 2:

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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

  6. 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

  7. 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.

  8. 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

  9. 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

  10. 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.

  11. 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

  12. 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 (”<”).

  13. 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); } }

More Related