INF okt. 2004

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

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

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

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

Dagens tema: 12 gode råd for en kompilatorskriver

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

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

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

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

Velkommen til INF2100

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

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

Velkommen til INF2100 Jeg er Dag Langmyhr

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

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

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)

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

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

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

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

Obligatorisk oppgave 1 INF1020 h2005

Obligatorisk oppgave 2 - inf

Del 4 Noen spesielle C-elementer

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

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

Obligatorisk Innlevering 2

INF Oblig 2 semantikksjekk og kodegenerering

Dagens tema: Sjekking

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

INF Noen oppgaver til kap. 8

INF mai 2014 Stein Krogdahl, Ifi, UiO

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

INF 1000 høsten 2011 Uke september

INF1000 undervisningen INF 1000 høsten 2011 Uke september

UNIVERSITETET I OSLO

IN 147 Program og maskinvare

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

2 Om statiske variable/konstanter og statiske metoder.

INF5110. Oblig 2 presentasjon

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen Oppsummering

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

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

Oppsummering Assemblerkode Hopp Multiplikasjon Kode og data Array Oppsummering

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

INF1000 : Forelesning 4

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

UNIVERSITETET I OSLO

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

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

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

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

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

Oblig 2 - Simpila. INF Kompilatorteknikk. Våren Typesjekking, sjekking av bruk av navn og blokkstrtuktur i språk.

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

Datatyper og typesjekking

INF Noen oppgaver til kap. 8

Datatyper og typesjekking

EKSAMEN 6108/6108N PROGRAMMERING I JAVA Alt trykt og skriftlig materiale.

Dagens tema. C-programmering. Nøkkelen til å forstå C-programmering ligger i å forstå hvordan minnet brukes.

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

INF1000: Forelesning 4. Mer om arrayer Metoder

Del 1 En oversikt over C-programmering

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

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

INF1000: noen avsluttende ord

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

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

Ordliste. Obligatorisk oppgave 1 - Inf 1020

2 Om statiske variable/konstanter og statiske metoder.

Semantisk Analyse del III

UNIVERSITETET I OSLO

I dag. Rep: Oppsummering - variabler. Rep: Datatyper. INF1000 (Uke 3) Mer om uttrykk, terminal I/O, forgreninger

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

Datatyper og typesjekking

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

Kap. 8 del 1 kodegenerering INF5110 Vår2007

Programmeringsspråket C

Tre måter å lese fra terminal. Java 4. Eksempel. Formatert utskrift til skjerm

Datatyper og typesjekking

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

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

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

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

Forelesning inf Java 5

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen

Forelesning inf Java 5

Litt mer om uttrykk: ++ og -- INF1000 : Forelesning 4. Oppgave. Blokker. 0 udefinert udefinert. Alternativ 2 Postfiks-operator

INF1000: Forelesning 7

Beskrivelse av programmeringsspråket Simpila INF Kompilatorteknikk Våren 2012

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

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

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

EKSAMEN med løsningsforslag

INF Uke 10. Ukesoppgaver oktober 2012

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

Gjøre noe i hele treet = kalle på samme metode i alle objekten. Java datastruktur Klassestruktur

Transkript:

INF 2100 20. okt. 2004 Dette er siste forelesning. Dagens tema: Diverse om kode-generering: Litt om uttrykk, betingelser og while-setninger Prosedyrer og kall Gruppene ukene fremover: Ukene fra 25. okt. og fra 1. nov.: Lite eksplisitte oppgaver, men mye egenarbeid og gjennomgang etter gruppas ønske Ukene fra 8. nov. og fra 15. nov.: Gruppelærerne er til stede ved starten av gruppetiden, for spørsmål, inn- og utlevering De er til stede minst et kvarter, men vil ellers gå når det ikke er mer spørsmål etc. Pass på å komme i gang med Del-2. Mye hjelp på gruppene! Frist mandag 8. november. Den vil bli håndhevet strengt. Ekstra til levering av Del-2: Skrive en liten rapport ut fra noen spørsmål/punkter som blir lagt ut i god tid. Intervju for å sjekke at det er egenhendig arbeid Utplukk for intervju bekjentgjøres senest: Fredag 12. november, kl 12.00, på kurssiden Alle må da sjekke på kurssiden Og eventuelt bekrefte at forslått tid er OK (eller søke om annen tid) Vi setter opp forslag til tid, fortrinnsvis 15., 16 og 17. nov. (ca 1/2 time) Gruppelærer og kursleder er til stede Alle på laget skal kunne angi en rimelig del som de har vært med å lage Vi stiller spørsmål etc. som skal være helt greie om dere har gjort arbeidet selv Ingen godkjenning er endelig før alle intervjuene er foretatt! 2 Hoved-ansv. Kodegenerator Tregenerator void lagkode() innk utk Oversiktsbilde Listing-ansv. lagsti( A, C) lagcic( A, C) nesteinstadr() nesteinst resvar(ant, navn) Flink-repr. Instr-lager nesteledig Kodegenerator Hva tilbyr Flink-representanten utad? void lagkode() innk utk lagsti( A, C) nesteinstadr() resvar(ant, navn) reskonst(verdi) Flink-repr.? fyllgammeladr(instnr, nyadr) startopp() avslutt() skrivflok() reskonst(verdi) fyllgammeladr(instnr, nyadr) Kodegeneratoren skal være distribuert til tre-nodene To typer testutskrift: - K (start/slutt kodegen-metodene) - I (genererte instruksjoner m.m.) skrivflok() Flokfil Et antall metoder som gjør at Kode-generatoren ikke behøver å tenke på detaljer under veis (skal være en god sekretær for kodegenereringen) Kan tenke på en radio: Hvilke knotter og visere er de rette? Må tenke gjennom hvilke behov Kode-generatoren får Disse må dekkes på en effektiv og naturlig måte Og slik at de passer sammen, også stilmessig og navnemessig Vi gjerne naturlig bli delt opp i grupper Skal kunne beskrives i begreper som kodegeneratoren tenker i. Flokfil

Sentrale metoder i Flink-representanten void lagldi(int A, int C) int F = 1; < Øk IL_ledig", og sjekk at det er plass til en instr. til >; // Sett instruksjonen ned i lageret: func[il_ledig] = F; adr[il_ledig] = A; corr[il_ledig] = C; < Kall passelig metode i Listing-ansv. for I-testutskrift >; Osv. for alle de andre instruksjonene int nesteinstadr() leverer verdien av IL_ledig" int resvar(int ant, String navn) // Denne reserverer "ant" celler i heltallslageret (ved å // Øke HL_ledig". Sjekke at det er plass nok. // Leverer adr. til (første) cellen. // Parameteren "navn" er bare med for I-testutskriften // Skal gi I-testutskr. med: HL_ledig", "ant" og "navn" int reskonst(int verdi) // Denne reserverer en celle i heltallslageret, fyller den med // den angitte verdien, og lever adr. til cellen. // Skal sjekke at det er plass nok. // Skal gi I-testutskr. med: HL_ledig" og "verdi" void fyllgammeladr(int instnr, int nyadr) // Skal fylle instruksjon nr "instnr" med adressedel "nyadr" // Skal gi I-testutskr. med: "instnr" og "nyadr" Gjøres i en felles metode i Flink-repr.? Merk forskjellen i eventuell plassering Kan også godt lage egne hjelpe-metoder: Disse kan mest natulig være felles for alle nodene i treet Altså, de deklareres static i ytterste trenodeklasse Et eksempel kan være: static void lagaropinst(string arop, int adr, int corr) Dekl: Rep: Behandling av variabel-deklarasjoner navn: U Enkel/ array? fdekl navn: Q DS SS DeklSekv VarDekl Enkel/ array? VarDekl-klassen må utvides med variabel (for eksempel celleno ) Angir hvilken celle den har fått tildelt i heltalls-lageret (første tildelte celle, om det er array) Inne i VarDekl: Instr-lager void lagkode( ) <K-test-inn>; if (<det er array>) celleno = flinkrepr.resvar(<antall celler til arrayen>, navn); else celleno = flinkrepr.resvar(1, navn); <K-test-ut>; Forandringer i gamle deler av kompilatoren Forandringer i Hoved-ansvarlig: Ved innlesning av parameterne: Full parameter-sekvens til kompilatoren: <prog-fil> <flok-fil> <listing-fil> <hvilke testutskr.> <maxinst> <maxint> De to første parameterene må oppgis maxinst er lengden av inst-lageret og maxint er lengden av heltallslageret Om ikke oppgitt skal disse ha verdien 1000 Parametere man ikke vil oppgi angis ved - (eller blank, om de er på slutten) Ved oppsetting av modul-objektene: Også Kode-generator og Flink-representant må skapes Flink-representanten skal ved oppstart også få maxinst og maxint. Igangsetting: Også kodegenereringen må settes i gang: tregen.lesprogr(); // Var der i Del 1 kodegen.oversett(); // Ny i Del 2 Oversettelsen skal bare startes dersom Minila-program OK Dette går automatisk dersom man har vanlig struktur (og ikke bruker softerror ) Merk: Det kan også komme feilmeldinger fra Del 2 (f.eks. for liten plass ) Forandringer i gamle deler av kompilatoren (forts.) Ekstra variabel i deklarasjons-nodene: For dekl. av variable/arrayer/parametere: En variabel (f.eks. cellenr ) som inneholder adresse til reservert(e) celle(r) For proseyre-deklarasjoner: En variabel (f.eks. startadr ) som inneholder adresse til første instruksjon Utvide Listing-ansvarlig Med apparat for å ta seg av K- og I-testutskrift Ny metode i Tre-generatoren Som Kode-generatoren kan kalle for å få (peker til roten av) treet Utvide mengden av statiske felles-variable (og metoder?) for treet: Den eneste nye er antakeligvis peker til Flink-representanten Må også legges til i oppstart-metoden for treet (som setter disse variablene) Mange av de som er der fra Del 1 er også viktige i Del 2 Kanskje skal også xbet og xin være slike variable (se nederst side 106)

Oversettelse av uttrykk (mye på gruppene) SETI 7 0 ADDI x 0 MULI 5 0 7 + x * 5 - inint * z[5] / z[x] et 0 1 2 3 4 Res. for x Res. for z 5 + Y[3] * inint / X Til de tilsvarende deklarasjoner (Variabel). Se tabell 5.2 og 5.3 arop: null Konstant verdi: 5 arop: + Variabel navn: Y indeks: 3 arop: * Inint arop: / Variabel indeks: - CIC - - INI - - STI xin 0 CCI - - SUBI xin 0 SETC 5 0 MULI z 1 LDC x 0 DIVI z 1 5 maxint-1 I klassen: class Variabel extends Ledd void // NB: K-testutskrift ikke antydet her if (<det er enkel variabel>) if (arop == null ) FlinkRepr.lagLDI (deklarasjon.celleno, 0); else if ( arop.equals ( + ) ) lagaddi else if ( arop.equals ( / ) ) lagdivi else <det er noe inkonsistent i trestrukturen>; else < Behandling av indekserte variable >; Betingelser og while-setning lagkode i betingelse while a + 2 <= b / c do x:= a * b ; if x > 8 then x:= x + a; endif; endwhile; Betingelse Relop: <= U1 U2 nestesetn While-setning BET SS Setekv fs IfSetn Instruksjons-lager STI xbet SUBI xbet JLTI? JMP void lagkode() <K-testutskrift-inn>; <LAG kode for U1>; // Altså f.eks.: U1.lagKode() <LAG: (STI, xbet, 0) >; // Altså f.eks.: flinkrepr.lagsti(xbet, 0) <LAG kode for U2>; <LAG: (SUBI, xbet, 0) >; if (relop.equals( = )) flinkrepr.lagjnei( -1, 0 ); else if (relop.equals( =/= )) flinkrepr.lagjeqi( -1, 0 ); else if (relop.equals( <> ) ) flinkrepr.lagjeqi( -1, 0 ); else if (relop.equals( )) flinkrepr.lagj??i ( -1, 0 ); else if (relop.equals( >= )) flinkrepr.lagjgti( -1, 0 ); else <Intern-feil: noe feil med verdiene>; Se Tabell 5.7, side 44 Kunne eventuelt lage en hjelpe-metode av dette, men den ville bare bli kalt herfra. // Angående flinkrepr.lagjxxi ( -1, 0) : Foreløpig ukjent adresse-del, fylles inn siden. // Beskjed fra betingelse til kalleren: // - Hoppinstruksjonen uten adressedel er siste instruksjon jeg laget a + 2 b / c <K-testutskrift-ut>;

void lagkode() <K-testutskrift-inn>; int startadr = flinkrepr.nesteinstadr(); lagkode i while-setningen <LAG: kode for betingelsen BET>; int jmpsted = flinkrepr.nesteinstadr() - 1; // Instruksjonen som mangler adresse <LAG: kode for setningssekvensen SS>; <LAG: (JMP, startadr, 0)>; // Nå kjenner vi riktig adresse for uthoppet i betingelsen: flinkrepr.fyllgammeladr(jmpsted, flinkrepr.nesteinstadr() ); <K-testutskrift-ut>; DeklSekv fdekl VarDekl navn: navn: Y Prosedyredeklarasjon og call-setning navn: U proc P in x out y; var u; proc Q; endproc; begproc u:= x+1; call Q; endproc; call P with a+b into c; navn: P startadr: DS inpar outpar SS navn: Q ProcDekl P CallSetn with into a +b navn: Setekv fs c CallSetn Svært likt venstresiden i tilordning, bruk samme klasse. Instruksjons-lager STC P.retAdr STI X LDI Y LDC P.retAdr JMP 0 1 JRC STI c P.retAdr X Y U 14 void lagkode( ) lagkode i ProcDecl // Variabel som husker adresse til lokasjonen for returadressen (ret<p> i Tab. 5.10): int retlok = flinkrepr.resvar(1, <prosedyrens navn> ); // Reservering av slik lokasjon <Lag kode for deklsekvensen DS>; // NB: Behandler også eventuelle parametere (samt lager kode for indre prosedyrer). startadr = flinkrepr.nextinstadr(); // x<p>. NB: startadr er lokal i ProcDekl-klassen <LAG: (STC, retlok, 0)>; if (inpar!= null) <LAG: (STI, inpar.celleno, 0)>; <Lag kode for setningssekvensen SS>; if (outpar!= null) <LAG: (LDI, outpar.celleno, 0)>; <LAG: (LDC, retlok, 0)>; // Vil hente returadressen <LAG: (JMP, 0, 1)>; // Vil hoppe tilbake til returadressen 15 lagkode i CallSetn class CallSetn extends Setning with; Variabel into; // Klassen Variabel : Som for venstre-side i tilordning. void if (with!= null) with.; // Beregner uttrykket til I-reg. < LAG: (JRC, deklarasjon.startadr, 0) >; // Denne gjør selve kallet if (into!= null) into.; // For enkel variabel a, lag: (STI a 0) 16

Litt om uttesting av Del-2 Burde ikke være verre å teste ut enn Del 1, men litt annerledes Veldig indirekte, ved at det er den produserte koden som skal utføres riktig Dermed kan det være vanskelig å tenke fra utførelsesfeil i Flink tilbake til virkelig feil I-testutskrift er spesielt nyttig Ta gjerne også I-testutskrift av testprogrammet med den ferdige kompilatoren Slike kan generelt være fine å studere, til ettertanke angående alt som skal gjøres (Merk dog at i denne gjøres reservasjon av xbet og xin på et merkelig tidlig tidspunkt) Ta én og én setningstype, og få dem til å fungere riktig F.eks.: Først må de enkleste deklarasjoner bli behandlet riktig Deretter: ning med enkle uttrykk og variable Helt til slutt: Alt med prosedyrer og kall Om feil er vanskelig å finne, husk: Alt kan være galt (også test-utskriftene) Ta f.eks. ut P-testutskrift og sjekk at tidligere deler er OK Sammenlikn med I-testutskrift fra den ferdige kompilatoren Sjekk også at det som kommer inn i Flink-maskinen (xflink) er det fra I-testutskriften 17