1 Hoopl Higher-order optimization libraryna 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
2 Plan Prezentacji 2 przykłady motywujące BibliotekaOpis interfejsu (API) Poprawność Wydajność Powiązane prace Próba wykorzystania Hoopl w pracy mgr
3 Przykłady motywujące: 1. propagacja i zwijanie stałych$ cabal install hoopl $ git clone $ 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
4 Przykłady motywujące: 1. propagacja i zwijanie stałych
5 Przykłady motywujące: 2. eliminacja martwych zmiennychZ przeplataniem analizy z transformacją: f() { f() { f() { --{y} {} y := y := 42 --{y} x := y + 2 --{} {} {} ret (7) ret (7) ret (7) } } } Tak robi Hoopl!
6 Przykłady motywujące: 2. eliminacja martwych zmiennychNajpierw analiza, potem transformacja: f() { f() { --{} y := 42 x := y + 2 --{} {} ret (7) ret (7) } } Tak robią inne biblioteki
7 Plan Prezentacji 2 przykłady motywujące BibliotekaOpis interfejsu (API) Poprawność Wydajność Powiązane prace Próba wykorzystania Hoopl w pracy mgr
8 Hoopl ~ duża funkcja Hoopl graf poprawiony graf porządek (dataflowlattice) funkcja przepisywania węzłów (node rewrite function) funkcja przesyłania faktów (node transfer function)
9 Hoopl – duża funkcja f() { f() { f() {--{y} {} y := y := 42 --{y} x := y + 2 --{} {} {} ret (7) ret (7) ret (7) } } }
10 Hoopl ~ duża funkcja
11 Hoopl ~ duża funkcja Implementacja fp_lattice, fp_transfer, fp_rewrite będzie dalej
12 Biblioteka vs Klient biblioteki
13 Wejście: Graf: węzły, krawędzie, bloki
14 Elementy grafów: Węzły = instrukcje Bloki (bloki proste) GrafyTest: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) }
15 Kształt Elementy grafów są: Otwarte / zamknięte na wejściuOtwarte / zamknięte na wyjściu L1: :: Node C O x = :: Node O O z = x > :: 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
16 Węzeł = instrukcja biblioteka: klient:
17 Krawędzie biblioteka: klient: Fakty (np. {x = 42}) na krawędziachStatyczna kontrola – exhaustive patterns
18 Blok (blok prosty) biblioteka: Sekwencja węzłów (instrukcji)Typ bloku mówi o kształcie Statyczna kontrola – Bcat
19 Graf biblioteka: MaybeO – statycznie wiemy czy argument nie jest pusty
20 Graf biblioteka (prywatna funkcja):
21 Przykład wykorzystania – propagacja i zwijanie stałych
22 Hoopl ~ duża funkcja
23 Hoopl ~ duża funkcja
24 Old New Joined x -> x -> 42 y -> False y -> y -> T z -> z -> z -> 5
25 Fact U (Map Label Fact)
26 --{x = 7}-------- --{x = 7}--------z = x > z = 7 > 5
27 z = 7 > z = True
28 Przykłady motywujące: 1. propagacja i zwijanie stałych$ cabal install hoopl $ git clone $ 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
29 Plan Prezentacji 2 przykłady motywujące BibliotekaOpis interfejsu (API) Poprawność Wydajność Powiązane prace Próba wykorzystania Hoopl w pracy mgr
30 Warunki poprawności Porządek nie może mieć nieskończonych łańcuchówFunkcja 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
31 Plan Prezentacji 2 przykłady motywujące BibliotekaOpis interfejsu (API) Poprawność Wydajność Powiązane prace Próba wykorzystania Hoopl w pracy mgr
32 Wydajność „ciężko powiedzieć” Temat do zbadania / szukania usprawnieńHoopl wykorzystany w GHC Szybkość spadła o ok. 15%
33 Plan Prezentacji 2 przykłady motywujące BibliotekaOpis interfejsu (API) Poprawność Wydajność Powiązane prace Próba wykorzystania Hoopl w pracy mgr
34 Powiązane prace Podstawy teoretyczne – dobrze opracowanePraktyka, 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
35 Plan Prezentacji 2 przykłady motywujące BibliotekaOpis interfejsu (API) Poprawność Wydajność Powiązane prace Próba wykorzystania Hoopl w pracy mgr
36 Próba wykorzystania Hoopl do pracy mgrAbstrakcyjny język: Lukrecja Implementacja usuwania martwych przypisań Problemy Konwersja AST Lukrecji do AST (IR) w stylu Hoopl'a … i z powrotem
37 Próba wykorzystania Hoopl do pracy mgrKod w edytorze...
38 Próba wykorzystania Hoopl do pracy mgrWykorzystanie 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)
39 Podsumowanie
40 Hoopl – podsumowanie Biblioteka do optymalizacjiAlgorytm przeplatania analizy i transformacji Kontrola typów Abstrakcja Niezależny od analizowanego języka Funkcje pomagające pisać kod klienta Uproszczona implementacja
41 pytania?