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