Professional Documents
Culture Documents
PRZYKADOWY ROZDZIA
SPIS TRECI
KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG
TWJ KOSZYK
Jzyk C++.
Metaprogramowanie
za pomoc szablonw
Autorzy: David Abrahams, Aleksey Gurtovoy
Tumaczenie: Rafa Joca
ISBN: 83-7361-935-6
Tytu oryginau: C++ Template Metaprogramming:
Concepts, Tools, and Techniques from Boost and Beyond
Format: B5, stron: 336
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK
CZYTELNIA
FRAGMENTY KSIEK ONLINE
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
Spis treci
Przedmowa ....................................................................................... 7
Podzikowania .................................................................................. 9
Struktura ksiki ............................................................................ 11
Rozdzia 1. Wprowadzenie ................................................................................ 13
1.1. Zaczynamy ............................................................................................................. 13
1.2. Czym jest metaprogram? ....................................................................................... 14
1.3. Metaprogramowanie w jzyku macierzystym ........................................................ 15
1.4. Metaprogramowanie w jzyku C++ ....................................................................... 15
1.5. Dlaczego metaprogramowanie? ............................................................................. 18
1.6. Kiedy stosowa metaprogramowanie? ................................................................... 20
1.7. Dlaczego biblioteka metaprogramowania? ............................................................ 20
Spis treci
Spis treci
Rozdzia 1.
Wprowadzenie
Warto potraktowa ten rozdzia jako rozgrzewk przed pozosta czci ksiki.
Przewiczymy tutaj najwaniejsze narzdzia, a take zapoznamy si z podstawowymi
pojciami i terminologi. Pod koniec rozdziau kady powinien ju mniej wicej wiedzie, o czym jest niniejsza ksika, i by godnym kolejnych informacji.
1.1. Zaczynamy
Jedn z przyjemnych kwestii zwizanych z metaprogramowaniem szablonami jest
wspdzielenie pewnej waciwoci z tradycyjnymi, starymi systemami. Po napisaniu
metaprogramu mona go uywa bez zastanawiania si nad jego szczegami
oczywicie o ile wszystko dziaa prawidowo.
Aby uwiadomi kademu, e przedstawiona kwestia to nie tylko wymylna teoria,
prezentujemy prosty program C++, ktry po prostu uywa elementu zaimplementowanego jako metaprogram szablonu.
Nawet jeli jest si dobrym w arytmetyce binarnej i od razu mona odgadn wynik
dziaania programu bez jego uruchamiania, warto zada sobie ten trud i go skompilowa oraz uruchomi. Poza upewnieniem si w kwestii samej koncepcji, jest to dobry
test sprawdzajcy, czy wykorzystywany kompilator potrafi obsuy kod przedstawiany w ksice. Wynikiem dziaania programu powinno by wywietlenie na standardowym wyjciu wartoci dziesitnej liczby binarnej 101010:
#$
Rozdzia 1. Wprowadzenie
14
Program YACC wygeneruje plik rdowy jzyka C++ zawierajcy (poza wieloma
innymi elementami) funkcj , ktr wywouje si w celu przeanalizowania
tekstu zgodnie z podan gramatyk i wykonania okrelonych dziaa2.
% !
!
"
Uytkownicy programu YACC dziaaj przede wszystkim w dziedzinie projektowania analizatorw skadniowych, wic jzyk YACC mona nazwa jzykiem specjalistycznym (dziedzinowym). Poniewa pozostaa cz gwnego programu wymaga
zastosowania oglnego jzyka programowania i musi si komunikowa z analizatorem skadniowym, YACC konwertuje jzyk specjalistyczny na jzyk macierzysty, C,
ktry uytkownik kompiluje i konsoliduje z pozostaym kodem. Jzyk specjalistyczny
przechodzi wic przez dwa kroki przeksztace, a uytkownik bardzo dobrze zna granic midzy nim a pozosta czci programu gwnego.
1
W filozofii, podobnie jak w programowaniu, przedrostek meta oznacza o lub o jeden poziom
opisowy wyej. Wynika to z oryginalnego greckiego znaczenia ponad lub poza.
Oczywicie trzeba jeszcze zaimplementowa odpowiedni funkcj % dokonujc rozbioru tekstu.
W rozdziale 10. znajduje si peny przykad. Ewentualnie warto zajrze do dokumentacji programu YACC.
15
1.3. Metaprogramowanie
w jzyku macierzystym
YACC to przykad translatora metaprogramu, ktrego jzyk specjalistyczny rni
si od jzyka macierzystego. Bardziej interesujca posta metaprogramowania jest
dostpna w jzykach takich jak Scheme [SS75]. Programista metaprogramu Scheme
definiuje wasny jzyk specjalistyczny jako podzbir dopuszczalnych programw samego jzyka Scheme. Metaprogram wykonuje si w tym samym kroku przeksztace
co pozostaa cz programu uytkownika. Programici czsto przemieszczaj si
midzy typowym programowaniem, metaprogramowaniem i pisaniem jzykw specjalistycznych, nawet tego nie dostrzegajc. Co wicej, potrafi w sposb niemale
nierozrnialny scali w tym samym systemie wiele dziedzin.
Co ciekawe, kompilator C++ zapewnia niemale dokadnie tak sam uyteczno
metaprogramowania jak przedstawiony wczeniej przykad. Pozostaa cz ksiki
omawia odblokowywanie siy tkwicej w szablonach i opisuje sposoby jej uycia.
Rozdzia 1. Wprowadzenie
16
specjalizacja
przerywa rekurencj
5 * !
"!
5 *
5 *
5 - *
5 *
5 *
!
!
!
!
!
Jeeli kto zastanawia si, gdzie jest program, proponujemy rozway, co si stanie
w momencie prby dostpu do zagniedonej skadowej
z
. Tworzy si egzemplarze szablonu
z coraz to mniejszymi a do osignicia przez
zera. Warunkiem koca jest specjalizacja. Innymi sowy, przypomina to dziaanie
funkcji rekurencyjnej. Czy jest to program czy moe funkcja? Oglnie rzecz biorc,
kompilator zinterpretuje ten krtki metaprogram.
Sprawdzanie bdw
Nic nie stoi na przeszkodzie, aby uytkownik przekaza do
warto 678,
ktra nie jest poprawn wartoci binarn. Wynik na pewno nie bdzie sensowny
(zostanie wykonane dziaanie 622+721+820), a przekazanie wartoci 678 na pewno
wskazuje bd uytkownika. W rozdziale 3. przedstawimy rozwizanie zapewniajce, i
skompiluje si tylko wtedy, gdy reprezentacja dziesitna bdzie
si skadaa tylko z samych zer i jedynek.
17
- 06
(* !
"
!
"
Kade przypisanie zapamituje obiekt funkcji, ktry analizuje i oblicza element gramatyki podany po prawej stronie. Zachowanie kadego zapamitanego obiektu funkcyjnego
18
Rozdzia 1. Wprowadzenie
w momencie wywoania jest w peni okrelone jedynie przez typ wyraenia uytego
do jego wykonania. Typ kadego wyraenia jest obliczany przez metaprogram
zwizany z poszczeglnymi operatorami.
Podobnie jak YACC biblioteka Spirit jest metaprogramem generujcym analizatory
skadniowe dla podanej gramatyki. Jednak w odrnieniu od YACC Spirit definiuje
swj jzyk specjalistyczny jako podzbir samego jzyka C++. Jeli jeszcze nie dostrzegasz tego powizania, nic nie szkodzi. Po przeczytaniu niniejszej ksiki na
pewno wszystko stanie si oczywiste.
19
Rozdzia 1. Wprowadzenie
20
21