Hovedansvarlig. Symbolgenerator. Tregenerator. Litt mer kompliserte setninger med betingelser

Like dokumenter
Hvordan skrive Flok og Flass kode? I mange tilfelle er det svært enkelt:

Dagens tema: INF2100. Utvidelser av Minila array-er. tegn og tekster. Flass- og Flokkode. prosedyrer. Prosjektet struktur. feilhåndtering.

Hva er kompilering? Dagens tema. En kompilator En kompilator leser Minila koden og lager Flok koden.

INF okt. 2004

INF2100. Dagens tema: Flink-maskinen Litt datamaskinhistorie. Registre og lagre. Instruksjoner. Flass-koden

Dagens tema: INF2100. Syntaksanalyse. Hva annet gjør en kompilator? Sjekking av navnebruk. Testutskrifter

ISO Dagens tema. Tegn. Uttrykk. I Minila lagres kun heltall, men de kan tolkes som tegn. Det siste om Minila.

Dagens tema: 12 gode råd for en kompilatorskriver

Datamaskinenes historie Menneskene har alltid prøvd å lage maskiner for å løse sine problemer.

Velkommen til INF2100

Syntaksanalyse. Dagens tema: Språkdiagrammene Jernbanediagrammene er et ypperlig utgangspunkt for å analysere et program: INF2100 INF2100 INF2100

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen Oppsummering

INF Repetisjon: Hvordan bygge treet og analysere? 8. september Typisk situasjon. De problematiske syntaks-diagrammene

INF Enkel historikk over modul-utvikling. Ønsker til en god oppdeling. Program-arkitektur: Hvordan dele opp i moduler/komponenter?

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen

Råd nr 1: Start nå! Det tar typisk timer å programmere Del 1 om man ikke har gjort slikt før. Dagens tema:

Bakgrunnen for INF2100. Velkommen til INF2100. Prosjektet. Hva gjør en kompilator?

Dagens tema: 12 gode råd for en kompilatorskriver. Sjekking av navn. Lagring av navn. Hvordan finne et navn?

Velkommen til INF2100 Jeg er Dag Langmyhr

Oversikt Kodegenerering Variabler Setninger Uttrykk While-setningen

Dagens tema: Formålet. Kodegenerering NB! Introduksjon Modulen Code. Enkle variable Noen enkle setninger Uttrykk

Dagens tema: Formålet. Kodegenerering NB! Introduksjon Modulen Code. Enkle variable Noen enkle setninger Uttrykk

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

Oversikt Oversettelse Logging Implementasjon Oppsummering

Kodegenerering del 3: Tilleggsnotat fra AHU Samt litt om class-filer og byte-kode INF5110 V2007. Stein Krogdahl, Ifi UiO

INF april, 2015 Stein Krogdahl Ifi, UiO. Svar på oppgaver til kap. 8. Ble lagt ut 24. april

UNIVERSITETET I OSLO

Dagens tema: Maskinkode. Litt datamaskinhistorie Hva er maskin- og assemblerkode? x86-prosessoren Programkode og variabler

INF april, 2014 Stein Krogdahl Ifi, UiO. Svar på oppgaver til kap. 8

Obligatorisk Innlevering 2

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

Litt om Javas class-filer og byte-kode

Gjennomgang prøveeksamen oppgave 1, 2, 4, 5, 7

En oppsummering (og litt som står igjen)

Dagens tema: Mer av det dere trenger til del 1

INF5110 Obligatorisk Oppgave 2 del 2. Andreas Svendsen SINTEF. 23. April Oversikt

UNIVERSITETET I OSLO

Dagens tema. Hva er kompilering? Anta at vi lager dette lille programmet doble.rusc (kalt kildekoden): Hva er kompilering?

Oppgaver til kodegenerering etc. INF-5110, 16. mai, 2014

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

Oversikt. INF1000 Uke 1 time 2. Repetisjon - Introduksjon. Repetisjon - Program

Dagens tema. Hva er kompilering? Anta at vi lager dette lille programmet (kalt kildekoden): Hva er kompilering?

Hvordan en prosessor arbeider, del 1

Repetisjon: Statiske språk uten rekursive metoder (C1 og C2) Dagens tema Kjøresystemer (Ghezzi&Jazayeri 2.6, 2.7)

Dagens tema Kjøresystemer (Ghezzi&Jazayeri 2.6, 2.7)

Dagens tema: Sjekking

Norsk informatikkolympiade runde

Dagens tema: 12 gode råd for en kompilatorskriver. Prosjektet. Koblingen mellom grammatikken og klasser. Utifra dette RusC-programmet:

Oppsummering Assemblerkode Hopp Multiplikasjon Kode og data Array Oppsummering

Oppbygningen av en datamaskin Det viktigste i en moderne datamaskin er hovedkortet («motherboard»):

Del 4 Noen spesielle C-elementer

NOTAT (pensum!) Javas klasse-filer, byte-kode og utførelse. INF 5110, 10/5-2011, Stein Krogdahl

Pensum Hovedtanker Selvmodifiserende Overflyt Veien videre Eksamen. Oppsummering

Oppgaver til kodegenerering etc. INF-5110, 12. mai, 2015

INF1000 : Forelesning 4

INF Uke 10. Ukesoppgaver oktober 2012

INF 1000 høsten 2011 Uke september

i=0 i=1 Repetisjon: nesting av løkker INF1000 : Forelesning 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker j=0 j=1 j=2 j=3 j=4

Eivind Gard Lund. 24. Mars 2009 Foilene bygger på 2009 utgaven av Andreas Svendsen

Dagens tema: Generelt om variable. Kodegenerering. Deklarasjon av array er. Versjonskontroll. Oppslag i array er

Den siste dagen. Pensumoversikt Hovedtanker i kurset Selvmodifiserende kode Overflyt Veien videre... Eksamen

INF1000 undervisningen INF 1000 høsten 2011 Uke september

2 Parser. 1 Skanner. 4 Kodegenerator. 3 Sjekker. Oversikt Datamaskinhistorie x86 Kodegenerering Setninger Uttrykk.

EKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00

Del 1 En oversikt over C-programmering

Dagens tema INF2270. Cs preprosessor. Separat kompilering av C funksjoner. C og minnet. Dag Langmyhr,Ifi,UiO: Forelesning 5. februar 2007 Ark 1 av 15

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

Forelesning inf Java 4

NOTAT (pensum!) Javas klasse-filer, byte-kode og utførelse

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

INF225 høsten 2003 Prosjekt del 4: kodegenerering

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

UNIVERSITETET I OSLO

Javas klasse-filer, byte-kode og utførelse (og litt om C# sin CIL-kode)

Enkle generiske klasser i Java

INF1000: noen avsluttende ord

2 Om statiske variable/konstanter og statiske metoder.

Oversikt Deklarasjoner Typesjekk Programmering Datamaskinhistorie x86 Kodegenerering

Dagens tema: 12 gode råd for en kompilatorskriver. Prosjektet. Modifikasjon av grammatikken. Utifra dette RusC programmet:

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

MER OM ARRAYER. INF1000: Forelesning 4. Anta at vi ønsker å lagre en liste med navnene på alle INF1000-studentene:

IN 147 Program og maskinvare

Kort om meg. INF1000 Uke 2. Oversikt. Repetisjon - Introduksjon

INF Oblig 2 semantikksjekk og kodegenerering

INF1000: Forelesning 4. Mer om arrayer Metoder

Dagens tema INF1070. Vektorer (array er) Tekster (string er) Adresser og pekere. Dynamisk allokering

Programmeringsspråket C

OPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?

INF1000 Prøveeksamen Oppgave 7 og 9

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

Utførelse av programmer, metoder og synlighet av variabler i JSP

EKSAMENSFORSIDE Skriftlig eksamen med tilsyn

TDT4110 Informasjonsteknologi grunnkurs: Kapittel 7 Filer og unntak ( exceptions ) Professor Alf Inge Wang Stipendiat Lars Bungum

Oversikt Kompilering Syntaksanalyse Java Feilsjekking Oppsummering

Kapittel 1 En oversikt over C-språket

UNIVERSITETET I OSLO

Obligatorisk oppgave 1 INF1020 h2005

Transkript:

Dagens tema: Kodegenerering Listing Minila Hovedansvarlig Listeansvarlig Flok Tegngenerator Linjegenerator Symbolgenerator Flinkrepresentant Tregenerator Kodegenerator Del 0 Del 1 Del 2 Introduksjon FlinkRepresentation Enkle variable Noen enkle setninger Uttrykk Litt mer kompliserte setninger med betingelser Dag Langmyhr,Ifi,UiO: Forelesning 8. november 2005 Ark 1 av 20

Oversikt Formålet med kodegenereringen er å lage Flok kode som Flink maskinen kan utføre: Inndata er trerepresentasjonen av Minila programmet. Utdata er en fil med Flok kode. Eksempel Anta at vi har Minila programmet prog begprog outint(1) 1; outline; endprog Den genererte Flok filen ser slik ut: #! /store/bin/flink 5 6 12 1 0 20 1 0 10 1 0 11 0 0 0 0 0 0 0 0 0 0 0 Dag Langmyhr,Ifi,UiO: Forelesning 8. november 2005 Ark 2 av 20

Genererte instruksjoner Til hjelp under uttesting (og etterpå!) finnes opsjonen I som lar kompilatoren fortelle hvilken kode den lager: 1: prog I(resVar) 0: 1 cpfrom I(resVar) 1: 1 cpto I(resVar) 2: 1 cpc I(resVar) 3: 1 xin I(resVar) 4: 1 xinc I(resVar) 5: 1 xbet 2: begprog 3: outint(1) 1; outline; 4: endprog I(Instr) 0: JMP(12) 1 0 I(fillOld) 0: 1 I(Instr) 1: SETI(20) 1 0 I(Instr) 2: OUTI(10) 1 0 I(Instr) 3: OLIN(11) 0 0 I(Instr) 4: STOP(0) 0 0 Å implementere denne opsjonen er en del av den obligatoriske oppgaven. Dag Langmyhr,Ifi,UiO: Forelesning 8. november 2005 Ark 3 av 20

Hvordan lage kodegenerering Det beste er å følge samme opplegg som for å skrive ut programkoden i del 1: Legg en metode inn i alle klasser som representerer en bit av Minila programmet: class WhileSent {. void analyze (DeclSeqv ds) {.... void makecode () {... Dag Langmyhr,Ifi,UiO: Forelesning 8. november 2005 Ark 4 av 20

class FlinkRepresentation Man kan skrive kodefilen direkte, men det er enklere (i hvert fall tankemessig) å plassere koden rett inn i en slags Flink maskin: class FlinkRepresentation { private String flokfile; private int[] func, adr, corr, istore; private void makeinst (int f, int a, int c) { listresp.testinstout(nextinst, instname, f, a, c); if (nextinst > maxinst) mainresp.error("instruksjonslageret er fullt" ); func[nextinst] = f; adr[nextinst] = a; corr[nextinst] = c; nextinst++;. public void makeflokfile () {... Så kan kodefilen skrives ut til slutt. Dag Langmyhr,Ifi,UiO: Forelesning 8. november 2005 Ark 5 av 20

Variable Det må settes av plass i heltallsminnet til alle enkle variable. Dette løses enkelt med en metode i FlinkRepresentation: class FlinkRepresentation { private int nextint=0, maxint=1000; private int[] istore = new int[maxint]; int resvar (String name) { // Denne reserverer 1 celle i heltallslageret, ved å // øke nextint. Returnér adressen til cellen. // (Parameteren name er bare med // for I testutskriften.) listresp.testresvarout(nextint, 1, name); ++nextint; if (nextint > maxint) mainresp.error("heltallslageret er fullt"); return nextint 1;. Dette fungerer for Minila; de fleste andre programmeringsspråk trenger mer kompliserte opplegg. Array er er tema neste uke. Dag Langmyhr,Ifi,UiO: Forelesning 8. november 2005 Ark 6 av 20

Setninger På tilsvarende måte lager vi metoder for å legge de ulike instruksjonene i instruksjonslagrene: class FlinkRepresentation { private int nextinst=0, maxinst=1000; private int[] func, adr, corr; private void makeinst (String instname, int f, int a, int c) { listresp.testinstout(nextinst, instname, f, a, c); if (nextinst > maxinst) mainresp.error("instruksjonslageret er fullt" ); func[nextinst] = f; adr[nextinst] = a; corr[nextinst] = c; nextinst++;. public void makeoutc (int a, int c) { makeinst("outc", 28, a, c);. Dag Langmyhr,Ifi,UiO: Forelesning 8. november 2005 Ark 7 av 20

Setningen outchar Da har vi apparatet for å lage kode for enkle setninger som outchar. Kodeskjemaer for alle setningene finnes i kompendiet. Minila Flink kode outchar uttrykk Beregn uttrykk class OutCharSent { private Expression expr; OUTC void analyze (DeclSeqv ds) {... void makecode () { listresp.testkout("inn", "OutCharSent"); expr.makecode(); flinkrepr.makeoutc(0, 0); listresp.testkout("ut", "OutCharSent"); Dag Langmyhr,Ifi,UiO: Forelesning 8. november 2005 Ark 8 av 20

Testutskrift K På samme måte som A var nyttig til å finne feil under analysen, trenger vi en opsjon K som forteller hvilke metoder kodegeneratoren er innom: 1: prog 2: begprog 3: outint(1) 1; outline; 4: endprog K: INN Program K: INN DeclSeqv K: UT DeclSeqv K: INN SentSeqv K: INN OutIntSent K: INN Expression K: INN ConstPart K: UT ConstPart K: UT Expression K: UT OutIntSent K: INN OutLineSent K: UT OutLineSent K: UT SentSeqv K: UT Program Dag Langmyhr,Ifi,UiO: Forelesning 8. november 2005 Ark 9 av 20

Uttrykk Hvordan lager vi kode for et uttrykk som i a := 4 * a 17? Første operand Det er ganske enkelt å lage kode som legger en konstant eller en variabel i I registeret: Minila Flink kode tallkonstant SETI Konstantens verdi tegn SETI Tegnets verdi enkel variabel LDI Variabelens adresse Dag Langmyhr,Ifi,UiO: Forelesning 8. november 2005 Ark 10 av 20

Resten av uttrykket Resten av uttrykket består av 0 eller flere par (operator,konstant/variabel) som vi kan ta etter tur. Minila arop enkel variabel Flink kode arop I variabelens adresse arop konstant adr INTG konstantens verdi arop I adr (Legg merke til at konstanter må ligge i minnet.) Dag Langmyhr,Ifi,UiO: Forelesning 8. november 2005 Ark 11 av 20

1: prog I(resVar) 0: 1 cpfrom I(resVar) 1: 1 cpto I(resVar) 2: 1 cpc I(resVar) 3: 1 xin I(resVar) 4: 1 xinc I(resVar) 5: 1 xbet 2: var a; 3: begprog 4: a := 3; 5: a := 4 * a 17; 6: outint(1) a; 7: endprog I(Instr) 0: JMP(12) 1 0 I(resVar) 6: 1 a I(fillOld) 0: 1 I(Instr) 1: SETI(20) 3 0 I(Instr) 2: STI(2) 6 0 I(Instr) 3: SETI(20) 4 0 I(Instr) 4: MULI(7) 6 0 I(resConst) 7: 17 I(Instr) 5: SUBI(6) 7 0 I(Instr) 6: STI(2) 6 0 I(Instr) 7: LDI(1) 6 0 I(Instr) 8: OUTI(10) 1 0 I(Instr) 9: STOP(0) 0 0 Dag Langmyhr,Ifi,UiO: Forelesning 8. november 2005 Ark 12 av 20

#! /store/bin/flink 10 8 12 1 0 20 3 0 2 6 0 20 4 0 7 6 0 6 7 0 2 6 0 1 6 0 10 1 0 0 0 0 0 0 0 0 0 0 0 17 Dag Langmyhr,Ifi,UiO: Forelesning 8. november 2005 Ark 13 av 20

Setninger Noen setninger er litt mer kompliserte å generere kode for. While setningen Minila koden i := 10; while i <> 0 do v := v + i; i := i 1; endwhile; skal generere denne koden: I(Instr) 1: SETI(20) 10 0 I(Instr) 2: STI(2) 6 0 I(Instr) 3: LDI(1) 6 0 I(Instr) 4: STI(2) 5 0 I(Instr) 5: SETI(20) 0 0 I(Instr) 6: SUBI(6) 5 0 I(Instr) 7: JEQI(16) 1 0 I(Instr) 8: LDI(1) 7 0 I(Instr) 9: ADDI(5) 6 0 I(Instr) 10: STI(2) 7 0 I(Instr) 11: LDI(1) 6 0 I(resConst) 8: 1 I(Instr) 12: SUBI(6) 8 0 I(Instr) 13: STI(2) 6 0 I(Instr) 14: JMP(12) 3 0 Dag Langmyhr,Ifi,UiO: Forelesning 8. november 2005 Ark 14 av 20

Hoppadresser Koden inneholder to hopp: Minila Flink kode while betingelse do xw Som angitt J xrel I xew. oversettes som vanlig endwhile xew.. JMP xw Hopp til kjent adresse Den siste hoppet er greit nok: Bare husk adressen (dvs indeksen i istore) da man begynte å lage kode for setningen. Dag Langmyhr,Ifi,UiO: Forelesning 8. november 2005 Ark 15 av 20

Hopp til ukjent adresse Hva med det første hoppet? Når koden skal lages, vet vi ikke hvor langt vi skal hoppe. Løsningen er: ❶ Generér en hoppinstruksjon til adresse 1. (Husk også adressen til denne instruksjonen.) ❷ Når vi en stund senere vet den riktige adressen, kan vi sette inn denne i stedet. class FlinkRepresentation { private int[] func, adr, corr;. void filloldadr (int instnr, int newadr) { // Fyll instruksjon instnr med adresse newadr listresp.testfilloldadrout(instnr, newadr); adr[instnr] = newadr; Dag Langmyhr,Ifi,UiO: Forelesning 8. november 2005 Ark 16 av 20

Hele koden Da har vi hele koden for While setningen: void makecode () { listresp.testkout("inn", "WhileSent"); int whilestart = flinkrepr.nextinstadr(); cond.makecode(); int falsecond = flinkrepr.nextinstadr() 1; SS.makeCode(); flinkrepr.makejmp(whilestart,0); flinkrepr.filloldadr(falsecond, flinkrepr.nextinstadr()); listresp.testkout("ut", "WhileSent"); Dag Langmyhr,Ifi,UiO: Forelesning 8. november 2005 Ark 17 av 20

Betingelser Hvordan skal vi lage kode for en betingelse som while a*2 > b+1 do? Det er i grunnen bare én måte å gjøre det på: ❶ Beregn uttrykket til venstre for relasjonen. ❷ Beregn uttrykket til høyre. ❸ Trekk det venstre uttrykket fra det høyre. ❹ Lag et betinget hopp (som sjekker I registeret mot 0). Dag Langmyhr,Ifi,UiO: Forelesning 8. november 2005 Ark 18 av 20

Mellomlagring Når vi har beregnet den venstre verdien, må vi lagre den et sted mens vi beregner den høyre. Ingen registre er ledige, så vi må sette av en lokasjon xbet et fast sted i minnet. Valg av hoppinstruksjon Litt tankearbeid gir oss denne tabellen for hvilke instruksjoner vi skal lage: xrel = =/=,<> < <= > >= J xrel I JNEI JEQI JLEI JLTI JGEI JGTI Dag Langmyhr,Ifi,UiO: Forelesning 8. november 2005 Ark 19 av 20

1: prog I(resVar) 0: 1 cpfrom I(resVar) 1: 1 cpto I(resVar) 2: 1 cpc I(resVar) 3: 1 xin I(resVar) 4: 1 xinc I(resVar) 5: 1 xbet 2: var a, b; 3: begprog 4: a := 10; 5: b := 7; 6: while a*2 > b+1 do 7: a := a 1; 8: endwhile; 9: endprog I(Instr) 0: JMP(12) 1 0 I(resVar) 6: 1 a I(resVar) 7: 1 b I(fillOld) 0: 1 I(Instr) 1: SETI(20) 10 0 I(Instr) 2: STI(2) 6 0 I(Instr) 3: SETI(20) 7 0 I(Instr) 4: STI(2) 7 0 I(Instr) 5: LDI(1) 6 0 I(resConst) 8: 2 I(Instr) 6: MULI(7) 8 0 I(Instr) 7: STI(2) 5 0 I(Instr) 8: LDI(1) 7 0 I(resConst) 9: 1 I(Instr) 9: ADDI(5) 9 0 I(Instr) 10: SUBI(6) 5 0 I(Instr) 11: JGEI(19) 1 0 I(Instr) 12: LDI(1) 6 0 I(resConst) 10: 1 I(Instr) 13: SUBI(6) 10 0 I(Instr) 14: STI(2) 6 0 I(Instr) 15: JMP(12) 5 0 I(fillOld) 11: 16 I(Instr) 16: STOP(0) 0 0 Dag Langmyhr,Ifi,UiO: Forelesning 8. november 2005 Ark 20 av 20