Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen Oppsummering

Like dokumenter
Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen

Oversikt Kodegenerering Variabler Setninger Uttrykk While-setningen

Oversikt Kodegenerering Variable 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

Oversikt Kompilering Syntaksanalyse Java Feilsjekking Oppsummering

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

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

Oversikt Deklarasjoner Typesjekk Programmering Datamaskinhistorie x86 Kodegenerering

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

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

Oversikt Oversettelse Logging Implementasjon Oppsummering

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

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

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

Tema for siste forelesning:

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

Tema for siste forelesning:

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

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

Oversikt Deklarasjoner Typesjekk Datamaskinhistorie x86 Kodegenerering

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

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

Dagens tema: Resten av det dere trenger til del 1

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

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

Dagens tema: Mer av det dere trenger til del 1

Dagens tema: Resten av det dere trenger til del 1

Tema for siste forelesning:

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

En oppsummering (og litt som står igjen)

INF2100. Oppgaver 23. og 24. september 2010

Dagens tema: Sjekking

Pensum Hovedtanker Selvmodifiserende Overflyt Veien videre Eksamen. Oppsummering

Tema for siste forelesning:

Dagens tema: Mer av det dere trenger til del 1

Dagens tema: 12 gode råd for en kompilatorskriver

INF2100. Oppgaver uke 40 og

INF2100. Oppgaver 9. oktober 2012 C 100 X 10

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

AlboC og kompilatoren hans. Kompendium for INF2100

INF 1000 høsten 2011 Uke september

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

Del 3: Evaluere uttrykk

INF Noen oppgaver til kap. 8

INF1000 undervisningen INF 1000 høsten 2011 Uke september

Velkommen til INF2100

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

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

Dagens tema: Sjekking (obligatorisk oppgave 3)

Velkommen til INF2100

INF Noen oppgaver til kap. 8

Løsningsforslag til eksamen i INF2270

Velkommen til INF2100

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

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

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

UNIVERSITETET I OSLO

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

Å løse eksamensoppgaver

C< og kompilatoren hans

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

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

Intro Rask kode x86-op Optimalisering Inline-kode Konklusjon

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

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?

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

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

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

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

Hvordan en prosessor arbeider, del 1

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

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

Notater: INF2270 Assembler

Velkommen til INF2100 Jeg er Dag Langmyhr

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

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.

C< og kompilatoren hans

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

Diverse eksamensgaver

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

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

UNIVERSITETET I OSLO

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

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

INF Oblig 2 semantikksjekk og kodegenerering

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

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

Velkommen til INF2100

Runtime-omgivelser Kap 7 - I

Runtimesystemer Kap 7 - I

Intro Evaluering Rask kode x86-op Optimalisering Inline-kode

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

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

INF april, 2013 Kap. 8 Noen oppgaver som er meget relevante for Oblig 2

Oppsummering Assemblerkode Hopp Multiplikasjon Kode og data Array Oppsummering

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

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

Transkript:

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

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. C<-program Assemblerspråk a[x+1] = 0; Kompilator cless movl %eax,(%ecx,%edx,4) Assembler as Maskinkode 00101111

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 Det finnes mange mulige kodebiter som gjør det samme. I kompendiet står angitt ganske nøyaktig hvilke som skal brukes.

Metoden gencode Hvordan implementere kodegenerering Det beste er å følge samme opplegg som for å skrive ut programkoden i del 1: 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; StatmList body; static WhileStatm parse(decllist decls, FuncDecl curfunc) {. void gencode() {. 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 Parametre aksesseres via %EBP (neste uke) (neste uke)

Hva slags variable har vi? Enkle variable Det finnes fem sorter variable i C<: Enkle Vektorer (array-er) Globale Lokale Parametre (De blå variantene tar vi neste uke.)

Generering av variable Reservasjon av variable løses med et par metoder i code-modulen: public static void genvar(string name, boolean global, int nbytes, String comment) {. (Forelest forrige gang) public static String getglobalname(string vname) { return vname;

Generering av variable abstract class Declaration extends SyntaxUnit { String name, assemblername;. abstract class VarDecl extends Declaration {. class GlobalVarDecl extends VarDecl { void gencode() { if (isarray()) { //-- To be written... else { Code.genVar(assemblerName, true, 4, "int "+name+";");.

Tilordning Setninger I kompendiet finner vi kodeskjemaer for alle setningene. Assignment v = e Beregn e med svar i %EAX movl %eax, v

Tilordning Et forslag til implementering: class AssignStatm extends Statement { Assignment assignment; void gencode() { assignment.gencode();. class Assignment extends SyntaxUnit { Variable lhs; /* "Left hand side" */ Expression rhs; /* "Right hand side" */ void gencode() { if ( det dreier seg om et array-element ) { // To be written... else { rhs.gencode(); Code.genInstr("", "movl", "%eax,"+assemblername, name+" =");.

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; void gencode() { firstop.gencode(); Operator opr = firstop.nextoperator; while (opr!= null) { Code.genInstr("", "pushl", "%eax", ""); opr.secondop.gencode(); opr.gencode(); 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?

Operatorer Sammenligninger Disse er vanskeligere å oversette siden ingen maskininstruksjoner passer helt godt. Vi er nødt til å teste og hoppe litt. Eksempel: e 1 == e 2 1 Beregn e 1. 2 Beregn e 2. 3 Sammenlign e 1 og e 2. 4 Anta at svaret er 1 (= sant). 5 Hvis sammenligningen var=, hopp over neste punkt. 6 Svaret er 0 (= usant).

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

Sammenligninger Sammenligningsoperatorer e 1 == e 2.Ln: Beregn e 1 med svar i %EAX pushl %eax Beregn e 2 med svar i %EAX popl %ecx cmpl %eax,%ecx movl $1,%eax je.ln movl $0,%eax

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

Komplett kode Hele koden class WhileStatm extends Statement { Expression test; StatmList body; void gencode() { String testlabel = Code.getLocalLabel(), endlabel = Code.getLocalLabel(); Code.genInstr(testLabel, "", "", "Start while-statement"); test.gencode(); Code.genInstr("", "cmpl", "$0,%eax", ""); Code.genInstr("", "je", endlabel, ""); body.gencode(); 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 movl $1,%eax jl.l0003 # Test < movl $0,%eax.L0003: 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

Hva vi har lært I dag Kodegenerering for uttrykk tilordninger while-setninger Neste uke Kodegenerering for array-er funksjoner og funksjonskall