Presentasjon lastes. Vennligst vent

Presentasjon lastes. Vennligst vent

INF5110 – 23. april, 2013 Svar på noen oppgaver til kap

Liknende presentasjoner


Presentasjon om: "INF5110 – 23. april, 2013 Svar på noen oppgaver til kap"— Utskrift av presentasjonen:

1 INF5110 – 23. april, 2013 Svar på noen oppgaver til kap
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 + y x * * z a b * 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. + x z * * y a b * 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 p x v w q r
+ 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 a b * c q r 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 muli lod c addi Koden blir da: lod a lod b muli dup lod c addi Erstattes av dup

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 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 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 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. NB: Svar ikke lagt ut ennå (24/4)

11 Genere TA-kode for boolske uttrykk
Men heller ikke denne vil lage helt god kode! Hvorfor?? (se helt nederst) 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 ”&&”: { left.genBoolCode(labx, labF); // som over 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. Vi bryr oss ikke med retur-navnet, siden de alltid vil hoppe ut For ”||”: true left labT false labx true right labT false labF

12 Oppsett for kortsluttet kode: Metoden for et slikt uttrykk blir kalt fra while-stm eller if-stm, med labler den vet det skal hoppes til ved true eller false betingelse abstract class Expression { // Hvordan skal «String codeGen(…)» se ut her? } class OrOp extends Expression { String codeGen (String LabT, LabF){ ... } class AndOp extends Expression { String codeGen (…){ … } class NotOp extends Expression { class LessThanOp extends expression { Merk at disse metodene kalles «langs» pekere typet med Expression. Spørsmål: Hva må da stå i Expression-klassen?


Laste ned ppt "INF5110 – 23. april, 2013 Svar på noen oppgaver til kap"

Liknende presentasjoner


Annonser fra Google