Presentasjon lastes. Vennligst vent

Presentasjon lastes. Vennligst vent

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

Liknende presentasjoner


Presentasjon om: "Kompilatorer - Hva foregår under panseret? BEKK fagdag 30.08.13 Åsmund Eldhuset."— Utskrift av presentasjonen:

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

2 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

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

4 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

5 Faser 1.Leksikalsk analyse (lexing/scanning) 2.Parsing 3.Semantisk analyse 4.Optimalisering 5.Kodegenerering og mer optimalisering 6.Assembling og linking

6 Fase 1: Lexing  Sekvens av tegn fra inputfil  sekvens av tokens i f (x == 0) { x = 42; } i f(x==0) {x =42;}

7 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==0) {x =42;} i f == 42 0x x =

8 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 == 42 0x x = Kind:argument Index:3 Type:int

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

10 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 pushl16(%ebp) movl$0, %edx popl%eax imull(%esp) movl%eax, (%esp) popl%eax addl$0, %esp leave ret i f == 42 0x x = Kind:argument Index:3 Type:int

11 Fase 6: Assembling og linking  Assemblykode (kanskje fra flere filer)  maskinkode; kjørbart program pushl%ebp movl%esp, %ebp subl$0, %esp pushl$2 pushl16(%ebp) movl$0, %edx popl%eax imull(%esp) movl%eax, (%esp) popl%eax 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

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

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

14 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:

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

16 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 } ] ")" ]

17 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

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

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

20 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 3 7 38 24 31 7 - 24

21 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

22 Demo!  (Det er nå dere skal juble)

23 Deres tur!  Kode: https://github.com/aasmundeldhuset/Compilerhttps://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


Laste ned ppt "Kompilatorer - Hva foregår under panseret? BEKK fagdag 30.08.13 Åsmund Eldhuset."

Liknende presentasjoner


Annonser fra Google