1 / 36

Teoria Kompilacji

GRAMATYKA. Teoria Kompilacji. Teoria Kompilacji - gramatyka. Zmiany w gramatyce Minipascala: progdecl ::= recorddecl vardecl fundecl statement EOF recorddecl ::= | record | record recorddecl record ::= "[R" IDENT "R]" varlist "[RR]". LEXER. Teoria Kompilacji. Teoria Kompilacji - lexer.

Download Presentation

Teoria Kompilacji

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. GRAMATYKA Teoria Kompilacji

  2. Teoria Kompilacji - gramatyka Zmiany w gramatyce Minipascala: progdecl ::= recorddecl vardecl fundecl statement EOF recorddecl ::= | record | record recorddecl record ::= "[R" IDENT "R]" varlist "[RR]"

  3. LEXER Teoria Kompilacji

  4. Teoria Kompilacji - lexer • Elementy leksykalne dodane do składni: • | "[**]" {ENDRECORD} | "[*" {LRECORD} | "*]" {RRECORD} | "." {MEMBER} | "new" {NEW}

  5. PARSER Teoria Kompilacji

  6. Teoria Kompilacji - parser • Nowe symbole potrzebne do analizy składniowej: • %token LRECORD%token RRECORD%token ENDRECORD%token MEMBER%token NEW

  7. Teoria Kompilacji - parser • Wyrażenia dodane do analizy składniowej: • progdecl:| progrecorddecl progvardecl progfundefl statement EOF { new_mpprog $2 $1 $3 $4 };

  8. Teoria Kompilacji - parser typedecl:| INTEGER { Integer }| BOOLEAN { Boolean }| IDENT { if Types.record_declared $1 <> true then raise Name_clash4; Record $1};

  9. CODEGEN Teoria Kompilacji

  10. Teoria Kompilacji - codegen • Codegen odpowiedzialny jest za przekształcenie utworzonego wcześniej abstrakcyjnego drzewa syntaktycznego (AST) na właściwy już kod maszyny LLVM

  11. Teoria Kompilacji - codegen Dwa główne aspekty które należy rozpatrzyć podczas generowania kodu to: • Generowanie kodu dla wyraźeń i bloków • Generowanie kodu dla funkcji

  12. Teoria Kompilacji - codegen Generowanie kodu dla wyraźeń polega na wygenerowowanie odpowiedniego kodu LLVM dla wszystkich wyrażeń przewidzianych w gramatyce i zdefinowanych w module AST.

  13. Teoria Kompilacji - codegen Dokonujemy tego albo bezpośrednio rzutując dany typ na odpowiadający mu typ w LLVM , albo używamy wybudowanego moduły bulider np: • … | Ast.Plus -> build_add ...

  14. Teoria Kompilacji - codegen W tym miejscu obsługujemy również wszystkie bloki instrukcji oraz instrukcje warunkowe (if, else, while) kluczowe jest tutaj zastosowanie funkcji • append_block która pozwala nam dodawać i sprawnie zarządzać kolejnymi blokami instrukcji

  15. Teoria Kompilacji - codegen Generowanie kodu dla funkcji polega głównie na obsłużeniu jej argumentów wartości zwracanej – użycie wbudowanej funkcji • ret oraz na stworzeniu nowych bloków (append_block) podczas wchodzenia do funkcji

  16. Teoria Kompilacji - codegen • Delaracja funckji: • declare_function function_name function_type the_module • gdzie • function_type <returntype> (<parameter list>)

  17. Teoria Kompilacji - codegen • Wywolanie funkcji: • build_call fnptrval function_args "calltmp" builde • gdzie • fnptrval - uzyskujemy poprzez wywolanie pomocniczej funkcji lookup_function • function_args- jako lvalues

  18. Teoria Kompilacji - codegen • codegen_func • let bb = append_block context "entry" lfun in • position_at_end bb builder; • Zaczynamy od stworzenia podstawowego bloku dla funckji, ktory jest dodawany do the_function. • Wskazujemy builder'owi miejsce dla kodu funkcji - na koncu naszego podstawowego bloku • Alokujemy miejsce dla argumentow i zmiennych lokalnych funkcji

  19. Teoria Kompilacji - codegen • let ret_val = codegen_expr body in • (* Finish off the function. *) • let _ = build_ret ret_val builder in • (* Validate the generated code, checking for consistency. *) • Llvm_analysis.assert_valid_function the_function;

  20. LLVM Teoria Kompilacji

  21. Teoria Kompilacji - LLVM Low Level Virtual Machine – to kompilator napisany w języku C++ początkowo zaprojoktowany właśnie dla C/C++. Współcześnie powstało wiele front-endów obejmujących większość poularnych języków programowania.

  22. Teoria Kompilacji - LLVM Kluczową część systemu kompilacji stanowi warstwa pośrednia, która pobiera kod pośredni (IF - Intermediate form) z kompilatora dla określonego języka programowania i optymalizuje go. Może on zostać później przekonwertowany na kod asemblera dla konkretnej platformy sprzętowej.

  23. Teoria Kompilacji - LLVM LLVM posiada niezależny od języka zestaw instrukcji oraz system typów. Każda instrukcja przedstawiona jest w postaci SSA (static single assignment form), co oznacza że do każdej zmiennej (zwana typowanym rejestrem) możemy przypisać wartość co najwyżej jeden raz.

  24. Teoria Kompilacji - LLVM LLVM posiada podstawowe typy takie, jak liczby całkowite, wskaźniki, tablice, wektory, struktury i funkcje.

  25. Garbage Collector Teoria Kompilacji

  26. Teoria Kompilacji – GC • Grabage Collector to mechanizm odpowiedzialny za automatyczne zarządzanie pamięcią tj. automatyczne zwalnianie pamięci dla obiektów nieużywanych (tych do których nie mamy już referencji).

  27. Teoria Kompilacji – GC • Dwa główne rodzaje GC to: • Accurate GC • Conservative GC

  28. Teoria Kompilacji – GC • Accurate GC wymaga zdolności do identyfikowania wszystkich wskaźników w trakcie działania. Identyfikowanie wskaźników wymaga wsparcia kompilatora do lokalizacji wszystkich miejsc zawierających aktywne wskaźniki włączając w to stos i rejestry.

  29. Teoria Kompilacji – GC • Conservative GC nie wymaga wsparcia ze strony kompilatora. Natomiast głównym jego problemem jest niemożliwość rozróznienia czy słowo jest wskaźnikiem czy nie, a co za tym idzie nie jest w stanie przemieszczać aktywnych oiektów w obrębie sterty.

  30. Teoria Kompilacji – GC • Zastosowany przez nas Boehm GC to typowy konserwatywny GC. Stosuje od algorytm Mark and Sweep jako metode odśmiecania. Jego użycie polega w gruncie rzeczy na zamienieniu ”naszych” allokacji pamięci na metody dostarczane w module Bohem GC.

  31. Kompilacja i Uruchamianie Teoria Kompilacji

  32. Teoria Kompilacji • Projekt kompilujemy przy użyciu polecenia ocamlbuild codegen.native lub skryptem Makefile make • Kompilacja przykładowych programów składa się z kilku kroków: • 1. Translacja kodu programu do kodu LLVM: • ./odragon progs/hello.

  33. Teoria Kompilacji 2. Translacja do kodu asemblera (plik .s) llc progs/hello.bc 3. Kompilacja i podlinkowanie bibliotek (GC) gcc -L ... -I ... -lgc ../test_del.o progs/hello.s -o hello 4. Uruchomienie programu ./hello

  34. Problemy implementacyjne • Instalacja LLVM • Podpięcie GC

  35. ŹRÓDŁA Teoria Kompilacji

  36. Teoria Kompilacji - źródła http://llvm.org/releases/2.5/docs/GarbageCollection.html http://llvm.org/docs/tutorial/OCamlLangImpl3.html http://www.weaselhat.com/2009/09/24/llvm-ocaml-loca/ http://www.hpl.hp.com/personal/Hans_Boehm/gc/

More Related