Programowanie generyczne w C++
Transkrypt
Programowanie generyczne w C++
Programowanie generyczne w C++ Bardzo szablonowa prezentacja Grzegorz Mazur Zaklad Metod Obliczeniowych Chemii UJ 1 wrzesnia 2005 Plan Wstep , Szablony funkcji Szablony klas Metaprogramowanie Podsumowanie 1 Wstep , 2 Szablony funkcji 3 Szablony klas 4 Metaprogramowanie Co to jest? Przyklad Zastosowania 5 Podsumowanie Grzegorz Mazur Programowanie generyczne w C++ Plan Wstep , Szablony funkcji Szablony klas Metaprogramowanie Podsumowanie Slowniczek Programowanie generyczne Polega na mo_zliwosci deniowania abstrakcyjnych obiektow wyspecykowanych jedynie przez ich interfejsy i zachowania. Jezyk wspierajacy programowanie generyczne , , Pozwala na deniowanie typow ktore mo_zna wyspecjalizowac podajac im parametry ktore adaptuja, abstrakcyjne zachowanie dla , specycznej instancji. Grzegorz Mazur Programowanie generyczne w C++ Plan Wstep , Szablony funkcji Szablony klas Metaprogramowanie Podsumowanie Houston, mamy problem Potrzebujemy funkcji zwracajacej wieksz a, z dwoch liczb... , , Grzegorz Mazur Programowanie generyczne w C++ Plan Wstep , Szablony funkcji Szablony klas Metaprogramowanie Podsumowanie Houston, mamy problem Potrzebujemy funkcji zwracajacej wieksz a, z dwoch liczb... , , inline double return > max ( f g x y ? x double : x , double y) y ; Grzegorz Mazur Programowanie generyczne w C++ Plan Wstep , Szablony funkcji Szablony klas Metaprogramowanie Podsumowanie Houston, mamy problem Potrzebujemy funkcji zwracajacej wieksz a, z dwoch liczb... , , inline double return > max ( f g x y ? x double : x , double y) y ; Prawie dobrze... Grzegorz Mazur Programowanie generyczne w C++ Plan Wstep , Szablony funkcji Szablony klas Metaprogramowanie Podsumowanie Houston, mamy problem Potrzebujemy funkcji zwracajacej wieksz a, z dwoch liczb... , , inline double return > max ( f g x y ? x double : x , double y) y ; Prawie dobrze... ale to nie zadziala poprawnie dla innych typow Grzegorz Mazur Programowanie generyczne w C++ Plan Wstep , Szablony funkcji Szablony klas Metaprogramowanie Podsumowanie To mo_ze makro? Proste, prawda? #define max ( x , y) (( x) > Grzegorz Mazur (y) ? (x) : (y )) Programowanie generyczne w C++ Plan Wstep , Szablony funkcji Szablony klas Metaprogramowanie Podsumowanie To mo_ze makro? Proste, prawda? #define max ( x , y) (( x) > (y) ? (x) : (y )) Tylko co sie, stanie je_zeli napiszemy int int int i = 0 , j = 1; i = 0 , j = 1; k = max ( i , j ++); Grzegorz Mazur Programowanie generyczne w C++ Plan Wstep , Szablony funkcji Szablony klas Metaprogramowanie Podsumowanie To mo_ze makro? Proste, prawda? #define max ( x , y) (( x) > (y) ? (x) : (y )) Tylko co sie, stanie je_zeli napiszemy int int int i = 0 , j = 1; i = 0 , j = 1; k = max ( i , j ++); Oczywiscie k=2 Grzegorz Mazur Programowanie generyczne w C++ Plan Wstep , Szablony funkcji Szablony klas Metaprogramowanie Podsumowanie To mo_ze makro? Proste, prawda? #define max ( x , y) (( x) > (y) ? (x) : (y )) Tylko co sie, stanie je_zeli napiszemy int int int i = 0 , j = 1; i = 0 , j = 1; k = max ( i , j ++); Oczywiscie k=2 Nie jest to nie jedyny problem, wiec z makro odpada , Grzegorz Mazur Programowanie generyczne w C++ Plan Wstep , Szablony funkcji Szablony klas Metaprogramowanie Podsumowanie And the winner is... Prosze, Panstwa, oto szablon template <typename > inline f return > T T g max ( T x , x ? y T x y) : y ; Grzegorz Mazur Programowanie generyczne w C++ Plan Wstep , Szablony funkcji Szablony klas Metaprogramowanie Podsumowanie And the winner is... Prosze, Panstwa, oto szablon template <typename > inline f return > T T g max ( T x , x ? y T x y) : y ; a oto instancja szablonu int int int i = 0; j = 1; k = max ( i , j ++); Grzegorz Mazur Programowanie generyczne w C++ Plan Wstep , Szablony funkcji Szablony klas Metaprogramowanie Podsumowanie Przede wszystkim zrozumiec Szablon to... Szablon funkcji to przepis na funkcje, Instancja szablonu to funkcja Grzegorz Mazur Programowanie generyczne w C++ Plan Wstep , Szablony funkcji Szablony klas Metaprogramowanie Podsumowanie Przede wszystkim zrozumiec Szablon to... Szablon funkcji to przepis na funkcje, Instancja szablonu to funkcja Analogia Funkcja to przepis na wykonanie obliczen Wywolanie funkcji generuje wynik obliczen wykonanych wedlug podanego przepisu Grzegorz Mazur Programowanie generyczne w C++ Plan Wstep , Szablony funkcji Szablony klas Metaprogramowanie Podsumowanie Przede wszystkim zrozumiec Szablon to... Szablon funkcji to przepis na funkcje, Instancja szablonu to funkcja Analogia Funkcja to przepis na wykonanie obliczen Wywolanie funkcji generuje wynik obliczen wykonanych wedlug podanego przepisu Tylko z_ e... W przypadku szablonow wykonanie nastepuje w czasie , kompilacji Wynikiem oblicze n jest funkcja Grzegorz Mazur Programowanie generyczne w C++ Plan Wstep , Szablony funkcji Szablony klas Metaprogramowanie Podsumowanie Argumenty szablonu I Typy, oznaczane slowem kluczowym (w tym kontekscie to synonimy) typename lub class template <typename > T T max ( T x , T y) // . . . template < class > T T min (T x , T y) // . . . Stale typow integralnych, oznaczane odpowiednim typem template < int > double double N power ( x) Grzegorz Mazur // . . . Programowanie generyczne w C++ Plan Wstep , Szablony funkcji Szablony klas Metaprogramowanie Podsumowanie Argumenty szablonu II Oczywiscie argumentow mo_ze byc wiecej , template <typename typename > const const template < int typename > T, T dot product ( T p o w e r (T N, x) V V& , // V&) // . . . T . . . Argumenty moga, miec wartosci domyslne template <typename T blocked dot template <typename T2 c o s t a m ( T1 T, product ( x) // T1 , typename int const const typename int > V, BS V& , T2 = . . . Grzegorz Mazur = V&) Programowanie generyczne w C++ 32 // > . . . Plan Wstep , Szablony funkcji Szablony klas Metaprogramowanie Podsumowanie Instancje, parametry, o rany Parametry przy tworzeniu instancji moga, byc Jawnie wyspecykowane x2 = power < 2, double > (x ) ; Wziete ze specykacji wartosci domyslnych , Wydedukowane z kontekstu z = max ( x , y ); Grzegorz Mazur Programowanie generyczne w C++ Plan Wstep , Szablony funkcji Szablony klas Metaprogramowanie Podsumowanie Specjalizacja szablon ow I Powiedzmy, z_ e mamy funkcje, template <typename > inline bool f return < true T l e s s (T g x y x , ? T : y) false ; To zadziala dobrze dla typow takich jak int czy double Ale dla np. char* da nieoczekiwany wynik Czyli dla char* potrzebujemy inna, implementacje, Umo_zliwia to mechanizm specjalizacji szablonow Grzegorz Mazur Programowanie generyczne w C++ Plan Wstep , Szablony funkcji Szablony klas Metaprogramowanie Podsumowanie Specjalizacja szablon ow II Specjalizacja polega na tym, z_ e oprocz zdeniowania ogolnego przypadku, deniujemy jeden lub wiecej przypadkow , szczegolnych template <> inline bool f return g less ( const char * strcmp ( x , y) < x , const char * 0; Kompilator zawsze wybierze najbardziej wyspecjalizowany szablon do stworzenia danej instancji Grzegorz Mazur Programowanie generyczne w C++ y) Plan Wstep , Szablony funkcji Szablony klas Metaprogramowanie Podsumowanie Jeden problem to nie problem Potrzebujemy klase, implementujac a, stos , Grzegorz Mazur Programowanie generyczne w C++ Plan Wstep , Szablony funkcji Szablony klas Metaprogramowanie Podsumowanie Jeden problem to nie problem Potrzebujemy klase, implementujac a, stos , class public bool void void double Stack f : Stack ( ) ; const double const empty ( ) push ( ; ); pop ( ) ; g top ( ) ; // . . . ; Grzegorz Mazur Programowanie generyczne w C++ Plan Wstep , Szablony funkcji Szablony klas Metaprogramowanie Podsumowanie Jeden problem to nie problem Potrzebujemy klase, implementujac a, stos , class public bool void void double Stack f : Stack ( ) ; const double const empty ( ) push ( ; ); pop ( ) ; g top ( ) ; // . . . ; Prawie dobrze... To nie zadziala poprawnie dla innych typow Grzegorz Mazur Programowanie generyczne w C++ Plan Wstep , Szablony funkcji Szablony klas Metaprogramowanie Podsumowanie Jeden problem to nie problem Potrzebujemy klase, implementujac a, stos , class public bool void void double Stack f : Stack ( ) ; const double const empty ( ) push ( ; ); pop ( ) ; g top ( ) ; // . . . ; Prawie dobrze... To nie zadziala poprawnie dla innych typow Czyli potrzebujemy szablonow klas Grzegorz Mazur Programowanie generyczne w C++ Plan Wstep , Szablony funkcji Szablony klas Metaprogramowanie Podsumowanie Szablon klasy I Denicja template <typename > class f public bool const void const void const const T Stack : Stack ( ) ; empty ( ) push ( ; T& ) ; pop ( ) ; T& g top ( ) ; // . . . ; Grzegorz Mazur Programowanie generyczne w C++ Plan Wstep , Szablony funkcji Szablony klas Metaprogramowanie Podsumowanie Szablon klasy II Przyklad u_zycia Stack <int > typedef s1 ; s1 . push ( 1 ) ; Stack DoubleStack <double > DoubleStack ; s2 ; s2 . push ( s1 . top ( ) ) ; s 1 . pop ( ) ; Grzegorz Mazur Programowanie generyczne w C++ Plan Wstep , Szablony funkcji Szablony klas Metaprogramowanie Podsumowanie Podobie nstwa i r oz_ nice pomiedzy szablonami klas i funkcji , Podobienstwa Tak jak szablon funkcji jest przepisem na funkcje, szablon , klasy jest przepisem na klase, Instancja szablonu klasy to klasa Do argumentow szablonu klasy stosuja, sie dokladnie te same zasady co do argumentow szablonu funkcji Specjalizacja szablonow klas przebiega wedlug dokladnie tych samych regul co specjalizacja szablonow funkcji Roz_ nice W przeciwienstwie do parametrow szablonu funkcji, parametry szablonu klasy nie moga, byc wydedukowane z kontekstu Grzegorz Mazur Programowanie generyczne w C++ Plan Wstep , Szablony funkcji Szablony klas Metaprogramowanie Co to jest? Przyklad Zastosowania Podsumowanie Alfa, Meta, ... Metaprogramowanie Technika programowania w ktorej szablony sa, u_zywane w taki sposob, z_ e kompilator w trakcie kompilacji kodu wykonuje program. Grzegorz Mazur Programowanie generyczne w C++ Plan Wstep , Szablony funkcji Szablony klas Metaprogramowanie Co to jest? Przyklad Zastosowania Podsumowanie Alfa, Meta, ... Metaprogramowanie Technika programowania w ktorej szablony sa, u_zywane w taki sposob, z_ e kompilator w trakcie kompilacji kodu wykonuje program. Specyka metaprogramowania Szablony tworza, system zupelny w rozumieniu Turinga Programowanie w paradygmacie funkcjonalnym Grzegorz Mazur Programowanie generyczne w C++ Plan Wstep , Szablony funkcji Co to jest? Przyklad Szablony klas Zastosowania Metaprogramowanie Podsumowanie Obliczanie silni na etapie kompilacji Rekurencja template < int > struct f static const int N f a c t o r i a l g N * factorial < value N 1 > = :: v a l u e ; ; Warunek koncowy template <> struct <> f static const int factorial g 0 value = 1; ; Grzegorz Mazur Programowanie generyczne w C++ Plan Wstep , Szablony funkcji Co to jest? Przyklad Szablony klas Zastosowania Metaprogramowanie Podsumowanie Jak tego u_zyc const int const int f3 = factorial f6 = factorial Grzegorz Mazur < > < > 3 :: v a l u e ; 6 :: v a l u e ; Programowanie generyczne w C++ Plan Wstep , Szablony funkcji Co to jest? Przyklad Szablony klas Zastosowania Metaprogramowanie Podsumowanie Jak to dziala Generacja instancji szablonu factorial<3> powoduje generacje, instancji szablonu factorial<2> Generacja instancji szablonu factorial<2> powoduje generacje, instancji szablonu factorial<1> Generacja instancji szablonu factorial<1> powoduje generacje, instancji szablonu factorial<0> Rekurencja ulega przerwaniu, czyli jest efektywnie denicja jest rozwinieta do , factorial 3 * < > 3 :: v a l u e factorial = < > < > factorial 2 1 :: v a l u e :: v a l u e Grzegorz Mazur * * factorial < > 0 Programowanie generyczne w C++ :: v a l u e ; Plan Wstep , Szablony funkcji Szablony klas Metaprogramowanie Co to jest? Przyklad Zastosowania Podsumowanie Expression templates Wezmy wyra_zenie x = a * (b + c); Je_zeli a, b, c sa, typu prostego, kompilator wygeneruje efektywny kod Je_zeli a, b, c nie sa, typu prostego, kompilator nie ma szans na wygenerowanie optymalnego kodu Problem jest nieunikniony przy implementacji np algebry liniowej Rozwiazanie polega na generacji (na etapie kompilacji) parsera , ktory wygeneruje optymalny kod Grzegorz Mazur Programowanie generyczne w C++ Plan Wstep , Szablony funkcji Szablony klas Metaprogramowanie Co to jest? Przyklad Zastosowania Podsumowanie Inne zastosowania Loop unrolling (MTL) Generacja parserow (Boost.Spirit) Generacja interfejsow do Pythona (Boost.Python) ... Grzegorz Mazur Programowanie generyczne w C++ Plan Wstep , Szablony funkcji Szablony klas Metaprogramowanie Podsumowanie Szablony sa, fajne Sa, naturalnym (i bardzo mocnym) uogolnieniem jezyka , z silnym typowaniem Umo_zliwiaja, tworzenie ogolnego a zarazem wydajnego kodu Metaprogramowanie pozwala wyjsc poza ograniczenia jezyka , Grzegorz Mazur Programowanie generyczne w C++ Plan Wstep , Szablony funkcji Szablony klas Metaprogramowanie Podsumowanie There's no free lunch Problemy z szablonami Wzrost rozmiaru kodu Wydluzenie _ czasu kompilacji Dodatkowe skomplikowanie jezyka , Kompletnie nieczytelna diagnostyka Pomimo to, szablony stanowia, pote_ zne i bardzo u_zyteczne , narzedzie, a ich zalety zdecydowanie przewa_zaja, nad wadami , Grzegorz Mazur Programowanie generyczne w C++