Presentasjon lastes. Vennligst vent

Presentasjon lastes. Vennligst vent

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

Liknende presentasjoner


Presentasjon om: "1 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."— Utskrift av presentasjonen:

1 1 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: 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 pluss litt 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 + * ** a ab b c 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. x z y r Det lages altså ikke kode i blad- nodene!

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. + * ** a ab b c 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. x y z

4 SVAR: Oppgave 8.2.c P-kode 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 + * ** a ab b c 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. x u z y r p v q w Ved P-kode lages det alstå kode fra alle noder

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 lod a lod b muli lod c muli addi Erstattes av dup Koden blir da: lod a lod b muli dup lod c muli addi

6 Oppgave: If-setninger oppg. 1. P-kode I den følgende if-setning er b, c og d 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 lda x Load adresse! lod a sto label L2

7 SVAR: If-setninger oppg. 2. P-kode med kortslutning I den følgende if-setning er b, c og d 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 lod b jfalse Ld lod c Her er b true jfalse Ld jmp Lstart Her er b&&c true label Ld Her er b&&c altså false lod d jfalse Lelse Betingelsen er false fordi også d er false label Lstart lda a lod x sto jmp Lslutt label Lelse lda x lod a sto label Lslutt 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-setninger oppg. 3, TA-kode I den følgende if-setning er b, c og d 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 jfalse Lelse a = x jmp Lslutt label Lelse x = a label Lslutt

9 Oppgave: If-setninger oppg. 4, Med kortslutning I den følgende if-setning er b, c og d 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 jmp Lstart // Hopp om hele b && c er true label Ld // Hele b && c er false jfalse d Lelse // Hopp om hele (b && c || d) er false label Lstart a = x jmp Lslutt label Lelse x = a label Lslutt

10 Lag OO-versjon av program som genererer 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 11 Genere TA-kode for boolske uttrykk void genBoolCode(String labT, labF) { … case ”||”: { String labx = genLabel(); left.genBoolCode(labT, labx); emit2(”label”, labx); right.genBoolCode(labT, labF); } case ”&&”: { String labx = 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 labelen bak } } // den konstrusksjonen man kaller kodegenererings-metoden for. labT true false labx labT true false labF left right For ”||”: Men heller ikke denne vil lage helt god kode! Hvorfor?? (se helt nederst) Vi bryr oss ikke med retur-navnet, siden de alltid vil hoppe ut

12 GenBoolCode genererer riktig TA-kode på OO-maner Merk: noen av navnene er her forandret fra forrige foil abstract class Expression { abstract String genBoolCode(String LabT, LabF); } class OrOp extends Expression { String genBoolCode (String LabT, LabF){ String labx = genNewLabel(); left.genBoolCode(labT, labx); emit2(”label”, labx); right.genBoolCode(labT, labF); } class AndOp extends Expression { String codeGen (String LabT, LabF){ String labx = 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 Fortsettelse fra forrige foil class NotOp extends Expression { String genBoolCode (String LabT, LabF){ expr.genBoolCode(labF, labT); // «expr» er peker til subtreet i Not-noder } class LessThanOp extends Expression { String genBoolCode (String LabT, LabF){ String temp1, 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); }


Laste ned ppt "1 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."

Liknende presentasjoner


Annonser fra Google