Hoopl Higher-order optimization library na podstawie: Hoopl: A Modular, Reusable Library for Dataflow Analysis and Transformation N. Ramsey, J. A. Dias, and S. Peyton Jones czyli funkcyjna opowieść o 20 typach :] parafraza z http://vimeo.com/16753485
Plan Prezentacji 2 przykłady motywujące Biblioteka Opis interfejsu (API) Poprawność Wydajność Powiązane prace Próba wykorzystania Hoopl w pracy mgr
Przykłady motywujące: 1. propagacja i zwijanie stałych $ cabal install hoopl-3.8.7.1 $ git clone http://darcs.haskell.org/packages/hoopl.git/ $ cd hoopl/testing/ $ runhaskell Main.hs Test:tests/if-test f() { L1: x = 3 + 4 z = x > 5 if z then goto L2 else goto L3 L2: ret (1) L3: ret (2) } L1: goto L2
Przykłady motywujące: 1. propagacja i zwijanie stałych
Przykłady motywujące: 2. eliminacja martwych zmiennych Z przeplataniem analizy z transformacją: f() { f() { f() { --{y}------------ --{}------------- y := 42 y := 42 --{y}------------ x := y + 2 --{}------------- --{}------------- --{}----------- ret (7) ret (7) ret (7) } } } Tak robi Hoopl!
Przykłady motywujące: 2. eliminacja martwych zmiennych Najpierw analiza, potem transformacja: f() { f() { --{}------------- y := 42 x := y + 2 --{}------------- --{}----------- ret (7) ret (7) } } Tak robią inne biblioteki
Plan Prezentacji 2 przykłady motywujące Biblioteka Opis interfejsu (API) Poprawność Wydajność Powiązane prace Próba wykorzystania Hoopl w pracy mgr
Hoopl ~ duża funkcja Hoopl graf poprawiony graf porządek (dataflow lattice) funkcja przepisywania węzłów (node rewrite function) funkcja przesyłania faktów (node transfer function)
Hoopl – duża funkcja f() { f() { f() { --{y}------------ --{}------------- y := 42 y := 42 --{y}------------ x := y + 2 --{}------------- --{}------------- --{}----------- ret (7) ret (7) ret (7) } } }
Hoopl ~ duża funkcja
Hoopl ~ duża funkcja Implementacja fp_lattice, fp_transfer, fp_rewrite będzie dalej
Biblioteka vs Klient biblioteki
Wejście: Graf: węzły, krawędzie, bloki
Elementy grafów: Węzły = instrukcje Bloki (bloki proste) Grafy Test:tests/if-test f() { L1: x = 3 + 4 z = x > 5 if z then goto L2 else goto L3 L2: ret (1) L3: ret (2) }
Kształt Elementy grafów są: Otwarte / zamknięte na wejściu Otwarte / zamknięte na wyjściu L1: :: Node C O x = 3 + 4 :: Node O O z = x > 5 :: Node O O if z then goto L2 else goto L3 :: Node O C L2: :: Node C O ret (1) :: Node O C L3: :: Node C O ret (2) :: Node O C
Węzeł = instrukcja biblioteka: klient:
Krawędzie biblioteka: klient: Fakty (np. {x = 42}) na krawędziach Statyczna kontrola – exhaustive patterns
Blok (blok prosty) biblioteka: Sekwencja węzłów (instrukcji) Typ bloku mówi o kształcie Statyczna kontrola – Bcat
Graf biblioteka: MaybeO – statycznie wiemy czy argument nie jest pusty
Graf biblioteka (prywatna funkcja):
Przykład wykorzystania – propagacja i zwijanie stałych
Hoopl ~ duża funkcja
Hoopl ~ duża funkcja
Old New Joined x -> 42 x -> 42 y -> False y -> 7 y -> T z -> 5 z -> 5 z -> 5
Fact U (Map Label Fact)
--{x = 7}-------- --{x = 7}-------- z = x > 5 z = 7 > 5
z = 7 > 5 z = True
Przykłady motywujące: 1. propagacja i zwijanie stałych $ cabal install hoopl-3.8.7.1 $ git clone http://darcs.haskell.org/packages/hoopl.git/ $ cd hoopl/testing/ $ runhaskell Main.hs Test:tests/if-test f() { L1: x = 3 + 4 z = x > 5 if z then goto L2 else goto L3 L2: ret (1) L3: ret (2) } L1: goto L2
Plan Prezentacji 2 przykłady motywujące Biblioteka Opis interfejsu (API) Poprawność Wydajność Powiązane prace Próba wykorzystania Hoopl w pracy mgr
Warunki poprawności Porządek nie może mieć nieskończonych łańcuchów Funkcja przesyłania faktów musi być monotoniczna – większy fakt → większy fakt Funkcja przepisywania węzłów musi być poprawna: rewrite (graf g) → węzeł n transfer g > transfer n Rekurencja funkcji przepisywania węzłów musi być skończona Poprawność udowodniona w pracy Lernera, Grove'a i Chambersa
Plan Prezentacji 2 przykłady motywujące Biblioteka Opis interfejsu (API) Poprawność Wydajność Powiązane prace Próba wykorzystania Hoopl w pracy mgr
Wydajność „ciężko powiedzieć” Temat do zbadania / szukania usprawnień Hoopl wykorzystany w GHC Szybkość spadła o ok. 15%
Plan Prezentacji 2 przykłady motywujące Biblioteka Opis interfejsu (API) Poprawność Wydajność Powiązane prace Próba wykorzystania Hoopl w pracy mgr
Powiązane prace Podstawy teoretyczne – dobrze opracowane Praktyka, Frameworki – dopiero się rozwijają Zwykle tylko analiza, bez transformacji Jeśli nawet, to zwykle sekwencyjnie bez przeplotu Do programów w Javie – Soot: tylko analiza Do programów w C – CIL: sekwencynie Kompilator Whirlwind: rozszerzenie kompilatora Vortex, podobne do Hoopl, mniej czytelna implementacja
Plan Prezentacji 2 przykłady motywujące Biblioteka Opis interfejsu (API) Poprawność Wydajność Powiązane prace Próba wykorzystania Hoopl w pracy mgr
Próba wykorzystania Hoopl do pracy mgr Abstrakcyjny język: Lukrecja Implementacja usuwania martwych przypisań Problemy Konwersja AST Lukrecji do AST (IR) w stylu Hoopl'a … i z powrotem
Próba wykorzystania Hoopl do pracy mgr Kod w edytorze...
Próba wykorzystania Hoopl do pracy mgr Wykorzystanie do reguł typowania: - konwersja AST - reguły typowania izomorficzne z tym co już mamy Wykorzystanie do wnioskowania o typach na podstawie przepływu sterowania (flowtyping) + mechanizm wyliczania punktu stałego (aczkolwiek to da się łatwo samemu napisać) - konwersja AST (jak wyżej) - największe problemy i tak są gdzie indziej (pętle)
Podsumowanie
Hoopl – podsumowanie Biblioteka do optymalizacji Algorytm przeplatania analizy i transformacji Kontrola typów Abstrakcja Niezależny od analizowanego języka Funkcje pomagające pisać kod klienta Uproszczona implementacja
pytania?