360 likes | 515 Views
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.
E N D
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 • Elementy leksykalne dodane do składni: • | "[**]" {ENDRECORD} | "[*" {LRECORD} | "*]" {RRECORD} | "." {MEMBER} | "new" {NEW}
PARSER Teoria Kompilacji
Teoria Kompilacji - parser • Nowe symbole potrzebne do analizy składniowej: • %token LRECORD%token RRECORD%token ENDRECORD%token MEMBER%token NEW
Teoria Kompilacji - parser • Wyrażenia dodane do analizy składniowej: • progdecl:| progrecorddecl progvardecl progfundefl statement EOF { new_mpprog $2 $1 $3 $4 };
Teoria Kompilacji - parser typedecl:| INTEGER { Integer }| BOOLEAN { Boolean }| IDENT { if Types.record_declared $1 <> true then raise Name_clash4; Record $1};
CODEGEN Teoria Kompilacji
Teoria Kompilacji - codegen • Codegen odpowiedzialny jest za przekształcenie utworzonego wcześniej abstrakcyjnego drzewa syntaktycznego (AST) na właściwy już kod maszyny LLVM
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
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.
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 ...
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
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
Teoria Kompilacji - codegen • Delaracja funckji: • declare_function function_name function_type the_module • gdzie • function_type <returntype> (<parameter list>)
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
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
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;
LLVM Teoria Kompilacji
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.
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.
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.
Teoria Kompilacji - LLVM LLVM posiada podstawowe typy takie, jak liczby całkowite, wskaźniki, tablice, wektory, struktury i funkcje.
Garbage Collector Teoria Kompilacji
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).
Teoria Kompilacji – GC • Dwa główne rodzaje GC to: • Accurate GC • Conservative GC
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.
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.
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.
Kompilacja i Uruchamianie Teoria Kompilacji
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.
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
Problemy implementacyjne • Instalacja LLVM • Podpięcie GC
ŹRÓDŁA Teoria Kompilacji
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/