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

Like dokumenter
Obligatorisk Innlevering 2

INF Oblig 2 semantikksjekk og kodegenerering

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

INF5110. Oblig 2 presentasjon

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

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

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

Obligatorisk oppgave 1 INF Kompilatorteknikk Våren 2012 Frist mandag 19. mars

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

Obligatorisk Oppgave 1

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

Obligatorisk Oppgave 1

Oversikt. INF5110 Obligatorisk Oppgave 1. Andreas Svendsen SINTEF

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

UNIVERSITETET I OSLO

Diverse eksamensgaver

UNIVERSITETET I OSLO

Dagens tema: Sjekking

2 Om statiske variable/konstanter og statiske metoder.

Semantisk Analyse del I

INF225 høsten 2003 Prosjekt del 4: kodegenerering

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

Datatyper og typesjekking

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

Hjemmeeksamen 2 i INF3110/4110

2 Om statiske variable/konstanter og statiske metoder.

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

UNIVERSITETET I OSLO

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

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

Kap 6.4: Typesjekking Foiler ved Birger Møller-Pedersen Forelest av Stein Krogdahl 19. og 23. mars Dagens tema: Typer og typesjekking

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

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

Litt om Javas class-filer og byte-kode

INF1000 : Forelesning 4

2012 2a. C rc; void main() { rc = new C (); rc.m2(); } } INF 3110/ INF /28/13 1

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

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

MED SVARFORSLAG UNIVERSITETET I OSLO. Det matematisk-naturvitenskapelige fakultet

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

Datatyper og typesjekking

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

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

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

Forklaring til programmet AbstraktKontoTest.java med tilhørende filer Konto.java, KredittKonto.java, SpareKonto.java

INF 1000 høsten 2011 Uke september

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

INF1000 undervisningen INF 1000 høsten 2011 Uke september

Datatyper og typesjekking

Del 1 En oversikt over C-programmering

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

Datatyper og typesjekking

Plan: Parameter-overføring Alias Typer (Ghezzi&Jazayeri kap.3 frem til 3.3.1) IN 211 Programmeringsspråk

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

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

Spørsmål og svar rundt oblig 1 og verktøy

Kapittel 1 En oversikt over C-språket

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

Del 3: Evaluere uttrykk

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

Del 4 Noen spesielle C-elementer

Dagens tema: 12 gode råd for en kompilatorskriver

Generiske mekanismer i statisk typede programmeringsspråk

Programmeringsspråket C Del 3

Programmeringsspråket C Del 3

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

Velkommen til INF2100

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

INF1000 Metoder. Marit Nybakken 16. februar 2004

Anatomien til en kompilator - I

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

Programmeringsspråket C Del 3

Statisk semantisk analyse - Kap. 6

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

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

Programmeringsspråket C Del 3

UNIVERSITETET I OSLO

Anatomien til en kompilator - I

Skal bindes opp til en deklarasjon av samme navn

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

Statisk semantisk analyse - Kap. 6

INF Obligatorisk innlevering 5

Semantisk Analyse del III

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

UNIVERSITETET I OSLO

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

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

Enkle generiske klasser i Java

INF Innleveringsoppgave 6

Oversikt Kompilering Syntaksanalyse Java Feilsjekking Oppsummering

Kap 6.3: Symboltabellen Foiler ved Birger Møller-Pedersen Forelest av Stein Krogdahl 17. mars Dagens tema:

Skal bindes opp til en deklarasjon av samme navn

Løse reelle problemer

Nybegynnerkurs i C. Øyvind Grønnesby. 14. oktober Introduksjon Typer Operatorer Kontrollstrukturer Pekere Makroer Lenker

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

Av Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

Transkript:

Oblig 2 - Simpila INF5110 - Kompilatorteknikk Våren 2012 Dette er den andre av to oppgaver våren 2012. Den bygger videre på det som er gjort i oblig 1. 1 Hensikten med oppgaven Hensikten er å få enda mer praktisk erfaring med hva som gjøres i en kompilator, nemlig: Analyse av et programs statiske semantikk. Anvendelse av et abstrakt syntakstree. Typesjekking, sjekking av bruk av navn og blokkstrtuktur i språk. Kodegenerering til en bytekode fra et abstrakt syntakstre og litt om interpretering av bytekode. 2 Oppgaven Del to av den obligatoriske oppgaven bygger på den første delen, og går ut på å implementere kravene til statisk semantikk, beskrevet i språknotatet. 1 Resultatene fra kjøring av en testsuite skal leveres. I tillegg skal det også leveres en listing av bytekoden for eksempelprogrammet RunMe.d. Ta utgangspunkt i et abstrakt syntakstre og sjekke om treet oppfyller alle kravene gitt av språkets semantikk. Gjøre om på det treet som ble laget i oblig 1 om nødvendig og lage en oversiktlig kode som benytter abstrakte klasser og funksjoner. Dersom man finner feil, gi en kort melding, som skrives ut på skjermen. Returnere en verdi fra kompilatoren som forteller om koden var godkjent (0), om det var syntaksfeil (1) eller om det var semantikkfeil (2). 1 http://www.uio.no/studier/emner/matnat/ifi/inf5110/v12/obliger/simpila-2012-2.pdf 1

Generere byte-kode ved hjelp av det utdelte biblioteket for byte-kode (Se pakken bytecode.* og underpakkene og spesielt klassen CodeFile). Legg merke til at det er begrensninger i byte-koden, slik at det ikke er mulig å generere byte-kode for alle eksemplene i katalogen test. Les mer om det under Virtuell maskin og bytekode. 3 Virtuell maskin og byte-kode Den virtuelle maskinen og byte-kode er grundig beskrevet i notat om bytecode og interpreter. 2 Det er laget en pakke med klasser for å lage byte-kode. For å lage byte-kode, opprettes et objekt av klassen CodeFile, hvor variabler, klasser, metoder m.m. kan legges til. Når alt er lagt til, kan man hente ut byte-koden med getbytecode() som lager en array med bytes (byte[]). F.eks. se på dette skallet: CodeFile codefile = new CodeFile ( ) ; / / Her bygges b y t e k o d e n opp... byte [ ] bytecode = codefile. getbytecode ( ) ; DataOutputStream stream = new DataOutputStream ( new FileOutputStream ( Navnet på f i l e n her... ) ) ; stream. write ( bytecode ) ; stream. c l o s e ( ) ; Bytekoden er stack-basert og har ca. 30 instruksjoner. Byte-koden er ikke like uttrykkskraftig som språket Simpila, derfor er reglene for programmene dere skal generere byte-kode for forskjellige fra de dere skal implementere i semantikksjekken. Forskjellen er: Det er ikke blokknivåer. Altså må alle klasser være deklarert på det øverste nivået og det er ikke prosedyrer inne i prosedyrer. Det er ikke referanseparametere, så basisparameterene overfører by-value og objektvariablene er pekerverdier og overføres også by-value. Altså, det er på sammen måte som i Java. Det er også brukt litt andre navn: Klasser kalles strukter (de inneholder kun data). Et eksempel på et program som følger de begrensede reglene er./code-examples/runme.d. Her er et kort eksempel på hvordan man bygger opp byte-koden til et enkelt program med en global variabel og en enkel prosedyre med to parametere (float og Complex) og en lokal variabel (int). Metoden printer ut float-parameteren og returnerer. Klassen Complex blir også definert. Legg spesielt merke til at alle deklarasjonene blir 2 http://www.uio.no/studier/emner/matnat/ifi/inf5110/v12/obliger/ bytecode-interpreter.pdf 2

definert først og oppdatert senere. Legg også merke til at parameterne får nummer fra 0 og oppover og at variabler inne i prosedyren blir nummerert etter det. Man må også fortelle den virtuelle maskinen hva som er main-prosedyren. Dette vil altså være kode som for eksempel er spredt rundt i det abstrakte syntakstreet, hvor hver node har ansvar for sine egne instruksjoner. / / Lage example. b i n : CodeFile codefile = new CodeFile ( ) ; codefile. addprocedure ( Main ) ; codefile. addvariable ( myglobalvar ) ; codefile. addprocedure ( t e s t ) ; codefile. addstruct ( Complex ) ; CodeProcedure main = new CodeProcedure ( Main, VoidType. TYPE, codefile ) ; main. addinstruction (new RETURN( ) ) ; codefile. updateprocedure ( main ) ; codefile. updatevariable ( myglobalvar, new RefType ( codefile. structnumber ( Complex ) ) ) ; CodeProcedure t e s t = new CodeProcedure ( t e s t, VoidType. TYPE, codefile ) ; t e s t. addparameter ( f i r s t P a r, FloatType. TYPE) ; t e s t. addparameter ( secondpar, new RefType ( t e s t. structnumber ( Complex ) ) ) ; t e s t. addinstruction (new LOADLOCAL( t e s t. variablenumber ( f i r s t P a r ) ) ) ; t e s t. addinstruction (new CALL( t e s t. procedurenumber ( p r i n t f l o a t ) ) ) ; t e s t. addinstruction (new RETURN( ) ) ; codefile. updateprocedure ( t e s t ) ; CodeStruct complex = new CodeStruct ( Complex ) ; complex. addvariable ( Real, FloatType. TYPE) ; complex. addvariable ( Imag, FloatType. TYPE) ; codefile. updatestruct ( complex ) ; codefile. setmain ( Main ) ; byte [ ] bytecode = codefile. getbytecode ( ) ; / /... Lagre i f i l e n. / code e x a m ples / example. b in Resultatet (listingen) av dette blir (Ved å kjøre biten med kode ovenfor og så kjøre komandoen java runtime.virtualmachine -l./code-examples/example.bin) Loading from file:./code-examples/example.bin Variables: 0: var Complex myglobalvar Procedures: 0: func void Main() 0: return 1: func void test(float 0, Complex 1) 0: loadlocal 0 1: call print_float {100} 2: return 3

Structs: 0: Complex 0: float 1: float Constants: STARTWITH: Main 4 Testsuite Det er laget en patch til det prosjektet som ble delt ut og som dere har bygd på i oblig 1. Den er tilgjengelig fra kurssidene 3 og består av følgende: En ny Compiler-klasse (.\src\compiler\compiler.java). Den inneholder et skall som brukes av testen. Den forutsetter at metoden compile() returnerer en int 0, 1 eller 2, som nevnt tidligere. En hjelpeklasse til testen (.\src\test\fileendingfilter.java). Klassen som utfører testen (.\src\test\tester.java). En katalog med filer det testes mot (./tests/). Filene med navn som inneholder fail skal gi semantikkfeil (2). Ingen av filene skal gi syntaksfeil (1). Et testprogram for den virtuelle maskinen (./code-examples/runme.d). Noen linjer som kan legges til build-filen for å (1) kalle testen (compile-test, test). (2) kompilere og kjøre eksemplet RunMe (compile-runme, list-runme, run-runme). De ligger i filen./build.xml.patch. Plasser filene slik at katalogene ligger i prosjektmappen deres (Pass på å legge til innholdet i Compiler.java og build.xml uten å skrive over de filene dere har). Etter det kan testen kjøres med ant test og dere kan kompilere RunMe med ant compile-runme og liste ut byte-koden med ant list-runme. Klassen Tester kaller klassen Compiler for alle testene i katalogen./tests/. Det skrives ut en linje for hver test, samt en oppsummering. 5 Sjekkliste for del to Under følger en sjekkliste for semantikken (merk at det kan være flere krav, les også språknotatet) i Simpila: Multiple deklarasjoner av ett navn i samme skop må detekteres. 3 http://www.uio.no/studier/emner/matnat/ifi/inf5110/v10/obliger/ INF5110-Oblig2-patch.tar.gz 4

Typekonvertering: int is-a float, int kan forfremmes til float i aritmetiske uttrykk, returverdier, og som aktuelt argumentuttrykk i funksjonskall. Main-prosedyren 1. Prosedyredeklarasjonen til Main, må finnes på øverste blokknivå av programmet. 2. Signaturen må matche proc Main(), d.v.s. ingen argumenter og ingen returverdi. Prosedyredeklarasjoners returverdi er: Stmts Exps ikke noe, eller type i symboltabellen (predefinert eller brukerdefinert) AssignStmt 1. Variabelen på venstresiden må være deklarert. 2. Typene på venstre side og høyre side må være like, etter evt. typekonvertering. ReturnStmt: Typen til uttrykket skal stemme overens med prosedyrens deklarerte type. Merk også særtilfelle uten returverdi, da blir argumenter til return-setningen en feil. WhileStmt: må ha en betingelse av typen bool. IfStmt: må ha en betingelse av typen bool. NewExp: Navnet som instansieres må være en definert klasse. Literals: Må være av en de forhåndsdefinerte typene i språket: float, int, string, bool eller null. Binære uttrykk (felles for alle operatorer bortsett fra negasjon) må ha lik type, etter evt. typeforfremming, på begge sider av operatoren. Aritmetiske uttrykk: som for binære uttrykk, men typene må også begrenses til aritmetiske (int eller float). Logiske uttrykk (med &&, eller not ): operandene må være av typen bool. CallStmt 1. Navnet som kalles må være deklarert som funksjon. 2. Kallet må ha samme antall aktuelle parametre som formelle parametre. 3. De aktuelle parametrene må ha samme type (eller mulig å tilordne) som de formelle parametrene. 5

Var 4. Bruk av referanser (ref ) må stemme overens med prosedyredeklarasjonen. 1. Hvis objektvariabel, må varibelen være definert i klassen som objektet er instansiert fra. 2. Navnet må være deklarert. 6 Gjennomføring og levering Gruppene fra oblig 1 beholdes. Det som skal leveres er: En forside med navn og brukernavn til de som leverer besvarelsen. En kort rapport om gjennomføringen med forklaring av designet. All kode som trengs for å bygge og kjøre parserne, herunder: JFlex-koden for skanneren CUP-koden for en av grammatikkene Java-koden for syntakstreet, semantikksjekking og byte-kode-generering Byggeskript: build.xml eller Makefile Instruksjoner for bygging og kjøring. Utskrift fra kjøring med testesuiten (ant test). Utskrift av listing av byte-koden til eksemplet RunMe.d (ant list-runme). 6.1 Frist Fristen er onsdag 2. mai. 6.2 Levering Besvarelsen leveres som ett pakket filarkiv til gruppelærer Magnus Haugom Christensen magnushc@ifi.uio.no. Hvis ønskelig kan også subversion brukes, da må dere legge til brukernavn magnushc med leserettigheter, og sende url til repository i mail. Sist oppdatert 27. mars 2012 6