Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen

Like dokumenter
Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen Oppsummering

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen

Oversikt Kodegenerering Variabler Setninger Uttrykk While-setningen

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen

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

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

Dagens tema: Semantisk sjekking. Maskinkode. Hvordan finne deklarasjoner? Hvordan programmere sjekking av riktig navnebruk?

Oversikt Deklarasjoner Typesjekk Programmering Datamaskinhistorie x86 Kodegenerering

Oversikt Kompilering Syntaksanalyse Java Feilsjekking Oppsummering

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

Oversikt Deklarasjoner Typesjekk Datamaskinhistorie x86 Kodegenerering

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

Tema for siste forelesning:

Dagens tema: Kodegenerering. Versjonskontroll. Variabler, spesielt vektorer Funksjoner, kall og parametre Noen siste gode råd.

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

Oversikt Oversettelse Logging Implementasjon Oppsummering

Tema for siste forelesning:

Tema for siste forelesning:

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

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

Dagens tema: Mer av det dere trenger til del 1

Tema for siste forelesning:

Dagens tema: Resten av det dere trenger til del 1

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

Dagens tema: Mer av det dere trenger til del 1

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

Dagens tema: Resten av det dere trenger til del 1

En oppsummering (og litt som står igjen)

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

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

Dagens tema: Sjekking

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

Pensum Hovedtanker Selvmodifiserende Overflyt Veien videre Eksamen. Oppsummering

Dagens tema: 12 gode råd for en kompilatorskriver

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

Dagens tema Programmering av x86 Flytting av data Endring av størrelse

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

Å løse eksamensoppgaver

INF2100. Oppgaver uke 40 og

INF2100. Oppgaver 23. og 24. september 2010

Dagens tema. Minnestrukturen Grovt sett ser minnet for hver process slik ut: Flytting av data. Programmering av x86

INF2100. Oppgaver 9. oktober 2012 C 100 X 10

UNIVERSITETET I OSLO

Del 3: Evaluere uttrykk

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

Intro Rask kode x86-op Optimalisering Inline-kode Konklusjon

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

AlboC og kompilatoren hans. Kompendium for INF2100

Dagens tema INF1070. Makroer. Sanntidsprogrammering. Avbrudd. Bruker- og supermodus. Blanding av C og assemblerkode. Selvmodifiserende kode

Dagens tema. Makroer Ofte gjentar man kodelinjer når man skriver assemblerkode. Da kan det lønne seg å definere en makro:

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

Løsningsforslag til eksamen i INF2270

En oppsummering. Pensumoversikt Hovedtanker i kurset Selvmodifiserende kode Overflyt Eksamen. Programmeringsoppgaver Flervalgsoppgaver

INF2100. Oppgaver 6. og 11. oktober 2011 C 100 X 10

Dagens tema. Raskere kode [REB&DRO H kap 5]

Dagens tema: Sjekking (obligatorisk oppgave 3)

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

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

INF 1000 høsten 2011 Uke september

Intro Evaluering Rask kode x86-op Optimalisering Inline-kode

Notater: INF2270 Assembler

INF1000 undervisningen INF 1000 høsten 2011 Uke september

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

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; }

C< og kompilatoren hans

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

Dagens tema INF1070. Bit fikling. Makroer. Blanding av C og assemblerkode. Mer om Core War. Dag Langmyhr,Ifi,UiO: Forelesning 22. mai 2006 Ark 1 av 25

INF2100. Oppgave 1. Oppgave 2 4. Løsningsforslag til oppgaver uke 40 og Se figur 1 på neste side.

Intro Digital eksamen Rask kode x86-op Optimalisering Inline-kode Konklusjon

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

Dagens tema. Raskere kode [REB&DRO H kap 5]

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

Minneområder Det er vanlig å dele opp minnet til en prosess i disse ulike områdene: Fast minne Store og små indianere «align» ing struct er

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

C< og kompilatoren hans

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

Dagens tema. Programmering av x86 INF2270. Minnestrukturen i en prosess. Flytting av data Endring av størrelse. Aritmeriske operasjoner Flagg

INF Noen oppgaver til kap. 8

INF Noen oppgaver til kap. 8

INF2100. Oppgave 1, 2 og 3. Løsningsforslag til oppgaver 23. og 24. september Her er det mange mulige løsninger her er én: import java.io.

Dagens tema. Er maskinen big endian? Denne funksjonen tester det: INF1070 INF1070 INF1070 INF1070

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

Oppsummering. Kort gjennomgang av klasser etc ved å løse halvparten av eksamen Klasser. Datastrukturer. Interface Subklasser Klasseparametre

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF1010, 22. mai Prøveeksamen (Eksamen 12. juni 2012) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

Konstruktører. Bruk av konstruktører når vi opererer med "enkle" klasser er ganske ukomplisert. Når vi skriver. skjer følgende:

Hvordan en prosessor arbeider, del 1

Forhistorien Menneskene har alltid prøvd å lage maskiner for å løse sine problemer. Dagens tema

Datamaskinenes historie Når, hvor og hvorfor ble de første datamaskiner laget? Hvordan har utviklingen gått? Hva inneholder en datamaskin?

Programmering av x86. Minnestrukturen i en prosess Flytting av data. Skifting og rotasjoner Hopp. Stakken Rutinekall. Aritmeriske regneoperasjoner

C og kompilatoren hans. Kompendium for INF2100

INF Oblig 2 semantikksjekk og kodegenerering

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

IN2030. Oppgave 1. Løsningsforslag. Uke (Disse filene finnes også i mappen ~inf2100/e/e2/.)

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

LO191D/LC191D Videregående programmering

Diverse eksamensgaver

Programmeringsspråket C

Transkript:

Dagens tema Dagens tema: Kodegenerering Introduksjon Enkle variable Uttrykk Tilordning Litt mer kompliserte setninger med betingelser (Alt om kodegenerering unntatt funksjoner.)

Prosjektoversikt Del-0 Del-1 Del-2 f.cless cless f.s chargenerator scanner syntax code error log f.log

Det endelige målet Formålet Vårt oppdrag er å lage en kompilator: Inndata er trerepresentasjonen av C<-programmet laget i del 1. Utdata er en fil med x86 assemblerkode.

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen Hvordan ser datamaskinen vår ut? Datamaskinen vår Minnet inneholder tre former for data: Data inneholder globale variabler. Stakken inneholder parametre og lokale variabler. Koden er programmet (som tall).

Hvordan ser datamaskinen vår ut? movl v 1, v 2 Flytt v 1 til v 2. movzbl v 1, v 2 Omform 8-bits v 1 til 32-bits v 2. cdq Omform 32-bits %EAX til 64-bits %EDX:%EAX. leal v 1, v 2 Flytt adressen til v 1 til v 2. pushl v Legg v på stakken. popl v Fjern toppen av stakken og legg verdien i v. addl v 1, v 2 Addér v 1 til v 2. subl v 1, v 2 Subtraher v 1 fra v 2. imull v 1, v 2 Multipliser v 1 med v 2. idivl v Del %EDX:%EAX med v ; svar i %EAX. jmp lab Hopp til lab. call lab Kall funksjonen i lab. ret Returner fra funksjonen. cmpl v 1, v 2 Sammenligning v 1 og v 2. sete v Sett v =1 om =, ellers v =0. setne v Sett v =1 om, ellers v =0. setl v Sett v =1 om <, ellers v =0. setle v Sett v =1 om, ellers v =0. setg v Sett v =1 om >, ellers v =0. setge v Sett v =1 om, ellers v =0.

Et eksempel Anta at vi har C<-koden v = 1 + 2; Disse x86-instruksjonene gjør dette: movl $1,%eax # %EAX=1 %ECX=? stack=... pushl %eax # %EAX=1 %ECX=? stack=... 1 movl $2,%eax # %EAX=2 %ECX=? stack=... 1 movl %eax,%ecx # %EAX=2 %ECX=2 stack=... 1 popl %eax # %EAX=1 %ECX=2 stack=... addl %ecx,%eax # %EAX=3 %ECX=2 stack=... movl %eax,v # v = 3 Husk! Det finnes mange mulige kodebiter som gjør det samme. I kompendiet står angitt nøyaktig hvilke som skal brukes.

Metoden gencode Hvordan implementere kodegenerering Det beste er å følge samme opplegg som for å sjekke programkoden: Kodegenerering Legg en metode gencode inn i alle klasser som representerer en del av C<-programmet (dvs er subklasse av SyntaxUnit).

Metoden gencode class WhileStatm extends Statement { Expression test = new Expression(); StatmList body = new StatmList(); @Override void check(decllist curdecls) {. @Override void gencode(funcdecl curfunc) {. @Override void parse() {. @Override void printtree() {.

Konvensjoner Konvensjoner Kodegenerering blir mye enklere om vi setter opp noen fornuftige konvensjoner: Alle beregninger skal ende opp i %EAX. %ECX og %EDX er hjelperegistre. Stakken (som aksesseres via %ESP) er til mellomresultater funksjonskall (neste uke) Parametre og lokale variabler aksesseres via baseregisteret %EBP (neste uke)

Hva slags variabler har vi? Variabler Det finnes fem sorter variabler i C<: Enkle Vektorer (array-er) Globale Lokale (De blå tar vi neste uke.) Parametre De kan forekomme i tre ulike situasjoner: Deklarasjon int v; Bruk if (v>0)... Tilordning v = 1;

Generering av globale variable abstract class Declaration extends SyntaxUnit { String name, assemblername; boolean visible = false; Declaration nextdecl = null;. abstract class VarDecl extends Declaration {. class GlobalSimpleVarDecl extends VarDecl { GlobalSimpleVarDecl(String n) { super(n); assemblername = (CLess.underscoredGlobals()? "_" : "") + n; @Override void gencode(funcdecl curfunc) { Code.genVar(assemblerName, true, 4, "int "+name+";");.

Generering av globale variable Metoden Code.genVar vil sette av plass til globale variabler: public static void genvar(string name, boolean global, int nbytes, String comment) { if (! generatingdata) { codefile.println(".data"); generatingdata = true; if (global) codefile.println(".globl " + name); printlabel(name, false); codefile.printf(".fill %-24d", nbytes); if (comment.length() > 0) { codefile.print("# " + comment); codefile.println();

Generering av globale variable Deklarasjon av vektorer class GlobalArrayDecl extends VarDecl { int numelems; GlobalArrayDecl(String n) { super(n); assemblername = (CLess.underscoredGlobals()? "_" : "") + n; @Override int datasize() { return 4*numElems; @Override void gencode(funcdecl curfunc) { //-- Must be changed in part 2:

Tilordning Setninger I kompendiet finner vi kodeskjemaer for alle setningene. Assignment v = e a [ e 1 ] = e 2 ; Beregn e med svar i %EAX movl %eax, v Beregn e 1 med svar i %EAX pushl %eax Beregn e 2 med svar i %EAX leal a,%edx popl %ecx movl %eax,(%edx,%ecx,4)

Tilordning Et forslag til implementering: class AssignStatm extends Statement { Assignment assignment = new Assignment(); @Override void gencode(funcdecl curfunc) { assignment.gencode(curfunc);. class Assignment extends SyntaxUnit { Variable lhs = new Variable(); /* "Left hand side" */ Expression rhs = new Expression(); /* "Right hand side" */ @Override void gencode(funcdecl curfunc) { if ( det dreier seg om et array-element ) { // To be written... else { rhs.gencode(curfunc); lhs.declref.genstore();.

Tilordning Hint Alle VarDecl bør ha en genstore- og genstorearray-metode for å lage kode for tilordning til seg selv; de kan se slik ut: abstract class VarDecl extends Declaration { VarDecl(String n) { super(n); void genstore() { Code.genInstr("", "movl", "%eax,"+assemblername, name+" ="); protected void genstorearray() { Code.genInstr("", "leal", assemblername+",%edx", name+"[...] = "); Code.genInstr("", "popl", "%ecx", ""); Code.genInstr("", "movl", "%eax,(%edx,%ecx,4)", "");

Hvordan lagres uttrykk? Uttrykk Hvordan lager vi kode for et uttrykk som 4 * a - 17? Et uttrykk består av en liste der elementene er vekselvis operand og operator : expression <operand> 4 <operator> * <operand> a <operator> <operand> 17

Kodegenerering Dette kan implementeres slik: class Expression extends Operand { Operand firstop = null; Expression nextexpr = null; @Override void gencode(funcdecl curfunc) { firstop.gencode(curfunc); Operator opr = firstop.nextoperator; while (opr!= null) { Code.genInstr("", "pushl", "%eax", ""); opr.secondop.gencode(curfunc); opr.gencode(curfunc); opr = opr.secondop.nextoperator;.

Operander Operander Det er ganske enkelt å lage kode som legger en global enkel variabel i %EAX-registeret: v movl v,%eax Det er like enkelt for konstanter (tall eller tegn). n movl $ n,%eax ($-tegnet forteller assembleren at det er snakk om en tallkonstant.)

Operatorer Aritmetisk operatorer e 1 + e 2 Beregn e 1 med svar i %EAX pushl %eax Beregn e 2 med svar i %EAX movl %eax,%ecx popl %eax addl %ecx,%eax Ved at alle operander er innom %EAX blir det enklere å skrive kodegenereringen. Divisjon er litt vanskeligere; se tabellene i kompendiet. Hvorfor må e 1 legges på stakken?

Sammenligninger Sammenligninger Disse må programmeres anderledes enn regneoperasjonene: Eksempel: e 1 == e 2 1 Beregn e 1. 2 Beregn e 2. 3 Sammenlign e 1 og e 2. 4 Sett svaret i %AL. 5 Flytt svaret til %EAX.

Sammenligninger Sammenligningsoperatorer e 1 == e 2 Beregn e 1 med svar i %EAX pushl %eax Beregn e 2 med svar i %EAX popl %ecx cmpl %eax,%ecx sete %al movzbl %al,%eax

Kodegenering While-setningen while ( e ) { S.Ln 1 :.Ln 2 : Beregn e med svar i %EAX cmpl $0,%eax je.ln 2 S jmp.ln 1

Navnelapper Lokale navnelapper Når vi skal lage slike hopp, trenger vi stadig nye navnelapper. Dette kan vi få fra Code-modulen: private static int numlabels = 0; public static String getlocallabel() { return String.format(".L%04d", ++numlabels);

Komplett kode Hele koden class WhileStatm extends Statement { Expression test = new Expression(); StatmList body = new StatmList(); @Override void gencode(funcdecl curfunc) { String testlabel = Code.getLocalLabel(), endlabel = Code.getLocalLabel();. Code.genInstr(testLabel, "", "", "Start while-statement"); test.gencode(curfunc); Code.genInstr("", "cmpl", "$0,%eax", ""); Code.genInstr("", "je", endlabel, ""); body.gencode(curfunc); Code.genInstr("", "jmp", testlabel, ""); Code.genInstr(endLabel, "", "", "End while-statement");

Et eksempel while (a < 10) { a = a + 1;.L0001: # Start while-statement movl a,%eax # a pushl %eax movl $10,%eax # 10 popl %ecx cmpl %eax,%ecx setl %al # Test < movzbl %al,%eax cmpl $0,%eax je.l0002 movl a,%eax # a pushl %eax movl $1,%eax # 1 movl %eax,%ecx popl %eax addl %ecx,%eax # Compute + movl %eax,a # a = jmp.l0001.l0002: # End while-statement