Anatomien til en kompilator - I

Like dokumenter
Anatomien til en kompilator - I

Runtime-omgivelser Kap 7 - I

Runtimesystemer Kap 7 - I

Runtimesystemer - II. Funksjoner som parametere. Virtuelle metoder

Runtimesystemer Kap 7 - I

Typisk: Kan det være både nøkkelord og navn, så skal det ansees som nøkkelord

Typisk: Kan det være både nøkkelord og navn, så skal det ansees som nøkkelord

Scanning - I Kap. 2. Hva scanneren gjør

Skanning del I INF /01/15 1

UNIVERSITETET I OSLO

Runtime- systemer del III

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

Skanning del I. Kapittel 2 INF 3110/ INF

Runtimesystemer del III

MED SVARFORSLAG UNIVERSITETET I OSLO. Det matematisk-naturvitenskapelige fakultet

Datatyper og typesjekking

Semantisk Analyse del III

Datatyper og typesjekking

Datatyper og typesjekking

Runtime-omgivelser Kap 7 - II

Datatyper og typesjekking

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

Runtimesystemer - II. Parameteroverføring Call by value Call by reference Call by value-result Call by name INF 3110/ INF

UNIVERSITETET I OSLO

Diverse eksamensgaver

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)

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Statisk semantisk analyse - Kap. 6 Foiler ved Birger Møller-Pedersen (Forelest 10/3 og 12/ av Stein Krogdahl)

UNIVERSITETET I OSLO

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

Velkommen til INF Kompilatorteknikk

Semantisk Analyse del I

UNIVERSITETET I OSLO

Velkommen til INF Kompilatorteknikk

Fiktiv eksamensbesvarelse IN 211 høsten 2001

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

Generiske mekanismer i statisk typede programmeringsspråk

Skal bindes opp til en deklarasjon av samme navn

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

Dagens tema: Sjekking

Skal bindes opp til en deklarasjon av samme navn

Velkommen til INF Kompilatorteknikk

UNIVERSITETET I OSLO

Statisk semantisk analyse - Kap. 6

Statisk semantisk analyse - Kap. 6

MED SVARFORSLAG UNIVERSITETET I OSLO

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

Velkommen til INF Kompilatorteknikk

Løsningsforslag til eksamen i IN 211 høsten 2002

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

Syntax/semantics - I INF 3110/ /29/2005 1

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

Dagens tema: Kjøresystemer II

Litt om Javas class-filer og byte-kode

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

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

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

Dagens tema Syntaks (kapittel Komp. 47, kap. 1 og 2)

Velkommen til INF5110 Kompilatorteknikk

Litt om kompilering og interpretering. Dagens tema Syntaks (kapittel Komp. 47, kap. 1 og 2) Syntaks og semantikk

Dagens Tema: Grammatikker Kap. 3 i K. C. Louden

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

INF 5110, 3. februar Dette foilheftet: Kapittel 3

Dagens Tema: Grammatikker

INF januar Forelesninger fremover:

Kontekstfrie grammatikker og syntaksanalyse (parsering)

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 (

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

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

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

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

Løsningsforslag til eksamen i IN 211 høsten 2001

UNIVERSITETET I OSLO

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

Administrivia INF 3110/ INF /02/2005 1

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

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

Velkommen til INF Kompilatorteknikk

Dagens tema Grundig repetisjon og utdyping: Syntaks kontra semantikk

Hjemmeeksamen 2 i INF3110/4110

Dagens Tema: Grammatikker

Kap. 5 del 2: LR(1)- og LALR(1)-grammatikker INF5110 V2005. Stein Krogdahl, Ifi, UiO

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

Velkommen til INF Kompilatorteknikk

Obligatorisk Innlevering 2

INF225 høsten 2003 Prosjekt del 4: kodegenerering

Kap. 5, Del 3: INF5110, fra 1/3-2011

Kap. 5, del 2 LR(1)- og LALR(1)-grammatikker INF5110 V2008

Hva er syntaks? En overskrift i en norsk avis: Dagens tema Grundig repetisjon og utdyping:

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

Oversikt Kompilering Syntaksanalyse Java Feilsjekking Oppsummering

Dagens Tema: Grammatikker Kap. 3 i K. C. Louden

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

Dagens tema: 12 gode råd for en kompilatorskriver

Transkript:

Anatomien til en kompilator - I program Symboltabell tekst tokens syntaks-tre beriket syntaks-tre Finne struktur i programmet OK i henhold til grammatikk? Preprocessor Makroer Betinget kompilering Filer Scanner Dele opp i leksemer OK? Lex Flex Parser Symboltabell (navn Yacc Bison Checker Sjekker bruk definisjon Type sjekk Optimizer Code generator Betydning (definisjon)) Attributtgrammatikker + Div. metoder 5/24/2005 1

Framgangsmåte for automatisk å lage en scanner Beskriv de forskjellige token-klassene som regulære uttrykk Eller litt mer fleksibelt, som regulære definisjoner Omarbeid dette til en NFA (non-deterministic finite automaton) Er veldig rett fram Omarbeid dette til en DFA (deterministic finite automaton) Dette kan gjøres med en kjent, grei algoritme En DFA kan uten videre gjøres om til et program 5/24/2005 2

DFA -1 Funksjonen T: SxΣ -> S er ikke fullstendig definert Denne utvidelsen (med en feiltilstand) er underforstått 5/24/2005 3

NFA Kan ofte være lett å sette opp, spesielt ut fra et regulært uttrykk Kan ses på som syntaks-diagrammer NFA ikke greit å gjøre til algoritme DFA beskriver samme språk 5/24/2005 4

Thomson-konstruksjon I (Ethvert regulært uttrykk skal bli automat på denne formen: a: a rs: ε: ε 5/24/2005 5

Thomson-konstruksjon II r s: r*: 5/24/2005 6

Transformasjon fra NFA: M til DFA: M ALGORITME 1. Lag start-tilstanden i M som ε-tillukningen av {start-tilstanden i M} 2. Om S er en tilstand i M, så gjelder: a S ε-tillukning(s a ) (Må eventuelt opprette ny M -tilstand) 3. Gjenta steg 2 for alle S i M og alle a i alfabetet til M ikke får flere nye tilstander. 4. De aksepterende tilstander i M er de S i M som inneholder minst én av de aksepterende tilstander i M. 5/24/2005 7

Eksempel 2.16 ab a 5/24/2005 8

Eksempel 2.17 letter (letter digit)* 5/24/2005 9

Attributt-grammatikker Attributter er variable knyttet til nodene i parseringstreet Hver semantisk regel er knyttet til en produksjon Arvede/syntetiserte attributter Deres verdier definert ved semantiske regler 5/24/2005 10

5/24/2005 11

Datatyper og typesjekking Om typer generelt Hva er typer? Statisk og dynamisk typing Hvordan beskrive typer syntaktisk? Hvordan lagre dem i kompilatoren? Gjennomgang av noen typer Grunntyper Type-konstruktører Verdisett og operasjoner Lagring under utførelse (mer i kap 7) Run-time tester og spesielle problemer: array/record/union/peker/... Hva vil det si at to variableuttrykk har samme type? Hvordan utføre selve type-sjekkingen? 5/24/2005 12

Sjekking av type-riktighet for uttrykk, program, etc exp exp + exp exp or exp exp [ exp ] 5/24/2005 13

Sjekking av type vha attributtgrammatikk 5/24/2005 14

6.21 5/24/2005 15

5/24/2005 16

Grammar Rule fun-decls fun id ( var-decls ): type-exp ; body Semantic Rule fun-decls.type = maketypenode (fun, var-decls.types, type-exp.type) exp id ( exps ) if isfuntype(lookup(id.name)) and exps.types = parametertypesof(id.name) then exp.type = lookup(id.name) else type-error Forutsetter at var-decls.types defineres som en liste av de typer, som de enkelte vardecl bidrar med; exps.types defineres som listen av typene til de enkelte exp i listen av exp; funksjonen parametertypesof gir tilsvarende listen av de typer som finnes i TypeNode for funksjonen 5/24/2005 17

Lagerorganisering Typisk organisering under utførelse dersom et programmeringsspråk har alle slags data (statisk, stakk, dynamisk) Typisk organisering av data for et prosedyrekall (aktiveringsblokk) Det er gjerne ut fra plasseringen her man karakteriserer språk til være statisk organisert stakk-organisert heap/dynamisk organisert 5/24/2005 18

Aktiveringsstakk Aktiverings-blokkene kan organiseres som en stakk. Kreves om man tillater rekursive kall Return address Program-adressen man er kalt fra control link Angir kallerens fp ( dynamisk link ) frame pointer Peker på fast sted i den aktuelle aktiveringsblokkken stack pointer Angir grensen mellom brukt og ledig lagerareal 5/24/2005 19

Prosedyrer inne i prosedyrer Nestede prosedyrer Nested klasser (inner classes) kan behandles på samme måte. 5/24/2005 20

Et første forsøk Kontekstvektor ( display ) Vi trenger noe ekstra (aksess-link/statisk link) Hvordan kan vi aksessere n i p? Går altid til aktuell utgave av tekstlig omgivelse 5/24/2005 21

Eksempel med flere nivåer Programblokkene får da et blokk-nivå fp.al.al.x diff i blokknivå 5/24/2005 22

Oppgave 3.b (2004) fp.al.al.x void R() { int x;...; void Q() {...; void P() {...; x := 2;... } } } 5/24/2005 23

Oppg 7.10d 5/24/2005 24

5/24/2005 25

Objekt-orientering Klasser og subklasser Typede pekere Virtuelle og ikke-virtuelle metoder class A { int x,y; void f(s,t) {...K...}; virtual void g(p,q) {...L...} } class B extends A{ int z; void f(s,t) {...Q...}; redef void g(p,q) {...M...}; virtual void h(r) {...N...} } class C extends B{ int u; redef void h(r) {...P...} } A ra B rb C rc 5/24/2005 26

Implementasjon (typede pekere) Kompilatorsjekk av rx.f(...), både virtuelle og ikke-virtuelle): f må være definert i X eller i superklasse til X De ikke-virtuelle bindes ferdig i kompilatoren De virtuelle nummereres (med offset ) fra ytterste klasse og innover redefinisjoner får samme nummer La objekthodene inneholde en peker til klassens felles virtuell-tabell ra.g(...) implementeres slik: call(ra.virttab[g_offsett]) Kompilatoren vet: g_offset = 0 h_offset = 1 5/24/2005 27

Impl. av virtuelle metoder som i boken (C++) Virtuell-tabell pekeren har relativ-adresse som kan beregnes av kompilatoren Pekeren til virtuell-tabellen ligger ikke først i objektet, da bare objekter med virtuelle funksjoner har en virtuell-tabell. 5/24/2005 28

Utypede pekere (f.eks. Smalltalk) Ikke-virtuelle metoder finnes ikke Problem med virtuell-tabeller: Alle virtuell-tabeller måtte innholde alle metoder i alle klasser, altså for stor. I tillegg: I Smalltalk kan man legge til metoder underveis Derfor (antar at f er fjernet): r.g(...) implementeres slik: 1. Gå til objektets klasse 2. Let etter h ut gjennom superklassene 5/24/2005 29

7.13 A-objekt int a f 0 vt g 1 B-objekt int a vt int b C-objekt int a vt int b int c f g f g 0 1 0 1 5/24/2005 30

Oppg. 3c (2004) 5/24/2005 31

Parameteroverføring by value Hver formell parameter blir implementert som en lokal variabel i prosedyren Ved kallet gjøres formell_var = aktuell_var by reference Overfører en peker til den aktuelle variable by value-result Det allokeres en lokal varabel, som ved by value by name Ved kallet gjøres formell_var = aktuell_var Ved retur utføres aktuell_var = formell_var Den aktuelle parameteren blir substituert inn for den formelle ( nesten rent tekstlig: den aktuelle parameteren beholder sitt skop, så altså ikke makro-ekspansjon) 5/24/2005 32

7.16 by value by reference 0 1 2 0 1 0 2 0 by value-result 1 0 2 0 by name 2 1-1 0 5/24/2005 33