Metaprogramok alkalmazása erősen típusos objektum-orientált rendszerek kiterjesztésére Zólyomi István Témavezető: Dr. Porkoláb Zoltán
Tartalom Bevezetés Típusvizsgáló rendszer Strukturális altípusosság C++ nyelven Új elvű sorosítási módszer Összefoglalás
Metaprogramok vagyProgramok, melyek más programokat elemeznek vagy generálnak Metaadatok –Korlátozott: pl. típusinformációk –Ideális: teljes szintaxisfa Programtranszformáció –Korlátozott: pl. kódgenerálás –Ideális: teljes átalakítás lehetősége
C++ sablon-metaprogramozás Sablonok: generikus programozás támogatása (típus- és adatparaméterek, specializációk) “Véletlenül” Turing-teljes –Elágazás, rekurzió kifejezhető Fordítás közben végrehajtott funkcionális nyelv Előnye: szabványos, elterjedt Hátránya: közvetett metaprogramozási eszköz (bonyolultság, karbantarthatóság, stb)
1. Típusvizsgálatok Generikus programozás: típusparaméter –Típusbiztonság miatt megszorításokkal Típusparaméterek kikötései általában: –Többnyire explicit leszármazás alapján –Ha nem teljesül, fordítás megszakítása C++ nyelven nincs nyelvi támogatás –Sokáig nem is lesz, lásd concept és a C++0x
Példa C++ konténerek másolása template OutputIterator copy ( InputIterator first, InputIterator last, OutputIterator result ); Java listamásolás class Collections { static void copy( List dest, List src );... }
Típusvizsgálatok Problémák: –Sokszor implicit típusmegfelelésre lenne szükség –Kizárólag ÉS kapcsolat a kikötések között –Rugalmatlan eredmény, csak hibajelzést ad Predikátumokkal leírt elemi vizsgálatok –Konjunkciót, diszjunkciót, negációt tartalmazó formulák –Eredmény alapján tetszőleges metaprogramozási akció végrehajtható
C++ nyelvű típusvizsgálatok // vizsgálatok általános alakja, fordítási idejű eredménnyel const bool result = EVALUATE( vizsgálat ); // saját megvalósítású vizsgálatok TYPE_IN_CLASS(iterator, ItemType) // beágyazott típus létezése MEMBER_IN_CLASS(size, ItemType) // tag létezése (adat v. fgv) Member ::NonStatic(&T::size) // adattag típusvizsgálata Member ::Static(&T::size) // statikus adattag typedef size_type FuncType() const; Member ::NonStatic(&T::size) // tagfüggvény típusa Member ::Static(&T::size) // statikus függvény const bool comparable = globalOperator || memberOperator;
1. Tézis Definiáltam egy új, nagyobb kifejezőerejű, ortogonális, nem intruzív, nyelvfüggetlen típusvizsgáló (introspection) rendszert. C++ sablon-metaprogramok segítségével elkészítettem a rendszer egy konkrét megvalósítását, mely C++ nyelvű programkód típusvizsgálatára szolgál. A könyvtár a C++ szabvány szerinti nyelvi eszközökre épül, ezért fordítófüggetlen és hordozható. István Zólyomi, Zoltán Porkoláb. “Towards a General Template Introspection Library”. GPCE 2004, LNCS Vol. 3286, pp István Zólyomi, Zoltán Porkoláb. “Improving concept checking in Boost”. Boost Workshop, OOPSLA 2004, Vancouver.
2. A lépésenkénti finomítás problémája Erősen típusos objektum-orientált nyelvek –Legelterjedtebb programozási környezetek –Öröklődés általában explicit –Jellemzően kettős funkciója van: Kód újrafelhasználása (lépésenkénti finomítás) Altípus kapcsolatok definíciója –Általános ősosztályok vagy interfészek –Leszármazottak “finomítva” az igények szerint
Példa a problémára Shape Circle Colore d Displayabl e ColoredShap e MyCircle A jelölt altípus kapcsolat nem áll fenn Ősosztályok, interfészek explicit megadása A megoldás érdekében létrehozandó osztályok számának kombinatorikus robbanása
Szabványos C++ adatfolyamok istream ifstream ostrea m iostream fstream ofstream Virtuális öröklődés részben megoldja (intruzív)
Megoldás elve Cél: strukturális altípusosság szimulálása –Kódújrafelhasználás és altípus szétválasztása –Altípusosság implicit megfelelési szabállyal Típuslisták típushalmazok megadására typedef TYPELIST_2(istream, ostream) streamTypes; –Feldolgozás: listabejáró metaprogramok Kódgeneráló sablon-metaprogram –Megfelelő adatszerkezet összeállítása –Konstruktor, konverziós operátor megadása
Megvalósítás class MyCircle: Shape, Colored, Displayable { … }; MyCircle myCircle( … ); CPTRSET_2(Colored, Shape) coloredShape(myCircle); static_cast (coloredShape).getArea(); CPTRSET_2(Colored, Shape) Colored *head; CPTRSET_1(Shape) Shape *head; ShapeColoredDisplayable MyCircle mutat
2. Tézis Megmutattam a jelenlegi objektum-orientált nyelvek típusrendszerének korlátait osztályok lépésenkénti finomításának esetében. Szabványos sablon-metaprogramok segítségével strukturális altípusosságon alapuló, kiegészítő konverziós szabályokat vezettem be a C++ nyelv típusrendszerébe. A módszerrel elkerülhető a létrehozandó interfészek számának kombinatorikus robbanása. István Zólyomi, Zoltán Porkoláb, Tamás Kozsik. “An Extension to the Subtype Relationship in C++ Implemented with Template Metaprogramming”. GPCE 2003, LNCS Vol. 2830, pp István Zólyomi, Zoltán Porkoláb. “A Feature Composition Problem and a Solution Based on C++ Template Metaprogramming”. GTTSE 2006, LNCS Vol. 4143, pp
3. Sorosítás Program adatainak tárolható formátumra alakítása és mentése, majd visszaolvasása Két alapvető megközelítés: –Adott programozási nyelv adatainak formátumfüggetlen tárolása –Adott formátum feldolgozása tetszőleges programnyelven Utóbbit választjuk, de formátumfüggetlenül: –Tetszőleges, sémával leírt adatok feldolgozása
Sorosítási módszer Adatformátum és programnyelv választása –Esetünkben XML és C++ Séma típusrendszerének leképzése a nyelv típusrendszerére –pl. xsd:integer→int, xsd:complexType → class Leképzést végrehajtó kódgenerátor –Típus önleírása az adatséma formátumában –pl. XSLT nyelvű megvalósítás Sorosítást végrehajtó metaprogram –Típusok önleírása alapján sorosít –pl. “hagyományos” C++ program, nem sablon
Használat: típusok generálása struct Appointment: public TypedXmlData { const MetaType& MetaInfo() const; Appointment(); DateTime StartDate; Nullable EndDate; String Text; };
Használat: sorosítás indítása std::string serialize( const TypedXmlData &object ); void deserialize( const std::string &xmlDocStr, TypedXmlData &toObject ); XSD sémaleírás típusdefiníciókkal Adattároló típusok (C++) Típusleírások (C++ / XSD) Felhasználói program Sorosító metaprogram végrehajtj a alapján létrejön alapján dolgozik használj a XML dokumentum metaprogra m konvertálja
Sorosítás használata automatizált kommunikációra Távoli eljáráshívási technológia (XML-alapú) Szolgáltatás WSDL formátumú leírása Kódgenerátor: WSDL → C++ könyvtár –Kliens függvények a kommunikáció elvégzésére –Szerver váza, kitöltendő függvénytörzs Kliens függvények szignatúrája: auto_ptr func( const RequestType &request, const Url &target );
3. Tézis Nyelv- és formátumfüggetlen, moduláris módszert adtam sémaleírással rendelkező dokumentumok sorosítására. Leképzést definiáltam az XML sémaleírók típusrendszeréről a C++ nyelv típusrendszerére, valamint megvalósítottam egy leképzést elvégző kódgenerátort és egy sorosító metaprogramot. Az elkészült könyvtárat a Nokia hivatalos fejlesztői eszközként adta ki S60 platformjára. Szabolcs Payrits, Péter Dornbach, István Zólyomi. “Metadata-Based XML Serialization for Embedded C++”. Proceedings of ICWS 2006, pp Szabolcs Payrits, Péter Dornbach, István Zólyomi. “Metadata-Based XML Serialization for Embedded C++”. JWSR 2009 Jul-Sept, vol 6, nr. 3, pp 18-34
Összefoglalás Definiáltam egy új, nagyobb kifejezőerejű, ortogonális, nem intruzív, nyelvfüggetlen típusvizsgáló (introspection) rendszert. Strukturális altípusosságon alapuló konverziós szabályokat vezettem be a C++ nyelv típusrendszerébe. Nyelv- és formátumfüggetlen, moduláris módszert adtam sémaleírással rendelkező dokumentumok sorosítására.
Fontosabb publikációk 1)István Zólyomi, Zoltán Porkoláb. “Towards a General Template Introspection Library”. GPCE 2004, LNCS Vol. 3286, pp )István Zólyomi, Zoltán Porkoláb. “Improving concept checking in Boost”. Boost Workshop, OOPSLA 2004, Vancouver. 3)István Zólyomi, Zoltán Porkoláb, Tamás Kozsik. “An Extension to the Subtype Relationship in C++ Implemented with Template Metaprograms”. GPCE 2003, LNCS Vol. 2830, pp )István Zólyomi, Zoltán Porkoláb. “A Feature Composition Problem and a Solution Based on C++ Template Metaprogramming”. GTTSE 2006, LNCS Vol. 4143, pp )Szabolcs Payrits, Péter Dornbach, István Zólyomi. “Metadata-Based XML Serialization for Embedded C++”. Proceedings of ICWS 2006, pp )Szabolcs Payrits, Péter Dornbach, István Zólyomi. “Metadata-Based XML Serialization for Embedded C++”. JWSR 2009 Jul-Sept, vol 6, nr. 3, pp )István Zólyomi, Zoltán Porkoláb. “A generative approach for family polymorphism in C++”. 8)Proceedings of ICAI2004, B.V.B. Press, pp )Ádám Sipos, István Zólyomi, Zoltán Porkoláb. “On the correctness of template metaprograms”. Proceedings of ICAI2007, B.V.B. Press,Vol.II., pp )Zoltán Porkoláb, István Zólyomi. Ananomaly of subtype relations at component refinement, and a generative solution in C++. Proceedings of MPOOL workshop, ECOOP 2004, pp