1 / 23

Kompilatorer

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.

annick
Télécharger la présentation

Kompilatorer

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  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 • Leksikalsk analyse (lexing/scanning) • Parsing • Semantisk analyse • Optimalisering • Kodegenerering og mer optimalisering • Assembling og linking

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

  7. Fase 2: Parsing • Sekvens av tokens abstrakt syntakstre (AST) • parseverb /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 i { x x f f ( x x = = = = 0 0 ) = = 4 4 2 2 ; }

  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 ifog while er sammenligninger i x f x = = 0 = 4 2 Kind: argumentIndex: 3Type: int

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

  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 pushl 16(%ebp) movl $0, %edx popl %eax imull (%esp) movl %eax, (%esp) popl %eax addl $0, %esp leave ret i x f x = = 0 = 4 2 Kind: argumentIndex: 3Type: 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 pushl 16(%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){vardivisordivisor = 2while divisor < number {if number / divisor * divisor == numberreturn0divisor = divisor + 1 }return1}

  13. VSL func Main(){var n, maxprint "Please enter the greatest number to check:"inputmaxn = 2while n <= max {if IsPrime(n)print n, " is prime"n = n + 1 }return0}

  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:.namespaceVsl{.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 3stloc 0ldarg 0ldloc 0ldc.i4 8muladdstloc 1ldarg 0ldloc 1subret 7 Arguments: 3 31 ? ? Locals: 31 31 3 8 24 7 -24 3 7 Stack:

  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/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

More Related