INF og 27. april, 2010 Kap. 8 kodegenerering. Stein Krogdahl, Ifi UiO

Like dokumenter
Kap. 8 kodegenerering INF april, 2009

Kap. 8 del 1 kodegenerering INF april, 2008

INF og 13. april, Stein Krogdahl, Ifi UiO

Kap. 8 del 1 kodegenerering INF5110 Vår2007

Pensumoversikt - kodegenerering. Kap. 8 del 1 kodegenerering INF5110 v2006. Hvordan er instruksjonene i en virkelig CPU? Arne Maus, Ifi UiO

Stein Krogdahl, Ifi UiO

INF april, 2013 Kap. 8 kodegenerering

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

INF april, 2015 Kap. 8 kodegenerering. Del 2

INF og 23. april, 2014 Kap. 8 kodegenerering

INF-5110 Oppgaver kodegenerering etc. INF-5110, vår 2011

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

INF Noen oppgaver til kap. 8

INF Noen oppgaver til kap. 8

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

Kodegenerering, del 2: Resten av Kap. 8 pluss tilleggsnotat (fra kap. 9 i ASU ) INF5110 V2007

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

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

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

Litt om Javas class-filer og byte-kode

Mer kodegenerering: Tilleggsnotat fra AHU Om Javas Byte-kode INF april 2009

Mer kodegenerering: Tilleggsnotat fra AHU. INF mai Stein Krogdahl,

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

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

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

INF mai 2014 Stein Krogdahl, Ifi, UiO

MED SVARFORSLAG UNIVERSITETET I OSLO

Runtimesystemer Kap 7 - I

Hovedstoffet i kap 4: 16. Februar Ifi, UiO

UNIVERSITETET I OSLO

MED SVARFORSLAG UNIVERSITETET I OSLO. Det matematisk-naturvitenskapelige fakultet

Runtime-omgivelser Kap 7 - I

Introduksjon til DARK assembly

Runtimesystemer Kap 7 - I

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

INF2220: Forelesning 1. Praktisk informasjon Analyse av algoritmer (kapittel 2) (Binær)trær (kapittel )

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

UNIVERSITETET I OSLO

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

Kap. 4: Ovenfra-ned (top-down) parsering

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

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

Beskrivelse av programmeringsspråket Compila15 INF Kompilatorteknikk Våren 2015

Løsnings forslag i java In115, Våren 1996

INF110 Algoritmer og datastrukturer TRÆR. Vi skal i denne forelesningen se litt på ulike typer trær:

Generiske mekanismer i statisk typede programmeringsspråk

Del 1 En oversikt over C-programmering

UNIVERSITETET I OSLO

Kap.4, del 2: Top Down Parsering Kap. 5, del 1: Bottom Up Parsing INF5110, 7/ Legger ut en oppgave til kap. 4 (se beskjed).

Kap. 4 del I Top Down Parsering INF5110 v2006. Stein Krogdahl Ifi, UiO

Forelesning Instruksjonstyper Kap 5.5

Semantisk Analyse del I

Del 4 Noen spesielle C-elementer

INF5110 V2013 Stoff som i boka står i kap 4, men som er generelt stoff om grammatikker

UNIVERSITETET I OSLO

INF5110, onsdag 19. februar, Dagens tema: Parsering ovenfra-ned (top-down)

INF5110 V2012 Kapittel 4: Parsering ovenfra-ned

Dette er foiler til: 1. Tilleggsnotat fra bok av Aho, Sethi og Ullman Notatet legges ut på undervisnings-planen. Beklager dårlig kopi!

Forelesning Datatyper Kap 5.2 Instruksjonsformat Kap 5.3 Flyttall App B

Kap. 5, del 1: Parsering nedenfra-opp (Bottom up parsing) INF5110. Stein Krogdahl Ifi, UiO

UNIVERSITETET I OSLO

Dagens tema. INF Algoritmer og datastrukturer. Binærtrær. Generelle trær

Med Svarforslag UNIVERSITETET I OSLO. Det matematisk-naturvitenskapelige fakultet. 3 sider (side 6, 7 og 8, rives ut, fylles ut og leveres)

INF Oblig 2 semantikksjekk og kodegenerering

Viktig. Rettet i koden. Oppgaven. Obligatorisk oppgave 2 - Kort om oppgaven og litt informasjon. Fredrik Sørensen OMS-gruppen, IfI

Hva er en algoritme? INF HØSTEN 2006 INF1020. Kursansvarlige Ragnar Normann E-post: Dagens tema

Kjøresystemer. Hva er et kjøresystem? Den abstrakte maskinen SIMPLESEM (2.6) Klassifisering av språk: Parametre (2.7.7) Statiske språk (

Statisk semantisk analyse - Kap. 6

Programmeringsspråket C Del 3

Statisk semantisk analyse - Kap. 6

Velkommen til INF Kompilatorteknikk

INF 1000 høsten 2011 Uke september

INF1000 undervisningen INF 1000 høsten 2011 Uke september

Hovedstoffet i kap 4:

Programmeringsspråket C Del 3

Programmeringsspråket C Del 3

Programmeringsspråket C Del 3

Hvor er vi nå - kap. 3 (+4,5)? Forenklet skisse av hva en parser gjør PARSER. Kontekstfrie grammatikker og syntaksanalyse (parsering)

Eksamen i IN 110, 18. mai 1993 Side 2 Del 1 (15%) Vi skal se på prioritetskøer av heltall, der vi hele tiden er interessert i å få ut den minste verdi

INF5110. Oblig 2 presentasjon

Velkommen til INF Kompilatorteknikk

Oppgave 1 JK-flip-flop (Total vekt 20%)

E K S A M E N. Algoritmiske metoder I. EKSAMENSDATO: 11. desember HINDA / 00HINDB / 00HINEA ( 2DA / 2DB / 2EA ) TID:

Kap. 4, del I: Top Down Parsering Pluss oppgave til kapittel 3 INF5110 V2008

Obligatorisk oppgave 1 INF1020 h2005

Anatomien til en kompilator - I

Velkommen til INF Kompilatorteknikk

Velkommen til INF5110 Kompilatorteknikk

Kap. 5, del 1: Parsering nedenfra-opp (Bottom-up parsering) INF / Stein Krogdahl Ifi, UiO

Oversikt. Praktisk. Litt om meg. Obligatorisk oppgave 1 - Kort om oppgaven og verktøyene. Fredrik Sørensen OMS-gruppen, IfI.

Binære søketrær. Et notat for INF1010 Stein Michael Storleer 16. mai 2013

Anatomien til en kompilator - I

INF Algoritmer og datastrukturer. Hva er INF2220? Algoritmer og datastrukturer

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen Oppsummering

Oppgaver til INF 5110, kapittel 4, med svarforslag Gjennomgått torsdag 14. febr Disse foilene er justert 15/2, kl. 11

INF5110 Kap. 5: Parsering nedenfra-og-opp (Bottom-up parsing) 21/ Stein Krogdahl Ifi, UiO. Angående Oblig 1:

Kap.4 del I Top Down Parsering INF5110 v2005. Arne Maus Ifi, UiO

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

Oppsummering av digitalteknikkdelen

Transkript:

INF5110 14. og 27. april, 2010 Kap. 8 kodegenerering Stein Krogdahl, Ifi UiO 1

Frivillig hjelp trengs på MODELS-2010 Konferanse i Oslo 3.-8. oktober Ifi (OMS-gruppa) og SINTEF arrangerer Se: models2010.ifi.uio.no Trenger noen studenter til hjelp! Hjelpe til med innregistrering og liknende ting - Får delta på en del foredrag, workshops, tutorials etc. - Får lunsj - Og ikke minst: Får treffe de store i bransjen Interessert?: Meld fra til steinkr@ifi.uio.no (eller Jon.Oldevik@sintef.no) 2

Kodegenerering g Helt sikkert pensum: 8.1 Bruk av mellomkode 8.2 Basale teknikker for kode- generering g 8.3 Kode for referanser til datastrukturer (ikke alt) 8.4 Kode for generereing for kontroll-setninger og logiske uttrykk Mer: Kanskje også noe fra: 8.5, 8.9 og 8.10 Oppkopiert: p Om lur bruk av registre til å holde data som snart skal brukes om igjen (samme som i fjor?) Noe om generiske mekanismer i programmeringsspråk Litt mer om Javas byte-kode NB: Detaljert pensumliste kommer! 3

Hvordan er instruksjonene i en virkelig CPU? Et antall Registere (8-128) hvor Alltid: add, mult, sub, shift... går an mellom disse Alltid: load og store fra register til/fra memory Ofte: add osv. også til/fra memory Base- og indeks-registre (spesielle registre, eller alle kan være det) Ofte: En instruksjon brytes ned i en sekv. av mikro-instruksjoner instruksjoner Pipe-line (typisk 20 mikro-instr. kan være under utførelse samtidig) Spekulativ utføring: Starter på åde neste instruksjoner, men må å restarte dem om inneværende instr. forandrer deres input-data Ved betingede hopp: Utfører begge grener, men gir opp den ene når valget er klart Å hente data fra lageret er det som tar tid. Derfor: Flere nivåer med cache-lager, som fylles og utnyttes automatisk. 4

Intel Utviklet: 8bit - 16bit - 32bit - 64bit. Variabelt format 722-sider manual noen hundre instr. 5

Hukommelses-nivåer: størrelse og hastighet Lagertype Størrelse Rel. hastighet Register 8-128 1 (nå ca. 0.5-0.2 ns) cache L1 12-512 kb 2-3 data og instr. cache L2 0.5-2Mb 10-15 cache L3 (Itanium) noen Mb? hoved-memory 2-8 Gb 100-200 Disk 100-1000 Gb 20 000 000 (ca. 10 ms) Utførelsestiden blir vanskelig å forutsi på grunn av cachene Om det er flere kjerner på CPUen blir det ekstra ille (lager-koherens) 6

8.1 Bruk av mellomkode Man kan godt generere utførbar kode direkte fra syntaks-treet Hva med oblig2? Hva er utførbar kode? Men: Det kan være greit å overføre programmet til en lineær form: mellom-kode Grunn: Greit for optimalisering (flytte rundt), greit å legge på fil Vi skal se på to former for slik mellom-kode: Treadresse-kode (TA-kode) Setter navn på mellomresultater (kan tenkes på som registre) Forholdsvis lett å snu om på rekkefølgen av koden (optimalisering) P-kode (Pascal-kode a la Javas byte-kode, og den til Oblig 2) Var opprinnelig beregnet på interpretering, men oversettes nå gjerne Mellomresultatene på en stakk (operasjonene komme postfiks) Mange valg, f.eks.: Bevarer vi symboltabellene og la instruksjonene vise til den? Er det operasjoner for array-aksess (eller blir dette løst opp i flere, enklere operasjoner?) 7

Vi skal se på en del oversettelser: Vi skal først se på: Generering av TA-kode ut fra tre-strukturen t fra sem. analyse Generering av P-kode ut fra tre-strukturen fra sem. analyse Dette er omtrent som i Oblig 2 Generering av TA-kode fra P-kode Generering av P-kode fra TA-kode Denne er ikke så lett å få effektiv Man kommer da borti mange av problemene ved generell kodegenerering Men vi kommer ikke borti registerallokering : Altså: Hvor skal vi holde dataene for at de til enhver tid skal være raskest mulig å få tak i Denne problemstillingen er blitt litt forkludret etter at det ble vanlig med cacher, kanskje med flere nivåer Vi skal se eksplisitt på registerallokering senere 8

Tre-adresse (TA)-kode - eksempel TA grunnform: op = +, -, *, /, <, >,. and, or Tre-adresse (TA) kode Også: x = op y op = not, -, float-to-int. En alternativ kode-sekvens t 1, t 2, t 3, er temporære variable. Andre TA-instruksjoner: x = y if_false f x goto L label L ( psudo-instr. ) read x write x 9

Hånd -oversettelse til treadresse-kode 1 2 3 4 5 6 7 8 9 Mange valg å gjøre ved design av TA-kode: -Er det egne instruksjoner for int, long, float,..? -Hvordan er variable representert? -ved navn -peker til deklarasjon i symbol-tabell -ved maskinadresse -Hvordan er hver instruksjon lagret? - kvadrupler - (tripler, der adressen til instruksjonen er navn på en ny temporær variabel) 1 2 3 4 5 6 7 8 9 10

En mulig C-struct for å lagre en treadresse-instruksjon operasjonskodene op: - opkind (opcode) addr1: Hver adresse har denne formen -kind, val/name addr2: -kind, val/name addr3: -kind, val/name 11

P-kode (Pascal-kode utfører beregning på en stakk) koden utføres normalt (etter hverandre + jump, men beregninger g på stakk) push koder (= load på stakken): lod ; load value ldc ; load constant lda ; load adress 5 = a 2 12

P-kode II 13

P-kode for fakultets-funksjonen funksjonen 1 2 Blir typisk mange flere P-instruksjoner enn 3 TA-instruksjoner for samme program (Hver P-instruksjon har 4 maks én lager-adresse ) 5 1 2 3 4 5 6 7 8 9 6 7 8 9

Angivelse av P-kode ved attr.-grammatikk NB: Direkte eksekvering av denne er veldig upraktisk betyr: sette sammen til én instruksjon ++ betyr: sette sammen instruksjonsekvenser 15

Tenkt generering av P-kode etter attr.-gram. (Vil altså aldri gjøre det slik i praksis!) pcode = pcode = pcode = pcode = NB: Ny instruksjon: adr val pcode= pcode = val 16

Kodegenerering kan gjøres ved rekursiv gjennomgang av syntakstreet. Forslag til tre-node: Tre-node: OpKind Opcode = assign Navnet x ligger i noden Opkind Opcode = Plus IdKind ConstKind 17

Metode-skisse til generelt bruk ved rekursiv traversering av trær rekursivt kall rekursivt kall Prefiks - operasjoner Infiks - operasjoner Postfiks - operasjoner Generert kode for hele subtreet (ofte er flere av delene tomme): oppstarts-kode bergen v. operand fiks på v. operand beregn h. operand gjør operasjonen 18

Generering av P-kode fra tre-struktur (som i Oblig2) rek.kall rek.kall rek.kall Oversiktlig versjon: switch nodekind { Merk: Identifikator og case op-node: konstant-streng switch opkind { ligger i noden case + : { rek. kall for venstre subtre; rek. kall for høyre subtre; emit1 ( adi ); } case = : { emit2 ( lda, identifikator); rek. kall for venstre subtre; emit1 ( stn ); } } case konst-node { emit2 ( ldc, konstant-streng); } case ident-node { emit2 ( lod, identifikator); } }

Angivelse av TA-kode ved attr.-grammatikk 20

Tenkt generering av TA-kode etter attr.-gram. (Gjøres ikke slik i praksis) name : navn på variabelen der svaret ligger tacode = name = ; ; tacode = name = tacode = name = ; tacode = name = ; ; ; tacode = name = tacode = name = 21

Generering av rent tekstlig TA-kode fra tre-struktur Hoved-delen av en rekursiv metode. Metoden eksekverer inne i noden og leverer et navn eller en konstant-streng: switch nodekind { case op-node: switch opkind { case + : { tempnavn = nytt temporær-navn; opnavn1 = rek kall for venstre subtre; opnavn2 = rek kall for høyre subtre; emit ( tempnavn = opnavn1 + opnavn2 ); return (tempnavn); } case = : { varnavn = id. for v.s.-variabel (ligger i noden); opnavn = rek kall for venstre subtre; emit ( varnavn = opnavn ); return (varnavn); } } case konst-node node { return (konstant-streng); streng); } // Emitter ingenting! case ident-node { return (identifikator); } // Emitter ingenting! }

Fra P-kode til TA-kode ( Statisk simulering ) Stakkens stadier: P-kode: Ønskemål: 23

Fra TA-kode til P-kode - ved makro-ekspansjon Makro for: a = b + c Har tidligere sett kortere versjon: Ny versjon: 13 instr. Gml. ver. : 7 instr 24

Fra TA-kode til P-kode: litt lurere, men bare skisse Tegner opp data-flyt -grafen / treet t3 Prøver å lage bedre kode Må gjøre forskjell på temporære og program-variable. Kan da se det som: Generelt: En rettet graf uten løkker (DAG) Legg til instrusjonen: t3 = x + t2 Derved blir det generelt verre enn det ser ut her 25

Kap. 8.3 Detaljert aksess av datastruktur Trenger da mer instruksjoner til adresse-beregning TA-kode: To nye måter å adressere på P-kode: To nye instruksjoner & X Adressen til x (ikke for temporære) *t Indirekte gjennom t indirect load indexed address x 10 Sett inn 2 her 26

Aksessering av data i structer, objekter etc. Med slike instruksjoner kan vi lage TA-kode og P-kode for å aksessere lokale variable i structer, recorder, objekter etc. Vi ser imidlertid ikke på detaljene i dette rec 27

Litt generelt til kap. 8.3 I boka lages det nokså lavnivå TA-kode og P-kode Ulempe: Man kan da ikke lenger se hva slags språkkonstruksjoner den kommer fra. Vanskligere å optimalisere. Det er ikke opplagt at bokas variant er det fornuftigste. Alternativ f.eks: Beholde en ikke-lokal eller ikke-global variabel på formen: X: (rel.niv.=2, reladr=3) Istedenfor å oversette til formen: fp.al.al.(reladr=3) i TA-kode eller P-kode Kan kanskje like gjerne se oversettelse til lav-nivå TA-kode eller P-kode som eksempel på oversettelse direkte til maskin-kode Bortsett tt fra at vi her slipper register-allokerings-problemet i t 28

8.4 : If/while kap.8.3 Skisse av TA-kode Skisse av P-kode 29

while - setning TA-kode: Om det skjer et break inne i her skal det hoppes ut av while-setningen (til L2) (NB: Feil i det utdelte. Der stod det til L1 ) P-kode 30

Behandling av boolske uttykk Mulighet 1: Behandle som vanlige uttrykk Mulighet 2: Behandling ved kort-slutning Eksempel i C siste del beregnes bare dersom første del er sann: P-kode: Merk: Om dette uttrykket stod i sammenhengen: if <utr> then S1 else S2 b ldc a Trykkfeil i boka så kunne hoppet a til L1 gå direkte til else grenen og alt fra-og-med hoppet b kunne fjernes 31

Kode for if/while-setninger Tre-node: Angir bare false eller true binder sammen Ser noe merkelig ut når alle boolske uttrykk er konstanter: 32

Rekursiv prosedyre for P-kodegenerering for setninger (som i Oblig 2) Hit skal en break i kildeprogr. gå Rek. kall Rek. kall Kode for S Rek. kall Rek. kall Rek. kall 33

Rekursiv prosedyre for P-kodegenerering for setninger, penere utgave. Hit skal en break i kildeprogrammet gå Om man kommer til break skal man void gencode(treenode t, String label){ gå ut av nærmete omsluttende while- String lab1, lab2; setning (angitt av label-parameteren) if t!= null{ // Er vi falt ut av treet? switch t.kind { case ExprKind { // I boka (forrige foil) er det veldig forenklet. // Kan behandles slik uttrykk er behandlet tidligere } case IfKind { // If-setning gencode(t.child[0], label); // Lag kode for det boolske uttrykket lab1= genlabel(); emit2( fjp, lab1); // Hopp til mulig else-gren, eller til slutten av for-setning gencode(t.child[1], label); // kode for then-del, gå helt ut om break opptrer (inne i uttrykk??) if t.child[2]!= null { // Test på om det er else-gren? lab2 = genlabel(); emit2( ujp, lab2); // Hopp over else-grenen } emit2( label, lab1); // Start på else-grenen, eller slutt på if- setningen if t.child[2]!= null { // En gang til: test om det er else-gren? (litt plundrete programmering) gencode(t.child[2], label); // Kode for else-gren, gå helt ut om break opptrer emit2( lab, lab2); // Hopp over else-gren går hit } } case WhileKind { /* mye som over, men OBS ved indre break. Se boka og forrige foil */ } case BreakKind { emit2( ujp, label); } // Hopp helt ut av koden dette gencode-kallet lager // (og helt ut av nærmest omsluttende while-setning) } } } 34