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

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

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

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

Velkommen til INF2100

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

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

Dagens tema: 12 gode råd for en kompilatorskriver

Velkommen til INF2100 Jeg er Dag Langmyhr

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

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

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

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

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

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

INF okt. 2004

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

INF 1010, vår 2005 Løsningsforslag uke 11

INF1010 våren 2017 Onsdag 25. januar. Litt om unntak i Java

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

Dagens tema: Sjekking

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)

INF1010 våren 2019 Onsdag 30. januar. Mer om unntak i Java (med litt repetisjon av I/O først)

Programmering Høst 2017

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

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

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

Jentetreff INF1000 Debugging i Java

INF 1000 høsten 2011 Uke september

INF1000 undervisningen INF 1000 høsten 2011 Uke september

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

INF1000: Forelesning 7

INF1000: Forelesning 7. Konstruktører Static

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

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

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen Oppsummering

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

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

TDT4110 Informasjonsteknologi, grunnkurs Uke 35 Introduksjon til programmering i Python

Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

INF1000 : Forelesning 4

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

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen

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

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

Del 3: Evaluere uttrykk

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

Lenkelister. Lister og køer. Kopi av utvalgte sider fra forelesningen.

2 Om statiske variable/konstanter og statiske metoder.

Dagens tema INF1070. Vektorer (array er) Tekster (string er) Adresser og pekere. Dynamisk allokering

INF1000 oppgaver til uke 38 (17 sep 23 sep)

Uke 8 Eksamenseksempler + Ilan Villanger om studiestrategier. 11. okt Siri Moe Jensen Inst. for informatikk, UiO

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

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

Fra Python til Java, del 2

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

Obligatorisk Innlevering 2

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

Programmeringsspråket C

Forelesning inf Java 4

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

Videregående programmering 6

Eks 1: Binærtre Binærtretraversering Eks 2: Binærtre og stakk

IN 147 Program og maskinvare

1. Rullende navn, s 3 2. Smilefjes, s 5 3. Skritteller, s 7 4. Orakel, s 9 5. Stein, saks og papir, s Kompass, s 14

INF1000: noen avsluttende ord

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

Oversikt Kompilering Syntaksanalyse Java Feilsjekking Oppsummering

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

Java PRP brukermanual

Seminaroppgaver IN1010, uke 2

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

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

Dagens tema Kapittel 8: Objekter og klasser

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

Dagens tema INF2270. Cs preprosessor. Separat kompilering av C funksjoner. C og minnet. Dag Langmyhr,Ifi,UiO: Forelesning 5. februar 2007 Ark 1 av 15

Programmering i C++ Løsningsforslag Eksamen høsten 2005

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

INF1010 våren 2018 tirsdag 23. januar

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

Dagens tema: Enda mer MIPS maskinkode

Debugging. Tore Berg Hansen, TISIP

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

Kodetime for Nordstrand barneskole

Dagens tema: Mer av det dere trenger til del 1

"behrozm" Oppsummering - programskisse for traversering av en graf (dybde først) Forelesning i INF februar 2009

INF1000: Forelesning 4. Mer om arrayer Metoder

INF1000: noen avsluttende ord

Forelesning inf Java 5

Forelesning inf Java 5

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

Viktig. Rettet i koden. Obligatorisk oppgave 2 Litt flere detaljer om semantikksjekk og kodegenerering. Semantikksjekk

UNIVERSITETET I OSLO

Feilmeldinger, brukerinput og kontrollflyt

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

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

Hvis en person har inntekt < , så betaler han 10% skatt på alt, og ellers betaler han 10% skatt på de første og 30% på resten.

Hvis en person har inntekt < , så betaler han 10% skatt på alt, og ellers betaler han 10% skatt på de første og 30% på resten.

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

Transkript:

Hvordan skrive Flok og Flass kode? I mange tilfelle er det svært enkelt: inchar INC inint INI Tegnet eller tallverdien kommer i I registeret. outchar OUTC outint (n) OUTI n outline OLIN I Flink maskinen blir dette: Func Adrs Corr 0 1 0 ISTORE 1 7 1 0 0 A 2 21 5 1 0 B 3 2 0 Tegnet eller tallet må først ligge i I registeret. Dag Langmyhr,Ifi,UiO: Forelesning 5. september 2006 Ark 2 av 22 Dag Langmyhr,Ifi,UiO: Forelesning 5. september 2006 Ark 4 av 22 Dagens tema: Hvordan skrive Flass og Flok kode? «én til én oversettelse» uttrykk løkker array er prosedyrer Prosjektet struktur del 0 feilhåndtering Dag Langmyhr,Ifi,UiO: Forelesning 5. september 2006 Ark 1 av 22 Uttrykk Uttrykk er også ganske lette å oversette (siden det skal skje fra venstre mot høyre og vi ikke har parenteser): A := A * B + 5 blir til LDI A MULI B INCI 5 STI A A INTG 0 B INTG 0 Dag Langmyhr,Ifi,UiO: Forelesning 5. september 2006 Ark 3 av 22

I Flink maskinen blir dette: Func Adrs Corr 0 1 0 1 7 2 2 5 1 3 2 0 ISTORE 0 0 A 1 0 B 2 7 Syv Forenkling Koden på forrige lysark kunne vært skrevet med færre instruksjoner. Det skal vi ikke gjøre i dette kurset! Det aller viktigste er at koden er riktig. Optimalisering i en kompilator er altfor komplisert for dette kurset. Dag Langmyhr,Ifi,UiO: Forelesning 5. september 2006 Ark 6 av 22 Dag Langmyhr,Ifi,UiO: Forelesning 5. september 2006 Ark 8 av 22 Men hva med A := A * 7 + B når vi bare kan multiplisere med verdier i minnet? Da må vi lagre 7 i minnet: LDI A MULI Syv ADDI B STI A A INTG 0 B INTG 0 Syv INTG 7 Løkker I løkker må vi hoppe utifra en test: repeat A := A + 1; until A >= 10; Hvordan beregner vi betingelsen? Vi bør i stedet beregne A 10 og sjekke om resultatet er 0. Vi skal hoppe når testen er usann. L LDI A INCI 1 STI A LDI A INCI 10 JLTI L Dag Langmyhr,Ifi,UiO: Forelesning 5. september 2006 Ark 5 av 22 Dag Langmyhr,Ifi,UiO: Forelesning 5. september 2006 Ark 7 av 22

Løsningen I Flink brukes følgende løsning: #! /store/bin/flass Data 0: 4 arr INTG 4 Data 1: IARZ 4 Code 0: 22 2 0 start SETC 2 Code 1: 1 0 1 LDI arr * Code 2: 21 1 0 INCI 1 Code 3: 2 0 1 STI arr * Code 4: 0 0 0 STOP For å kalle en prosedyre, hopper man til den med instruksjonen JRC som legger PC registeret i C registeret før den hopper. Ved return hopper man tilbake JMP 0 * (Nesten alltid må man gjemme unna verdien i C registeret mens man utfører innmaten i prosedyren.) Parameter og returverdi overføres i I registeret. Dag Langmyhr,Ifi,UiO: Forelesning 5. september 2006 Ark 10 av 22 Dag Langmyhr,Ifi,UiO: Forelesning 5. september 2006 Ark 12 av 22 Array er Hvordan kan vi bruke array er? C registeret Til hjelp for dette har vi C registeret som brukes slik: ❶ Plassér indeksen i C registeret. ❷ Bruk så LDI arr * Stjernen indikerer at den virkelige adressen får man ved å legge sammen C registeret og adressen til arr. Prosedyrer Hvordan programmerer man prosedyrer? Man trenger: ❶ En måte å hoppe til prosedyren ❷ En måte å komme tilbake ❸ Mulighet for å overføre parameter og returverdi Dag Langmyhr,Ifi,UiO: Forelesning 5. september 2006 Ark 9 av 22 Dag Langmyhr,Ifi,UiO: Forelesning 5. september 2006 Ark 11 av 22

Den tilsvarende koden i Flass kan se slik ut: start OUTT Skriv # outtext "Skriv et tall: "; INI # a := inint; JRC p # call p with a into a; OUTT Svaret # outtext "Svaret er "; OUTI 1 # outint(1) a; OLIN # outine; STOP # proc p: p JGEI px # if a < 0 then STI pa # SETI 0 # a := 0 a; SUBI pa # endif; px JMP 0 * # «Hopp tilbake» pa INTG 0 Skriv ITXT "Skriv et tall: " Svaret ITXT "Svaret er " (men denne koden er optimalisert og en god del kortere enn den koden vår kompilator skal lage!) Vår struktur Minila Tegngenerator Linjegenerator Symbolgenerator Flinkrepresentant Listing Del 0 Del 1 Del 2 Flok Hovedansvarlig Tregenerator Kodegenerator Listeansvarlig Dag Langmyhr,Ifi,UiO: Forelesning 5. september 2006 Ark 14 av 22 Dag Langmyhr,Ifi,UiO: Forelesning 5. september 2006 Ark 16 av 22 Eksempel Her er et enkelt program med en prosedyre som beregner absoluttverdien av et tall: prog proc p in a out b; begproc if a < 0 then b := 0 a; else b := a; endif; endproc; var a; begprog outtext "Skriv et tall: "; a := inint; call p with a into a; outtext "Svaret er "; outint(1) a; outline; endprog Prosjektet Hvordan skriver man et større program som en kompilator? Struktur En fornuftig måte å dele opp problemet på er å se på hvor data flyter. Da er det enklere å kapsle inn deler av programmet. Dag Langmyhr,Ifi,UiO: Forelesning 5. september 2006 Ark 13 av 22 Dag Langmyhr,Ifi,UiO: Forelesning 5. september 2006 Ark 15 av 22

Linjegenerator leser programmet linje for linje og fjerner kommentarer. Tegngenerator deler linjen opp i enkelt tegn. Symbolgenerator setter tegnene sammen til symboler: prog begprog outtext "Hei på deg!" ; outline ; endprog Feil Hva gjør man med feil? Før prøvde man å finne så mange feil som mulig. Vi skal stoppe med melding ved første feil. Målet er å gi en så god melding at feilen er lett å lokalisere. Dag Langmyhr,Ifi,UiO: Forelesning 5. september 2006 Ark 18 av 22 Dag Langmyhr,Ifi,UiO: Forelesning 5. september 2006 Ark 20 av 22 Del 0 En kompilator kan lese og tolke en program tegn for tegn, men det er mye lettere om det kan gjøres symbol for symbol. Dette ordner en scanner. Anta at programmet er prog begprog Skriv en hilsen: outtext "Hei på deg!"; outline; Det var det. endprog Kommunikasjonen Følgende prinsipper brukes: Hvert objekt har en peker til de andre objekter den trenger. Hvert objekt har sin «nåværende informasjon» i lokale variable som stort sett er usynlige utenfra. Hvert objekt kaller «forgjengeren i kjeden» for å få det til å hente frem neste dataelement. Det blir tilgjengelig enten i returverdien eller i en variabel i objektet. Dag Langmyhr,Ifi,UiO: Forelesning 5. september 2006 Ark 17 av 22 Dag Langmyhr,Ifi,UiO: Forelesning 5. september 2006 Ark 19 av 22

I vår kompilator bruker vi denne metoden: // <<<<<<<<<<<<<<<<<<<<<<< MinilaException >>>>>>>>>>>>>>>>>>>>>>> // Dette brukes for å føre kontrollen fra mainresp.error(...) og ut // av programmet (til shutdown kallene lenger ned). class MinilaException extends RuntimeException {} // ********* Metode for standard behandling av feil ****** // public void error (String message) { //## Få tak i line og linjenummer fra CharacterGenerator, og skriv ut //## til skjerm (ved f.eks. "System.err.println(...)") //## Skriv ut på skjermen: " ***FEIL: message " //## Be også ListingResponsible å skrive ut feilmeldingen throw new MinilaException(); // Fanges i metoden "compile" over. } Dag Langmyhr,Ifi,UiO: Forelesning 5. september 2006 Ark 22 av 22 Unntak Vår hovedmekanisme for feilhåndtering er unntak («exceptions»). Deklarasjon Unntak er vanlige klasseobjecter: new Exception() Å gjøre unntak Unntak «kastes»: throw new exception() Mottak Unntak kan tas imot: try {... } catch (Exception e) {... } Unntak kan følge metodekall bakover inntil de blir fanget opp. Dag Langmyhr,Ifi,UiO: Forelesning 5. september 2006 Ark 21 av 22