Bardzo szablonowa prezentacja Zak lad Metod Obliczeniowych Chemii UJ 1 wrzesnia 2005
1 2 3 4 Co to jest? Przyk lad Zastosowania 5
S lowniczek Plan Programowanie generyczne Polega na mo_zliwosci deniowania abstrakcyjnych obiektow wyspecykowanych jedynie przez ich interfejsy i zachowania. J ezyk wspieraj acy programowanie generyczne Pozwala na deniowanie typow ktore mo_zna wyspecjalizowac podaj ac im parametry ktore adaptuj a abstrakcyjne zachowanie dla specycznej instancji.
Houston mamy problem Potrzebujemy funkcji zwracaj acej wi eksz a z dwoch liczb...
Houston mamy problem Potrzebujemy funkcji zwracaj acej wi eksz a z dwoch liczb... i n l i n e double max ( double x double y ) f g r e t u r n x > y? x : y ;
Houston mamy problem Potrzebujemy funkcji zwracaj acej wi eksz a z dwoch liczb... i n l i n e double max ( double x double y ) f g r e t u r n x > y? x : y ; Prawie dobrze...
Houston mamy problem Potrzebujemy funkcji zwracaj acej wi eksz a z dwoch liczb... i n l i n e double max ( double x double y ) f g r e t u r n x > y? x : y ; Prawie dobrze... ale to nie zadzia la poprawnie dla innych typow
To mo_ze makro? Plan Proste prawda? #d e f i n e max ( x y ) ( ( x ) > ( y )? ( x ) : ( y ) )
To mo_ze makro? Plan Proste prawda? #d e f i n e max ( x y ) ( ( x ) > ( y )? ( x ) : ( y ) ) Tylko co si e stanie je_zeli napiszemy i n t i = 0 j = 1 ; i n t i = 0 j = 1 ; i n t k = max ( i j ++);
To mo_ze makro? Plan Proste prawda? #d e f i n e max ( x y ) ( ( x ) > ( y )? ( x ) : ( y ) ) Tylko co si e stanie je_zeli napiszemy i n t i = 0 j = 1 ; i n t i = 0 j = 1 ; i n t k = max ( i j ++); Oczywiscie k=2
To mo_ze makro? Plan Proste prawda? #d e f i n e max ( x y ) ( ( x ) > ( y )? ( x ) : ( y ) ) Tylko co si e stanie je_zeli napiszemy i n t i = 0 j = 1 ; i n t i = 0 j = 1 ; i n t k = max ( i j ++); Oczywiscie k=2 Nie jest to nie jedyny problem wi ec z makro odpada
And the winner is... Prosz e Panstwa oto szablon template <typename T> i n l i n e T max (T x T y ) f g r e t u r n x > y? x : y ;
And the winner is... Prosz e Panstwa oto szablon template <typename T> i n l i n e T max (T x T y ) f g r e t u r n x > y? x : y ; a oto instancja szablonu i n t i = 0 ; i n t j = 1 ; i n t k = max ( i j ++);
Przede wszystkim zrozumiec Szablon to... Szablon funkcji to przis na funkcj e Instancja szablonu to funkcja
Przede wszystkim zrozumiec Szablon to... Analogia Szablon funkcji to przis na funkcj e Instancja szablonu to funkcja Funkcja to przis na wykonanie obliczen Wywo lanie funkcji generuje wynik obliczen wykonanych wed lug podanego przisu
Przede wszystkim zrozumiec Szablon to... Analogia Szablon funkcji to przis na funkcj e Instancja szablonu to funkcja Funkcja to przis na wykonanie obliczen Wywo lanie funkcji generuje wynik obliczen wykonanych wed lug podanego przisu Tylko _ze... W przypadku szablonow wykonanie nast uje w czasie kompilacji Wynikiem obliczen jest funkcja
Argumenty szablonu I Typy oznaczane s lowem kluczowym typename lub class (w tym kontekscie to synonimy) template <typename T> T max (T x T y ) //... template <c l a s s T> T min (T x T y ) //... Sta le typow integralnych oznaczane odpowiednim typem template <i n t N> double power ( double x ) //...
Argumenty szablonu II Oczywiscie argumentow mo_ze byc wi ecej template <typename T typename V> T d o t p r o d u c t ( const V& const V&) //... template <i n t N typename T> T power (T x ) //... Argumenty mog a miec wartosci domyslne template <typename T typename V i n t BS = 32> T b l o c k e d d o t p r o d u c t ( const V& const V&) //... template <typename T1 typename T2 = i n t > T2 costam (T1 x ) //...
Instancje parametry o rany Parametry przy tworzeniu instancji mog a byc Jawnie wyspecykowane x2 = power <2 double >(x ) ; Wzi ete ze specykacji wartosci domyslnych Wydedukowane z kontekstu z = max ( x y ) ;
Specjalizacja szablonow I Powiedzmy _ze mamy funkcj e template <typename T> i n l i n e bool l e s s (T x T y ) f g r e t u r n x < y? true : f a l s e ; To zadzia la dobrze dla typow takich jak int czy double Ale dla np. char* da nieoczekiwany wynik Czyli dla char* potrzebujemy inn a implementacj e Umo_zliwia to mechanizm specjalizacji szablonow
Specjalizacja szablonow II Specjalizacja polega na tym _ze oprocz zdeniowania ogolnego przypadku deniujemy jeden lub wi ecej przypadkow szczegolnych template <> i n l i n e bool l e s s ( const char * x const char * y ) f g r e t u r n strcmp ( x y ) < 0 ; Kompilator zawsze wybierze najbardziej wyspecjalizowany szablon do stworzenia danej instancji
Jeden problem to nie problem Potrzebujemy klas e implementuj ac a stos
Jeden problem to nie problem Potrzebujemy klas e implementuj ac a stos c l a s s Stack f p u b l i c : Stack ( ) ; bool empty ( ) const ; void push ( double ) ; void pop ( ) ; double top ( ) const ; //... g ;
Jeden problem to nie problem Potrzebujemy klas e implementuj ac a stos c l a s s Stack f p u b l i c : Stack ( ) ; bool empty ( ) const ; void push ( double ) ; void pop ( ) ; double top ( ) const ; //... g ; Prawie dobrze... To nie zadzia la poprawnie dla innych typow
Jeden problem to nie problem Potrzebujemy klas e implementuj ac a stos c l a s s Stack f p u b l i c : Stack ( ) ; bool empty ( ) const ; void push ( double ) ; void pop ( ) ; double top ( ) const ; //... g ; Prawie dobrze... To nie zadzia la poprawnie dla innych typow Czyli potrzebujemy szablonow klas
Szablon klasy I Plan Denicja template <typename T> c l a s s Stack f p u b l i c : Stack ( ) ; bool empty ( ) const ; void push ( const T&); void pop ( ) ; const T& top ( ) const ; //... g ;
Szablon klasy II Plan Przyk lad u_zycia Stack<i n t> s1 ; s1. push ( 1 ) ; typedef Stack<double> DoubleStack ; DoubleStack s2 ; s2. push ( s1. top ( ) ) ; s1. pop ( ) ;
Podobienstwa i ro_znice pomi edzy szablonami klas i funkcji Podobienstwa Tak jak szablon funkcji jest przisem na funkcj e szablon klasy jest przisem na klas e Instancja szablonu klasy to klasa Do argumentow szablonu klasy stosuj a sie dok ladnie te same zasady co do argumentow szablonu funkcji Specjalizacja szablonow klas przebiega wed lug dok ladnie tych samych regu l co specjalizacja szablonow funkcji Ro_znice W przeciwienstwie do parametrow szablonu funkcji parametry szablonu klasy nie mog a byc wydedukowane z kontekstu
Alfa Meta... Plan Co to jest? Przyk lad Zastosowania Technika programowania w ktorej szablony s a u_zywane w taki sposob _ze kompilator w trakcie kompilacji kodu wykonuje program.
Alfa Meta... Plan Co to jest? Przyk lad Zastosowania Technika programowania w ktorej szablony s a u_zywane w taki sposob _ze kompilator w trakcie kompilacji kodu wykonuje program. Specyka metaprogramowania Szablony tworz a system zupe lny w rozumieniu Turinga Programowanie w paradygmacie funkcjonalnym
Co to jest? Przyk lad Zastosowania Obliczanie silni na etapie kompilacji Rekurencja template <i n t N> s t r u c t f a c t o r i a l f s t a t i c const i n t v a l u e = N * f a c t o r i a l <N 1 >:: v a l u e ; g ; Warunek koncowy template <> s t r u c t f a c t o r i a l <0> f s t a t i c const i n t v a l u e = 1 ; g ;
Jak tego u_zyc Plan Co to jest? Przyk lad Zastosowania const i n t f 3 = f a c t o r i a l <3>:: v a l u e ; const i n t f 6 = f a c t o r i a l <6>:: v a l u e ;
Jak to dzia la Plan Co to jest? Przyk lad Zastosowania Generacja instancji szablonu factorial<3> powoduje generacj e instancji szablonu factorial<2> Generacja instancji szablonu factorial<2> powoduje generacj e instancji szablonu factorial<1> Generacja instancji szablonu factorial<1> powoduje generacj e instancji szablonu factorial<0> Rekurencja ulega przerwaniu czyli jest efektywnie denicja jest rozwini eta do f a c t o r i a l <3>:: v a l u e = 3 * f a c t o r i a l <2>:: v a l u e * f a c t o r i a l <1>:: v a l u e * f a c t o r i a l <0>:: v a l u e ;
Expression templates Plan Co to jest? Przyk lad Zastosowania Wezmy wyra_zenie x = a * (b + c); Je_zeli a b c s a typu prostego kompilator wygeneruje efektywny kod Je_zeli a b c nie s a typu prostego kompilator nie ma szans na wygenerowanie optymalnego kodu Problem jest nieunikniony przy implementacji np algebry liniowej Rozwi azanie polega na generacji (na etapie kompilacji) parsera ktory wygeneruje optymalny kod
Inne zastosowania Plan Co to jest? Przyk lad Zastosowania Loop unrolling (MTL) Generacja parserow (Boost.Spirit) Generacja interfejsow do Pythona (Boost.Python)...
Szablony s a fajne Plan S a naturalnym (i bardzo mocnym) uogolnieniem j ezyka z silnym typowaniem Umo_zliwiaj a tworzenie ogolnego a zarazem wydajnego kodu pozwala wyjsc poza ograniczenia j ezyka
There's no free lunch Plan Problemy z szablonami Wzrost rozmiaru kodu Wyd lu_zenie czasu kompilacji Dodatkowe skomplikowanie j ezyka Kompletnie nieczytelna diagnostyka Pomimo to szablony stanowi a pot e_zne i bardzo u_zyteczne narz edzie a ich zalety zdecydowanie przewa_zaj a nad wadami