Kap. 8 kodegenerering INF april, 2009

Like dokumenter
Kap. 8 del 1 kodegenerering INF april, 2008

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

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

INF og 13. april, Stein Krogdahl, Ifi UiO

Stein Krogdahl, Ifi UiO

INF april, 2015 Kap. 8 kodegenerering. Del 2

INF april, 2013 Kap. 8 kodegenerering

INF og 23. april, 2014 Kap. 8 kodegenerering

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

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

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

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

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

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

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, 12. mai, 2015

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

Litt om Javas class-filer og byte-kode

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

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

INF mai 2014 Stein Krogdahl, Ifi, UiO

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)

Runtimesystemer Kap 7 - I

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)

MED SVARFORSLAG UNIVERSITETET I OSLO

Runtime-omgivelser Kap 7 - I

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

Semantisk Analyse del I

UNIVERSITETET I OSLO

Runtimesystemer Kap 7 - I

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

Del 1 En oversikt over C-programmering

Introduksjon til DARK assembly

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

Generiske mekanismer i statisk typede programmeringsspråk

UNIVERSITETET I OSLO

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

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

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 )

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

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

Forelesning Instruksjonstyper Kap 5.5

Hovedstoffet i kap 4: 16. Februar Ifi, UiO

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

INF Oblig 2 semantikksjekk og kodegenerering

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

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

UNIVERSITETET I OSLO

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

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

Forelesning Datatyper Kap 5.2 Instruksjonsformat Kap 5.3 Flyttall App B

Statisk semantisk analyse - Kap. 6

Velkommen til INF Kompilatorteknikk

Statisk semantisk analyse - Kap. 6

Velkommen til INF5110 Kompilatorteknikk

INF5110. Oblig 2 presentasjon

INF5110 V2012 Kapittel 4: Parsering ovenfra-ned

Programmeringsspråket C Del 3

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

UNIVERSITETET I OSLO

MED SVARFORSLAG UNIVERSITETET I OSLO. Det matematisk-naturvitenskapelige fakultet

INF 1000 høsten 2011 Uke september

INF1000 undervisningen INF 1000 høsten 2011 Uke september

Programmeringsspråket C Del 3

Programmeringsspråket C Del 3

Programmeringsspråket C Del 3

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

Del 4 Noen spesielle C-elementer

Dagens tema. Mer MIPS maskinkode. Maske-operasjoner Skift-operasjoner Lesing og skriving Pseudo-instruksjoner Mer om funksjonskall Registeroversikt

Anatomien til en kompilator - I

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

Velkommen til INF Kompilatorteknikk

Velkommen til INF Kompilatorteknikk

Kap. 5, Del 2: INF / (og 2/3 og 3/3)

Dagens tema: 12 gode råd for en kompilatorskriver

Anatomien til en kompilator - I

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

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen Oppsummering

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

Kap. 5, Del 2: SLR(1), LR(1)- og LALR(1)-grammatikker INF /2-2011

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

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

Semantikk. Dagens tema Kjøresystemer (Ghezzi&Jazayeri 2.6, 2.7) Semantikk. Semantikk. En måte å svare på: gi semantikken til språket!

Oversikt. Introduksjon Kildekode Kompilering Hello world Hello world med argumenter. 1 C programmering. 2 Funksjoner. 3 Datatyper. 4 Pekere og arrays

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

INF3110 Programmeringsspråk. Dagens tema. Typer (Kapittel 3 frem til ) Innføring i ML (Kapittel & ML-kompendiet.) 1/19

Typer. 1 Type: boolean. 2 Verdimengde: {true, false} 3 Operatorer: NOT, AND, OR... 1/19. Forelesning Forelesning

Dagens tema: Kjøresystemer II

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

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

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

ITPE/DATS 2400: Datamaskinarkitektur og Nettverk

Datatyper og typesjekking

Transkript:

Kap. 8 kodegenerering INF5110 21. april, 2009 Stein Krogdahl, Ifi UiO Forelesninger framover: Torsdag 23. april: 1 time kapittel 8, 1 time Oblig 2 Tirsdag 28. april: Oppgaver kapittel 7, kapittel 8 + 1

Pensumoversikt - kodegenerering Helt sikkert pensum: 8.1 Bruk av mellomkode 8.2 Basale teknikker for kode- generering 8.3 Kode for referanser til datastrukturer (ikke alt) 8.4 Kode for generereing for kontroll-setninger og logiske uttrykk Kanskje også noe fra: 8.5, 8.9 og 8.10 Samt: Oppkopiert: 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! 2

Hvordan er instruksjonene i en virkelig CPU? Ofte: Et antall Registere (8-128) hvor add, mult, sub, shift... går mellom disse Men på noen maskiner også disse opersjoner til/fra memory Alltid load og store fra register til/fra memory Base- og indeks-registre (spesielle registre, eller alle kan være det) En instruksjon brytes ned i en rad mikro-instruksjoner Viktig: 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. 3

Intel Utviklet fra 8bit-16bit-32bit. Nå også 64 bit. Variabelt format 722-sider manual noen hundre instr. 4

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 data og instr. 12-512 kb 2-3 cache L2 0.5-2Mb 10-15 cache L3 noen Mb? (Itanium) 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 Det kreves masse logikk for å få dette til å virke (assosiativ aksess) Om det er flere kjerner på CPUen blir det ekstra ille (lager-koherens) 5

8.1 Bruk av mellomkode Man kan veldig godt generere maskinkode direkte fra syntakstreet 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 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? Er det operasjoner for array-aksess (eller blir dette løst opp i flere, enklere operasjoner?) 6

Vi skal se på en del oversettelser: Vi skal først se på følgende: Generering av TA-kode ut fra tre-strukturen 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 Dette kan også sees som eksempel på enkel generering av maskinkode Men da uten å ta hensyn til registerallokering 7

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 x goto L label L read x write x 8

Oversettelse til treadresse-kode 1 2 3 4 5 6 7 8 9 Spørsmål: -Er det egne instruksjoner for int, long, float,..? -Hvordan er variable representert? -ved navn -peker til deklarasjon i symb.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 9

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

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

P-kode II 12

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

Angivelse av P-kode ved attr.-grammatikk 14

Tenkt generering av P-kode etter attr.-gram. (Vil aldri gjøre det slik i praksis!) pcode = pcode = pcode = pcode = num ad val pcode= pcode = num val 15

Kodegenerering kan gjøres ved rekursiv gjennomgang av syntakstreet. Forslag til tre-node: Tre-node: Opcode= = Opcode= + IdKind ConstKind 16

Metode-skisse til generelt bruk rekursivt kall rekursivt kall Prefiks - operasjoner Infiks - operasjoner Postfiks - operasjoner Generert kode (ofte er flere av delene tomme): oppstarts-kode bergen v. operand fiks på v. operand beregn h. operand gjør operasjonen 17

Generering av P-kode fra tre-struktur (som i Oblig2) rek.kall rek.kall rek.kall Oversiktlig versjon: switch nodekind { Merk: Identifikator case op-node: og 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 19

Tenkt generering av TA-kode etter attr.-gram. (Gjøres ikke slik i praksis) tacode = name = ; ; tacode = name = tacode = name = tacode = name = ; ; ; ; tacode = name = tacode = name = 20

Generering av rent tekstlig TA-kode fra tre-struktur Hoved-delen av en rekursive metode. Metoden leverer et navn: 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 { return (konstant-streng); } case ident-node { return (identifikator); } }

Fra P-kode til TA-kode ( Statisk simulering ) Stadier: P-kode: Stakk: Ønskemål: 22

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 23

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

Kap. 8.3 Aksess av datastruktur, trenger mer fleksibel 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 25

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 26

Litt generelt til kap. 8.3 I boka lages det nokså lavnivå TA-kode og P-kode Man kan ikke lenger se hva slags språk-konstruksjoner den kommer fra Det er ikke opplagt at bokas variant er det fornuftigste om mellom-koden skal oversettes videre til maskin-kode, 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 men vi får da ikke register-allokerings-problemet 27

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

while - setning TA-kode: Om det skjer et break inne i her skal det hoppes ut av while-setningen (til L1) P-kode 29

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 så kunne hoppet a til L1 gå direkte til else grenen og alt fra-og-med hoppet b kunne fjernes Trykkfeil i boka 30

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: 31

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 32

Rekursiv prosedyre for P-kodegenerering for setninger, penere utgave. Hit skal en break i kildeprogrammet gå void gencode(treenode t, String label){ String lab1, lab2; 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 } } } Om man kommer til break skal man gå ut av nærmete omsluttende whilesetning (angitt av label-parameteren) 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) 33