12
A C++ template metaprogramoz´ as ´ es a funkcion´ alis programoz´ as kapcsolata Doktori ´ ertekez´ es t´ ezisei 2013 Sinkovics ´ Abel [email protected] emavezet˝o: Porkol´ ab Zolt´ an, egyetemi docens otv¨osLor´andTudom´ anyegyetem, Informatika kar, 1117 Budapest, P´ azm´ any P´ eter s´ et´ any 1/C ELTE IK Doktori Iskola Doktori program: Az informatika alapjai ´ es m´ odszertana Az iskola vezet˝oje: Dr. Bencz´ ur Andr´ as akad´ emikus A doktori program vezet˝oje: Dr. Demetrovics J´anos akad´ emikus

A C++ template metaprogramoz´as ´es a funkcion´alis ... · A C++ template metaprogramoz´as ´es a ... mely a szabva´nyt ko¨veti k´epes ´ertelmezni ´es v´egrehajtani

  • Upload
    dohanh

  • View
    213

  • Download
    0

Embed Size (px)

Citation preview

A C++ template metaprogramozas es a

funkcionalis programozas kapcsolata

Doktori ertekezes tezisei2013

Sinkovics Abel

[email protected]

Temavezeto: Porkolab Zoltan, egyetemi docens

Eotvos Lorand Tudomanyegyetem, Informatika kar,1117 Budapest, Pazmany Peter setany 1/C

ELTE IK Doktori IskolaDoktori program: Az informatika alapjai es modszertanaAz iskola vezetoje: Dr. Benczur Andras akademikusA doktori program vezetoje: Dr. Demetrovics Janos akademikus

A projekt az Europai Unio tamogatasaval, az Europai Szocialis Alap tarsfinanszırozasaval

valosul meg (a tamogatas szama TAMOP 4.2.1./B-09/1/KMR-2010-0003).

2

1. Bevezetes

A dolgozat C++ template metaprogramozast segıto modszereket mutat be,melyek a C++ konyvtarak es alkalmazasok fejlesztoit tamogatjak. A dolgo-zat azon fejlesztok szamara keszult, akik mar ismerik a C++ programozasinyelvet.

1994-ben Erwin Unruh bemutatta [32], hogy lehetseges egy C++ fordıtosegıtsegevel, template peldanyosıtasok mellekhatasakent algoritmusokat veg-rehajtani. Az ezen a modszeren alapulo programokat C++ template meta-programoknak hıvjak. Ezek egy Turing-teljes resznyelvet alkotjak a C++-nak[35]. A metaprogramokat a fejlesztok tobbsege nem kozvetlenul hasznalja,hanem metaprogramokon alapulo konyvtarakon keresztul. Mivel a temp-late metaprogramok fordıtasi idoben kerulnek vegrehajtasra, segıtsegukkel aC++ nyelvnek szamos kiterjeszteset meg lehet valosıtani a fordıto modosıtasanelkul.

• Specialis alkalmazasi teruletet (adatbazis eleres, regularis kifejezesek,stb.) tamogato C++ konyvtarak szamara hasznos ha az alkalmazasiterulettel kapcsolatos hibakat (adatbazis mezoinek tıpusaival kapcsola-tos hibak, hibas regularis kifejezesek, stb.) mar fordıtasi idoben jeleznilehet. Template metaprogramok segıtsegevel megvalosıthatok ilyen el-lenorzesek [7].

• A domen specifikus nyelvek (DSL) [6] egyre nepszerubbek. Ezek egy-szeru nyelvek, melyeket egy adott terulet szamara fejlesztettek ki. Azona teruleten hatekonyabbak, mint mas nyelvek, viszont mas teruletekenhasznalhatatlanok. Vannak szeles korben ismert es hasznalt domenspecifikus nyelvek, mint peldaul az SQL vagy a regularis kifejezesek.Ezeket a nyelveket egy (vagy tobb) altalanos celu programozasi nyelv-vel egyutt szoktak hasznalni. A DSL altal lefedett teruletre specifi-kus reszeit a programnak a DSL-ben, a tobbi reszt pedig az altalanoscelu nyelven szoktak megırni. Amikor a DSL-ben ırt kodreszleteketbeagyazzak az altalanos celu nyelven ırt kodba, beagyazott DSL-ekrol(EDSL) beszelunk. Template metaprogramok segıtsegevel DSL-ek ha-tekonyan beagyazhatok a C++ nyelvbe [27].

• A fejlesztok gyakran kenytelenek ismetlodo, csupan keves reszletbenkulonbozo kodot ırni. Az esetek tobbsegeben ezeket a kodreszleteketmeglevo kod masolasaval es modosıtasaval keszıtik el. Template meta-programok hasznalataval elerheto, hogy a C++ fordıto generalja ezeketa kodreszleteket [1].

2

• A C++ fordıtok optimalizaljak a kodot, hogy gyorsabban fusson vagykevesebb memoriat hasznaljon. Azonban a fordıto csak olyan opti-malizaciokat hajthat vegre, melyek a kod mukodeset nem valtoztatjakmeg. Sok esetben ennel hatekonyabb optimalizaciokat is el lehet vegezniazon alkalmazasi teruletnek es annak szabalyszerusegeinek ismereteben,mely szamara a program keszult. Ezeket a fordıto nem ismeri, azon-ban ezek a optimalizaciok template metaprogramok segıtsegevel meg-valosıthatok [34, 36, 33].

• Amikor uj elemek kerulnek a C++ nyelvbe vagy amikor valaki ki sze-retne probalni egy ujonnal kitalalt nyelvi elemet, a fordıtot modosıtanikell, hogy tamogassa azt. Ez azonban sokszor nehezkes vagy nem is le-hetseges. Ellenben template metaprogramok segıtsegevel szamos nyelvielemet lehet szimulalni [37].

A C++ template metaprogramok megvalosıthatok szabvanyos C++ koddal,ıgy minden fordıto, mely a szabvanyt koveti kepes ertelmezni es vegrehajtanioket.

2. Celkituzesek

A C++ nyelv fejlesztese soran nem volt cel a template metaprogramozastamogatasa. Ennek eredmenyekeppen a metaprogramok szintaxisa bonyolultlett. Metaprogramokat nehez olvasni, ırni es karbantartani.

A C++ template metaprogramozas es a funkcionalis paradigma kapcso-lata jol ismert [13, 3, 14, 5, 16, 30, 8, 9]. Szamos hasonlosag van a C++template metaprogramozas es a funkcionalis nyelvek, mint peldaul a Haskelllogikaja kozott. Futasi idoben vegrehajtott C++ kod keszıtesehez vannakkonyvtarak, melyek a funkcionalis programozast tamogatjak [12, 4], viszonttemplate metaprogramozasban a jelenleg hasznalt modszerek [1, 10, 2] azimperatıv nyelveket es konyvtarakat szimulaljak.

A dolgozat megvizsgalja, hogy a template metaprogramok olvashatosagatmilyen modon lehet a funkcionalis paradigma menten javıtani. A dolgozatket modszert targyal.

Az egyik modszer a jelenleg hasznalt eszkozoket es modszereket bovıtifunkcionalis nyelvekben gyakori elemekkel. Tobbek kozott bevezeti az algeb-rai adattıpusokat, let kifejezeseket, mintaillesztest, a curry-zes es a typeclassfogalmat. Bemutatja tovabba, hogy hogyan lehet implementalni a monadokat,melyek segıtsegevel megvalosıthato a list comprehension, illetve szimulalhatoa kivetelkezeles.

3

A masik modszer egy Haskell-szeru DSL-t valosıt meg a template meta-programozas szamara. Az ezen a nyelven ırt metaprogramokat karakterlancliteralokban lehet C++ kodba agyazni. A C++ kod fordıtasakor ezek me-taprogramokka lesznek alakıtva es rogton vegrehajtasra kerulnek. Ennekmegvalosıtasahoz a dolgozat bemutatja, mikent lehet karakterlanc literalokattemplate metaprogramokkal feldolgozni. Ez lehetove teszi a DSL-ek hatekonybeagyazasat C++-ba, melyre a dolgozat alkalmazasi peldakat mutat be.

3. Eredmenyek

Annak ellenere, hogy a template metaprogramozas es a funkcionalis pa-radigma hasonlosagai ismertek, a gyakorlatban hasznalt metaprogramokatnem a funkcionalis paradigma menten keszıtik. Ez a dolgozat ket modszertmutat be, melyek template metaprogramoknak a funkcionalis paradigmaalapjan torteno fejleszteset tamogatjak. A bemutatott modszerek a C++11szabvanyt hasznaljak, barmely szabvanyos fordıtoval hasznalhatok. Egyikuksem igenyel tovabbi eszkozoket.

Az 1. abra bemutatja a dolgozat logikai szerkezetet. A felho jeloli adolgozat alapgondolatat, a lekerekıtett sarku teglalapok a tezisek. A fe-jezetek szamai, melyekben egy adott tema ki van fejtve kis teglalapokbanvannak az abran feluntetve. A vastag szurke keretes teglalapok jelolik azadott modszerek hasznalatabol szarmazo elonyoket.

Az elso modszer funkcionalis nyelvek alapveto elemeit valosıtja meg temp-late metaprogramozasban, majd ezekre alapozva magasabb szintu eleme-ket epıt. A bevezetett elemek mind a szeles korben hasznalt Boost.MPLkonyvtarra epulnek, ezert barmely programban konnyen bevezethetok, melyezt a konyvtarat mar hasznalja.1. Tezis: Megvizsgaltam a C++ template metaprogramozas es a funk-cionalis programozasi nyelvek kapcsolatat. Az eredmenyek alapjan kidol-goztam modszereket, melyek a funkcionalis paradigmat koveto fejlszetoketsegıtik template metaprogramok ırasaban. (III. fejezet)

1.1. Tezis: Megmutattam a lusta kiertekeles jelentoseget a templatemetaprogramozasban es kidolgoztam egy modszert, melynek segıtsegevel lustakiertekelest nem tamogato metafuggvenyeket is lehet olyan modon hasznalni,mintha tamogatnak azt. (III.1. fejezet)

1.2. Tezis: Kidolgoztam egy modszert a curry-zes hatekony megvalosı-tasara C++ template metaprogramozasban. (III.2. fejezet)

1.3. Tezis: Kidolgoztam egy modszert a Haskell nyelvben hasznalthozhasonlo algebrai adattıpusok megvalosıtasara C++ template metaprogra-mozasban. (III.3. fejezet)

4

1. abra. A dolgozat szerkezete

5

1.4. Tezis: Kidolgoztam egy modszert Haskell typeclass-ok megvalosı-tasara C++ template metaprogramozasban. (III.4. fejezet)

1.5. Tezis: Kidolgoztam egy modszert, melynek segıtsegevel temp-late metaprogramozasbeli kifejezeseket lehet tarolni, parameterkent atadnivagy fuggvenyhıvas eredmenyekent visszaadni. Ez a modszer lehetove te-szi let kifejezesek megvalosıtasat es ad egy a Boost.MPL altal biztosıtottes szeles korben hasznaltnal hatekonyabb modszert lambda kifejezesek meg-valosıtasara. (III.5. fejezet)

1.6. Tezis: Kidolgoztam egy uj modszert a mintaillesztes megvalosıtasa-ra C++ template metaprogramozasban, mely lehetove teszi case kifejezesekhasznalatat. (III.6. fejezet)

A dolgozat bemutatja, hogy az 1. Tezisben bemutatott modszer alapjanhogyan valosıthato meg egy funkcionalis nyelvekben gyakori absztrakcio, amonadok es egy Haskell altal biztosıtott szintaktikai egyszerusıtes, a do no-tation. Ennek felhasznalasaval szamos hasznos eszkoz keszıtheto. Templatemetaprogramozasban biztosıtani lehet a list comprehension nevu modszert,mely egyszerubbe es olvashatobba teszi a listakon vegzett muveleteket. Amonadok egyszerusıtik a template metaprogramok vegrehajtasa soran fellepohibak kezeleset. A dolgozat bemutatja, hogyan lehet template metaprogra-mozasban szimulalni a kivetelkezelest.2. Tezis: Kidolgoztam egy modszert monadok es egy a Haskell altal biz-tosıtotthoz hasonlo do notation megvalosıtasara template metaprogramozas-ban. Megvizsgaltam szamos, Haskellben elerheto monad variaciorol, hogy ez-zel a modszerrel hogyan valosıthato meg C++ template metaprogramozasban.Kidolgoztam egy modszert a kivetelkezeles szimulalasara C++ template meta-programozasban. (IV. fejezet)

2.1. Tezis: Kidolgoztam egy modszert a monadok megvalosıtasara C++template metaprogramozasban. (IV.1. fejezet)

2.2. Tezis: Megvizsgaltam szamos Haskellben elerheto monadrol, hogya 2.1. Tezisben bemutatott modszerrel mikent lehet oket implementalni.(IV.2. fejezet)

2.3. Tezis: Kidolgoztam egy modszert a do notation megvalosıtasaratemplate metaprogramozasban, mely a Haskell altal biztosıtotthoz hasonlo.(IV.3. fejezet)

2.4. Tezis: Kidolgoztam egy monadokon alapulo modszert a kivetelke-zeles szimulalasara C++ template metaprogramozasban. (IV.4. fejezet)

6

A dolgozat bemutat ket kulonbozo modszert a template metaprogramokolvashatosaganak javıtasara a funkcionalis paradigmaval valo kapcsolat fel-hasznalasaval. Az elso ket tezis a meglevo eszkozoket es modszereket terjesztiki funkcionalis nyelvekben gyakran hasznalt elemekkel.

A harmadik tezis mutatja be a masik modszert, mely karakterlanc li-teralokban szereplo kodreszletek ertelmezesen alapszik es ennek segıtsegevelegy interpretert valosıt meg, mely template metaprogramokat hajt vegre.Egy beagyazott kodreszlet ertelmezese es vegrehajtasa ugyanabban a fordıtasilepesben tortenik meg, mely lehetove teszi egy Haskell-szeru szintaxis biz-tosıtasat template metaprogramok szamara.3. Tezis: Kidolgoztam egy modszert parser-eket generalo konyvtarak meg-valosıtasara C++ template metaprogramozasban. Megvizsgaltam, hogy ezmikent hasznalhato domen specifikus nyelvek C++ nyelvbe agyazasara, il-letve template metaprogramok szamara egy jobban olvashato szintaxis biz-tosıtasara. Ezen modszerek egyike sem igenyel kulso elofordıtot. (V. fejezet)

3.1. Tezis: Kidogloztam egy modszert karakterlanc literalok C++ temp-late metaprogramokkal feldolgozhato karakter kontenerekke torteno atalakı-tasara. Erre alapozva kidolgoztam egy modszert parser-eket generalo konyv-tarak megvalosıtasara C++ template metaprogramozasban. (V.1. fejezet)

3.2. Tezis: Megvizsgaltam, hogy a 3.1. Tezisben bemutatott modszerrelhogyan lehet domen specifikus nyelveket kulso eszkozok nelkul beagyazni aC++ nyelvbe. (V.2. fejezet)

3.3. Tezis: Megvizsgaltam, hogy a 3.1. Tezisben bemutatott modszerrelhogyan lehet egy a Haskell nyelvre hasonlıto szintaxist biztosıtani templatemetaprogramokhoz kulso elofordıto hasznalata nelkul. (V.3. fejezet)

4. Osszegzes

A dolgozat ket, a funkcionalis paradigman alapulo modszert mutat be aC++ template metaprogramok olvashatosaganak es karbantarthatosaganakjavıtasara. Az egyik modszer termeszetes kiterjesztese a gyakorlatban hasznaltmodszereknek es eszkozoknek, mıg a masik egyszeru szintaxist biztosıt ametaprogramok szamara.

A bemutatott modszerek egy nyılt forrasu konyvtar gyujtemenyben [21]implementalasra kerultek, mely letoltheto es a modszerek nyujtotta elonyokkihasznalhatok. A 2. tablazat a Cloc [15] eszkoz segıtsegevel keszult es akonyvtarak, azok teszjei tovabba a kapcsolodo peldak kodjaiban, illetve adokumentacioban szereplo sorok szamat mutatja. Az eredmenyek illetve akonyvtarak be lettek mutatva a C++/Boost kozossegnek. Az eloadas BestPresentation dıjat nyert a C++Now konferencian 2012-ben Aspenben.

7

1. tablazat. Kapcsolodo publikaciok[17] [18] [19] [20] [22] [23] [24] [25] [26] [27] [28] [29] [31]

1.1 × × × ×

1.2 × × ×

1.3 × × × ×

1.4 × ×

1.5 × ×

1.6 ×

2.1 × ×

2.2 × × ×

2.3 × × ×

2.4 × × ×

3.1 × × × ×

3.2 × × × × ×

3.3 ×

2. tablazat. Sorok szama az Mpllibs kodjabanLanguage files blank comment codeHTML 186 408 0 12383C/C++ Header 232 2316 1159 10323C++ 182 2734 1446 8448CMake 32 110 132 160CSS 1 19 7 64YAML 1 0 0 19

Hivatkozasok

[1] Abrahams, D., and Gurtovoy, A. C++ Template Metaprogram-ming: Concepts, Tools, and Techniques from Boost and Beyond (C++ inDepth Series). Addison-Wesley Professional, 2004. ISBN: 0321227255.

[2] Alexandrescu, A. Modern C++ design: generic programming anddesign patterns applied. Addison-Wesley Longman Publishing Co., Inc.,Boston, MA, USA, 2001. ISBN: 0-201-70431-5.

[3] Caro, M. Haskell to c++ template metaprogramming translator, 2010.http://code.google.com/p/phaskell/w/list.

[4] de Guzman, J., Marsden, D., and Heller, T. Boost.phoenix,2010. http://www.boost.org/libs/phoenix.

8

[5] Erdi, G. Haskell to c++ template metaprogramming translator, 2010.http://gergo.erdi.hu/projects/metafun/.

[6] Fowler, M. Domain-specific Languages. Addison-Wesley, 2010. ISBN:0321712943.

[7] Gil, J. Y., and Lenz, K. Simple and safe sql queries with c++templates. Sci. Comput. Program. 75 (July 2010), 573–595.

[8] Golodetz, S. Functional programming using c++ templates (part 1).Overload, 81 (October 2007).http://www.accu.org/var/uploads/journals/overload81.pdf.

[9] Golodetz, S. Functional programming using c++ templates (part 2).Overload, 82 (December 2007).http://www.accu.org/var/uploads/journals/Overload82.pdf.

[10] Gurtovoy, A., and Abrahams, D. Boost.mpl, 2004.http://www.boost.org/libs/mpl.

[11] Horvath, Z., Plasmeijer, R., and Zsok, V., Eds. Central Euro-pean Functional Programming School - Third Summer School, CEFP2009, Budapest, Hungary, May 21-23, 2009 and Komarno, Slovakia,May 25-30, 2009, Revised Selected Lectures (2010), vol. 6299 of LectureNotes in Computer Science, Springer.

[12] McNamara, B., and Smaragdakis, Y. Functional programming inc++ using the fc++ library. SIGPLAN Notices 36, 4 (2001), 25–30.

[13] Milewski, B. What does haskell have to do with c++?, 2009.http://bartoszmilewski.wordpress.com/2009/10/21/what-does-haskell-have-to-do-with-c/.

[14] Munoz, J. M. L. Monads in c++ template metaprogramming, 2008.http://bannalia.blogspot.com/2008/06/monads-in-c-template-metaprogramming.html.

[15] Northrop Grumman Corporation. Cloc - count lines of code, 2013.http://cloc.sourceforge.net/.

[16] Porkolab, Z. Functional programming with c++ template metaprog-rams. In Horvath et al. [11], pp. 306–353.

9

[17] Porkolab, Z., and Sinkovics, A. Domain-specific language integra-tion with compile-time parser generator library. In Generative Program-ming And Component Engineering, Proceedings of the Ninth Internati-onal Conference on Generative Programming and Component Engine-ering, GPCE 2010, Eindhoven, The Netherlands, October 10-13, 2010(2010), E. Visser and J. Jarvi, Eds., ACM, pp. 137–146.

[18] Porkolab, Z., Sinkovics, A., and Siroki, I. Dsl in c++ templatemetaprogram, tutorial, 2013.http://dsl2013.math.ubbcluj.ro/files/Lecture/PorkolabEtAlTemplateMetaprogramming.pdf.

[19] Sinkovics, A. Functional extensions to the boost metaprogram library.In WGT’10 (2010), Z. Porkolab and N. Pataki, Eds., vol. II of WGTProceedings, Zolix, pp. 56–66.

[20] Sinkovics, A. Functional extensions to the boost metaprogram library.Electr. Notes Theor. Comput. Sci. 264, 5 (2010), 85–101.

[21] Sinkovics, A. The source code of mpllibs, 2010.http://github.com/sabel83/mpllibs.

[22] Sinkovics, A. Nested lamda expressions with let expressions in c++template metaprorgams. InWGT’11 (2011), Z. Porkolab and N. Pataki,Eds., vol. III of WGT Proceedings, Zolix, pp. 63–76.

[23] Sinkovics, A. Boosting mpl with haskell elements, 2013.http://www.youtube.com/watch?v=aIj034VCUD8.

[24] Sinkovics, A., and Abrahams, D. Using strings in c++ templatemetaprograms, 2012.http://cpp-next.com/archive/2012/10/using-strings-in-c-template-metaprograms/.

[25] Sinkovics, A., and Porkolab, Z. Expressing c++ template meta-programs as lamda expressions. In Horvath et al. [11], pp. 97–111.

[26] Sinkovics, A., and Porkolab, Z. Implementing monads for c++template metaprograms. Technical Report TR-01/2011, Eotvos LorandUniversity, Faculty of Informatics, Dept. of Programming Languagesand Compilers, Sept. 2011.

[27] Sinkovics, A., and Porkolab, Z. Domain-specific language inte-gration with c++ template metaprogramming. Formal and Practical

10

Aspects of Domain-Specific Languages: Recent Developments (2012),32. ISBN: 1466620927.

[28] Sinkovics, A., and Porkolab, Z. Metaparse - compile-time parsingwith c++ template metaprogramming, 2012.http://cppnow.org/files/2012/04/Sinkovics.Porkol%C3%A1b.pdf.

[29] Sinkovics, A., and Porkolab, Z. Implementing monads for c++template metaprograms. Science of Computer Programming 78, 0(2013), 1600 – 1621.

[30] Sipos, A., Porkolab, Z., and Zsok, V. Meta¡fun¿ - towards afunctional-style interface for c++ template metaprograms. Studia Uni-versitatis Babes-Bolyai Informatica LIII, 2008/2 (2008), 55–66.

[31] Szugyi, Z., Sinkovics, A., Pataki, N., and Porkolab, Z. C++metastring library and its applications. In GTTSE (2009), J. M. Fer-nandes, R. Lammel, J. Visser, and J. Saraiva, Eds., vol. 6491 of LectureNotes in Computer Science, Springer, pp. 461–480.

[32] Unruh, E. Prime number computation, 1994.ANSI X3J16-94-0075/ISO WG21-462.

[33] Veldhuizen, T. Expression templates. C++ Report 7 (1995), 26–31.

[34] Veldhuizen, T. Using C++ template metaprograms. SIGS Publica-tions, Inc., New York, NY, USA, 1996, pp. 459–473.

[35] Veldhuizen, T. L. C++ templates are turing complete. Tech. rep.,2003.

[36] Veldhuizen, T. L., and Gannon, D. Active libraries: Rethinkingthe roles of compilers and libraries. In In Proceedings of the SIAMWorkshop on Object Oriented Methods for Inter-operable Scientific andEngineering Computing OO’98 (1998), SIAM Press.

[37] Zolyomi, I., Porkolab, Z., and Kozsik, T. An extension to thesubtype relationship in c++ implemented with template metaprogram-ming. In Generative Programming and Component Engineering, F. Pfen-ning and Y. Smaragdakis, Eds., vol. 2830 of Lecture Notes in ComputerScience. Springer Berlin Heidelberg, 2003, pp. 209–227.

11