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++