Kompilatorer - Hva foregår under panseret? BEKK fagdag

Slides:



Advertisements
Liknende presentasjoner
PUG Norway – 12. nov 09Thomas Skjørten / Jan Kolstad.
Advertisements

C++ for Java-programmerere
Intro til programmering i Processing
Uke 10 - Sortering, og hvordan lage en klasse for et klassebibliotek 21 okt. 2003, Arne Maus Inst. for informatikk, UiO.
1 Java 6 Mer om metoder Tekster Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for informatikk Universitetet i Oslo.
1 Litt om OO og programmering Arne Maus. 2 OO og Java (og C++, C#)  Arven fra Simula  Programstruktur i Java  Generering av objekter  Beskyttelse.
Java 12 Mer filbehandling - skrive til fil HashMap Et større eksempel Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for informatikk Universitetet.
Tabeller – Arrays Lage frekvenstabell Norske Bokstaver
Java 4 Mer om forgreninger While-løkker Ole Christian Lingjærde
Objekt, Instanser og referanser + litt til. Objekter  Instanser  En instans er et objekt av en bestemt klasse  Instanser blir laget ved å kalle klassens.
Java 14 Et eksempel fra bioinformatikk: analyse av biologiske sekvenser Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for informatikk Universitetet.
IS-102 Klassedefinisjoner
#include Ligner litt på import i java. Setter inn hele fila stdio.h i programteksten. Definerer en del io funksjoner slik at signaturen er kjent. I dette.
C for Java-programmerere
Databasehåndtering med MySQL
Memoisering og dynamisk programmering
C# for javaprogrammerere
@ TDT4120 Algoritmer og datastrukturer Introduksjon til øvingsopplegg og programmering i Python Åsmund Eldhuset asmunde stud.ntnu.no.
Forside Introduksjon Fibonacci-tall Memoisering DP Neste uke Spørsmål Introduksjon til memoisering og dynamisk programmering Åsmund Eldhuset asmunde *at*
Åsmund Eldhuset asmunde stud.ntnu.no folk.ntnu.no/asmunde/algdat/
TDT4120 Algoritmer og datastrukturer Introduksjon til øvingsopplegg og programmering i Python Basert på foiler av Åsmund Eldhuset Flikket på og presentert.
Generelt I/O if/else Funksjoner Lists Løkker Dictionaries Annet Listebehandling Klasser Python med noen algdat-anvendelser Åsmund Eldhuset asmunde *at*
En gang til!? .
Grunnleggende testteori
Språket som system.
Filer Finne minste Finne Største Beregne gjennomsnitt Variabler Tabeller – Arrays Lage frekvenstabell.
Jæger: Robuste og sikre systemer INF150 Programmering mandag 2.10 Default values – standardverdier ved oppstart MER OM: Sub-prosedyrer og sub-funksjoner.
Å lage sikre klasser Unntaksklassene i Java-API-et Unntakshåndtering i databasesammenheng try-catch-finally-setningen Trelagsarkitektur; egen databaseklasse.
Jæger: Robuste og sikre systemer INF150 Programmering torsdag 31.8 Kapittel 3: Grunnlag for programmering i Visual Basic.
Jæger: Robuste og sikre systemer INF150 Programmering torsdag 5.10 MER OM: Lesing fra fil Unntakshåndtering Kap 8.
Kapittel 11 Rekursjon Å tenke rekursivt Rekursjon er ein programmeringsteknikk der ein metode kallar seg sjølv for å fullføre ei oppgåve For å kunne.
4/4/2017 IMT2243: 17.februar 2011 Domenemodellering / Konseptuelle Klassediagram Monopol- eksempel SSD : System Sequence Diagram Kort repetisjon av teknikken.
ANALYSE AV KVALITATIVE DATA
Introduksjon til Java 5.0. Hva er nytt i 5.0? Generiske typer For-løkke med iterator (for-hver løkke) Automatisk innpakking av primitive typer Metadata.
Programmering i Java versjon desember 2002 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Programmering i Java versjon august 2004 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Programmering i Java versjon Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik.
Repetisjon av JSP Variabler, tabeller, if-setninger, for/while-løkker
Eksempel på SQL ”SQL-setninger” har en struktur som likner på ”naturlig språk”, med ”verb, subjekter og adjektiver”. SQL-setningene begynner alltid med.
Dynamiske nettsider PHP Del 2 – Kontrollstrukturer.
Oppgaver til kodegenerering etc. INF-5110, 2013 Oppgave 1: Vi skal se på koden generert av TA-instruksjonene til høyre i figur 9.10 i det utdelte notatet,
Programmering sif8005. Praktisk informasjon  Innleveringsfrist øvinger: mandag kl  Alle øvinger er obligatoriske  Studass tilgjengelig 6 timer.
1 Pointere, referencer, struct’s mv.. 2 Erklæringer Eksempel på erklæringer int i, *ip, f ( ), *fip( ), (*pfi) ( ); Erklærer en integer, en pointer til.
1 INF5110 – 23. april, 2013 Svar på noen oppgaver til kap. 8 Beklager noe trykkfeil og rot på forelesningene Håper dette er bedre (lagt ut 24/4) Nå fredag.
XQuery og relasjonell algebra Andreas Ravnestad. Agenda Bakgrunn/motivasjon XQuery Hvorfor oversette Xquery → rel.alg Parserkonstruksjon Relasjonell algebra.
Java 5 Litt mer om løkker Arrayer Metoder Ole Christian Lingjærde
1 INF5110 – 23. april, 2013 Noen oppgaver til kap. 8 Dette er en bedre utgave av oppgavene, lagt ut 24. april Nå fredag (26/4): Det blir ikke undervisning.
Objekt, Instanser og referanser + litt til. Objekter  Instanser  Kan sees på som det samme. Personen Per kan være både et objekt og en instans av klassen.
Indledende Datalogi /kelk 1 Need to know Løkker Klasser, instanser og Objekter Hvorfor objektorientering? Scope – hvor erklæres en variabel? ”Access Modifiers”
Main metoden n public static void main(String[] args){ } n Inni denne metoden skjer alt! n Det kan bare finnes en main metode per program. n Den kan ligge.
INF Objektorientert programmering
Compiler/fortolker struktur Mellem- kode Kode- generering Kode- optimering Lexikalsk- analyse Syntax- analyse Semantik- analyse if viggo == 3 then....
Ekstra mange tips til Oblig 3! 12. mars 2007 Are Magnus Bruaset og Arild Waaler Inst. for informatikk, UiO.
Forside Intro Fibonacci-tall Memoisering DP Longest increasing subsequence Betingelser Matrise- multiplikasjon Longest common subsequence Grådig vs. DP.
INF1000 (Uke 14) Eksamen V06 Grunnkurs i programmering Institutt for Informatikk Universitet i Oslo Are Magnus Bruaset og Arild Waaler.
Byggeklosser i java  Klassedefinisjon  Variabel deklarasjon  Metodedeklarasjoner  En ordentlig klasse  Spesielle/kryptiske skrivemåter  løkker og.
Jæger: Robuste og sikre systemer INF150 Programmering mandag 25.9 MER OM: Sub-prosedyrer og sub-funksjoner Kap 4.
Programmering i Java versjon Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik.
INF1000 (Uke 4) Mer om forgreninger, While-løkker
XML og JDOM Helge Furuseth XML  XML = Extensible Markup Language Basert på SGML – Standard Generalized Markup Language  HTML =
Inf1000 (Uke 5) Arrayer, filer og tekst
Kapittel 5 Vilkårssetningar og løkker. 5.1 Boolske uttrykk George Boole ( ), britisk matematikar Utvikla teori om logikk ved bruk av symbol i.
Use case realisering Designmodellering Kirsten Ribu Kapittel 4 UML Distilled.
Lokale variable Hvis vi trenger å ta vare på en verdi, inne i en metode kan vi definere en lokal variabel: int amount = 0; vi må fortelle hvilken type.
INF5110 – 23. april, 2013 Svar på noen oppgaver til kap
IS-102 Interaksjon med objekter
Yet Another Compiler Compiler
BilSalg klassedatastruktur Bil klassedatastruktur
INF2820 Datalingvistikk – V2011
BilSalg klassedatastruktur Bil klassedatastruktur
Utskrift av presentasjonen:

Kompilatorer - Hva foregår under panseret? BEKK fagdag 30.08.13 Åsmund Eldhuset

Dagens sitat "A compiler is a computer program that transforms a series of high-level programming language statements into error messages, warnings and, occasionally, insults." – Uncyclopedia

Agenda Strukturen til en kompilator Litt språkteori Intro til .Net-assemblykode Gjennomgang av koden til en fullstendig kompilator

Credits Dette foredraget og kompilatoren vi har utviklet er svært sterkt inspirert av øvingsopplegget i faget TDT4205 Kompilatorteknikk Foreleser: Anne C. Elster Øvingslærer: Jan Christian Meyer

Faser Leksikalsk analyse (lexing/scanning) Parsing Semantisk analyse Optimalisering Kodegenerering og mer optimalisering Assembling og linking

i f ( x = ) { 4 2 ; } i f ( x = ) { 4 2 ; } Fase 1: Lexing Sekvens av tegn fra inputfil  sekvens av tokens i f ( x = ) { 4 2 ; } i f ( x = ) { 4 2 ; }

i f ( x = ) { 4 2 ; } i f = 4 2 x Fase 2: Parsing Sekvens av tokens  abstrakt syntakstre (AST) parse verb /pɑːz/ (grammatikk eller EDB) analysere (dvs. dele opp en setning i deler for å beskrive de ulike delenes art og innbyrdes forhold) - Kunnskapsforlagets engelskordbok i f ( x = ) { 4 2 ; } i f = 4 2 x

Fase 3: Semantisk analyse AST  annotert AST Sjekker semantiske regler som ikke dekkes av grammatikken Hvilke variabeldeklarasjoner som gjelder for hver variabelreferanse Sjekke at typer stemmer overens Sjekke at variabler er deklarert før de brukes Sjekke at ikke-void-metoder har en return i alle execution paths Sjekke at det finnes en Main() Sjekke at expressions i if og while er sammenligninger i f = 4 2 x Kind: argument Index: 3 Type: int

* << x - x 3 13 5 Fase 4: Optimalisering Omstrukturering av AST Constant folding Strength reduction Common subexpression elimination Loop hoisting ... * << x - x 3 13 5

Fase 5: Kodegenerering og mer optimalisering Optimalisert AST  assemblykode Optimalisering av assemblykoden Eliminasjon av død kode Gjenbruk av utregnede mellomresultater Registerallokering (trengs ikke i stackmaskiner) ... pushl %ebp movl %esp, %ebp subl $0, %esp pushl $2 pushl 16(%ebp) movl $0, %edx popl %eax imull (%esp) movl %eax, (%esp) addl $0, %esp leave ret i f = 4 2 x Kind: argument Index: 3 Type: int

Fase 6: Assembling og linking Assemblykode (kanskje fra flere filer)  maskinkode; kjørbart program pushl %ebp movl %esp, %ebp subl $0, %esp pushl $2 pushl 16(%ebp) movl $0, %edx popl %eax imull (%esp) movl %eax, (%esp) addl $0, %esp leave ret 5f 70 72 69 6e 74 66 5f 74 63 68 00 72 65 61 64 6f 63 61 6c 65 00 6d 62 72 6e 63 6d 70 00 6f 70 72 63 68 72 00 66 66 6c 63 6b 65 64 00 64 63 67 65 74 70 77 75 69 64 00 00 5f 5f 6d 65 6d 70 63 65 74 67 72 67 69 64 00 67 6e 61 6c 00 73 74 72 74 6f 77 63 73 00 73 69 6b 00 5f 5f 73 74 61 63 69 6c 00 5f 5f 6c 78 73 72 69 6e 74 00 72 65 61

VSL func IsPrime(number) { var divisor divisor = 2 while divisor < number { if number / divisor * divisor == number return 0 divisor = divisor + 1 } return 1 }

VSL func Main() { var n, max print "Please enter the greatest number to check:" input max n = 2 while n <= max { if IsPrime(n) print n, " is prime" n = n + 1 } return 0 }

Endelige tilstandsautomater Tokens bør kunne beskrives av regulære uttrykk (regex) Regex ↔ tilstandsautomat "Enkelt" å implementere i kode -?(0|[1-9][0-9]*)(\.[0-9]+)? blir til dette:

EBNF (Extended Backus-Naur form) for VSL program = function { function } function = “func" identifier "(" [ identifier { "," identifier } ] ")" block statement = assignment_statement | return_statement | print_statement | null_statement | if_statement | while_statement | block block = "{" { declaration } { statement } "}" assignment_statement = identifier "=" expression return_statement = "return" expression print_statement = "print" print_item { "," print_item } null_statement = "continue" | "break" if_statement = "if" expression statement | "if" expression statement "else" statement while_statement = "while" expression statement input_statement = "input" identifier { "," identifier }

EBNF (Extended Backus-Naur form) for VSL declaration = "var" identifier { "," identifier } print_item = expression | string expression = comparand { ("==" | "!=" | "<" | "<=" | ">" | ">=") comparand } comparand = term { ("+" | "-") term } term = factor { ("*" | "/") factor } factor = "-" factor | "(" expression ")" | integer | variable [ "(" [ expression { "," expression } ] ")" ]

CIL – Common Intermediate Language Veldig høynivå assemblyspråk som brukes av .NET sin virtual machine Stackbasert → ingen registre "Vanlig" x86-assemblykode er registerbasert; litt vanskeligere å kompilere til, men ca. samme prinsipper Sterkt typet

CIL: Klasser C#: namespace Vsl { public class VslMain { ... } } CIL: .namespace Vsl { .class public auto ansi VslMain extends [mscorlib]System.Object { ... } }

CIL: Metoder C#: public static void DoSomething(int x, string s) { string t = ...; int y = ...; ... } CIL: .method public static void DoSomething(int32, string) cil managed { .locals init (string, int32) ... }

CIL: Instruksjoner og utførelse public int DoSomething(int a) { int x = 3; int y = a + x * 8; return a - y; } ldc.i4 3 stloc 0 ldarg 0 ldloc 0 ldc.i4 8 mul add stloc 1 ldarg 0 ldloc 1 sub ret Locals: ? Arguments: 7 Stack: 3 31 -24 31 7 7 3 31 3 24 8

CIL: Konsoll-I/O og kalling av .Net-kode C#: Console.WriteLine("Hello world!"); int a = int.Parse(Console.ReadLine()); CIL: ldstr "Hello world!" call void [mscorlib]System.Console::Write(string) call string [mscorlib]System.Console::ReadLine() call int32 [mscorlib]System.Int32::Parse(string) stloc 0

Demo! (Det er nå dere skal juble)

Deres tur! Kode: https://github.com/aasmundeldhuset/Compiler Gjør noe gøy! Forslag: Legg til ny syntaks (med .Net-kodegenereringen) Modulo-operator Mulighet for å kalle annen .Net-kode Skriv om backenden Assemblyspråk: JVM-bytecode Native x86 Høynivå språk (enten vha. all syntaksen, eller ved å simulere en stackmaskin): Java Ruby Lag din egen DSL Lag en interpreter