Usprawnienie programowania z uzyciem typów w Glasgow Haskell
Transkrypt
Usprawnienie programowania z uzyciem typów w Glasgow Haskell
Politechnika Łódzka Usprawnienie programowania z użyciem typów w Glasgow Haskell Compiler Promotor Dyplomant dr inż. Jan Stolarek Michał Sośnicki 22 grudnia 2015 Kompilator main :: IO () main = do print " Hello world " Rysunek: Działanie kompilatora [2] 001 154 000 155 000 154 000 151 002 157 000 156 000 040 000 141 000 167 116 164 000 157 157 151 000 162 156 157 000 154 124 156 110 144 145 000 145 000 162 000 2 z 19 Michał Sośnicki - Praca inżynierska Kompilator Rysunek: Schemat GHC [3] Rysunek: Fragment schematu [3] 3 z 19 Michał Sośnicki - Praca inżynierska Type checker Poprawne programy Programy akceptowane przez type checker Wszystkie programy 4 z 19 Michał Sośnicki - Praca inżynierska Problematyka i zakres pracy • Dziedziną pracy jest informatyka, tworzenie kompilatorów. • Przedmiotem pracy jest usprawnienie obecnych mechanizmów programowania z użyciem typów w kompilatorze GHC. • Type checker to obecnie największy i aktywnie rozwijany komponent GHC[3]. Liczba poprawek i usprawnień czekających na wykonanie jest bardzo duża. 5 z 19 Michał Sośnicki - Praca inżynierska Cele pracy • Naprawienie błędów i dodanie nowych funkcji do kompilatora GHC, w częściach związanych z programowaniem z użyciem typów. • Zgłoszenie tych rozwiązań i doprowadzenie do ich akceptacji przez deweloperów GHC, by znalazły się w następnej wersji kompilatora. 6 z 19 Michał Sośnicki - Praca inżynierska Układ pracy 1. Wstęp 1.1 Kompilator 1.2 Type checker 1.3 Problematyka i zakres pracy 1.4 Cele pracy 1.5 Układ pracy 2. Programowanie z użyciem typów 2.1 Rodziny typów 2.2 Częściowe sygnatury typów 3. Technologie i narzędzia wykorzystane w pracy nad GHC 3.1 Technologie wykorzystane w pracy nad GHC 3.2 Narzędzia wykorzystane w pracy nad GHC 4. Usprawnienia dokonane w kompilatorze 4.1 Procedura dokonywania zmian w kodzie 4.2 Zgłoszenie 10839 4.3 Zgłoszenie 10982 4.4 Zgłoszenie 11098 5. Podsumowanie 5.1 Wyniki 5.2 Perspektywy rozwoju 6. Bibliografia 7 z 19 Michał Sośnicki - Praca inżynierska Rodziny typów Zwykła funkcja fib fib fib fib :: Int -> Int 0 = 1 1 = 1 n = fib ( n - 1) + fib ( n - 2) Funkcja na poziomie typów type family Swap a where Swap Int = Bool Swap Bool = Int Swap a = a number :: Swap Bool number = 100 -- czyli Int 8 z 19 Michał Sośnicki - Praca inżynierska Częściowe sygnatury typów add :: Int -> Int -> Int add x y = x + y -- brak s y g n a t u r y add x y = x + y Częściowa sygnatura z wildcardem ’ a’: add :: Int -> _a -> Int add x y = x + y - Found type wildcard ’_a ’ standing for ’Int ’ - In the type signature : add :: Int -> _a -> Int 9 z 19 Michał Sośnicki - Praca inżynierska Technologie wykorzystane w pracy nad GHC Rysunek: Logo języka Haskell 10 z 19 Michał Sośnicki - Praca inżynierska Narzędzia wykorzystane w pracy nad GHC Rysunek: Logo systemu kontroli wersji Git Rysunek: Logo zestawu narzędzi do pracy grupowej Phabricator Rysunek: Logo systemu do zarządzania projektami Trac Rysunek: Logo IDE IntelliJ IDEA 11 z 19 Michał Sośnicki - Praca inżynierska Procedura dokonywania zmian w kodzie[5] • Odnalezienie zgłoszenia w systemie Trac i zostanie jego właścicielem. • Dodanie testu sprawdzającego zamierzone efekty. • Zaimplementowanie usprawnienia. • Zgłoszenie patcha w systemie Phabricator, gdzie przejdzie on code review i automatyczną weryfikację przez testy. • Zamknięcie zgłoszenia w systemie Trac. 12 z 19 Michał Sośnicki - Praca inżynierska Zgłoszenie 10839 Consistent pretty-printing of type families Błędy generowane przed zmianami. Conflicting family instance declarations : F a -- Defined at Ex1 . hs :6:15 F a -- Defined at Ex1 . hs :7:15 ... In the RHS of type family equation : forall ( k :: BOX ) ( a :: k ) ( b :: k ). Gc a b = Int Overlapped type family instance equation : F a = Int 13 z 19 Michał Sośnicki - Praca inżynierska Zgłoszenie 10839 Consistent pretty-printing of type families Błędy generowane po zmianach. Conflicting family instance declarations : F a = a -- Defined at Ex1 . hs :6:15 F a = Int -- Defined at Ex1 . hs :7:15 ... In the type family equation : forall k ( a :: k ) ( b :: k ). Gc a b = Int -- Defined at Ex3 . hs :6:5 Type family instance equation is overlapped : F a = Int -- Defined at Ex2 . hs :7:5 14 z 19 Michał Sośnicki - Praca inżynierska Zgłoszenie 10982 Warn about unused pattern variables in type families Fragment kodu i ostrzeżenie generowane z flagą -fwarn-unused-matches. type family F a b type instance F a b = a Ex5 . hs :6:17: warning : Defined but not used : type variable ’b ’ Poprzedzenie lub zastąpienie nazwy podkreślnikiem ucisza kompilator. type family F a b type instance F a _b = a 15 z 19 Michał Sośnicki - Praca inżynierska Zgłoszenie 11098 PartialTypeSignatures mishandles type variables that begin with an underscore Poprawne programy wywoływały błąd kompilacji po uaktywnieniu rozszerzenia NamedWildCards. data A a _b = ACon a a -- " U n e x p e c t e d type ’_b ’ In the data d e c l a r a t i o n for ’A ’" type family D a b where D _a b = _a -> _a -- " W i l d c a rd ’_a ’ not allowed in a type pattern of family ins tance for ’D ’" 16 z 19 Michał Sośnicki - Praca inżynierska Wyniki Moja praca doprowadziła do rozwiązania i zamknięcia trzech zgłoszeń w systemie Trac GHC. Zmiany, które są wynikiem mojej pracy, to: • Ujednolicenie wyświetlania rodzin typów. • Generowanie ostrzeżeń o nieużywanych zmiennych typów. • Rozszerzenie NamedWildCards nie powoduje błędów kompilacji. 17 z 19 Michał Sośnicki - Praca inżynierska Perspektywy rozwoju • Zrealizowanie większego, trudniejszego projektu w GHC. Na liście zgłoszeń w Tracu jest wiele pomysłów. • Praca nad innymi częściami kompilatora: optymalizacje, generator kodu. 18 z 19 Michał Sośnicki - Praca inżynierska Bibliografia [1] Benjamin C. Pierce. Types and Programming Languages. The MIT Press, 2002. ISBN-10: 0-262-16209-8 [2] Aho, Lam, Sethi, Ullman. Compilers: Principles, Techniques, and Tools. Wyd. 2. Harlow: Pearson Education, Inc, 2006. ISBN-10 1-292-02434-8 [3] Amy Brown, Greg Wilson. The Architecture Of Open Source Applications, Volume II. lulu.com, 2008. ISBN-10: 1-105-57181-5 [4] Simon Peyton Jones. The Implementation of Functional Programming Languages. Prentice Hall, 1987. ISBN-10: 0-13-453325-9 [5] https://ghc.haskell.org/trac/ghc/wiki/ (stan na dzień 2015-12-17) 19 z 19 Michał Sośnicki - Praca inżynierska