Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

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.

Hasonló előadás


Az előadások a következő témára: "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."— Előadás másolata:

1 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

2 Tartalom Bevezetés Típusvizsgáló rendszer Strukturális altípusosság C++ nyelven Új elvű sorosítási módszer Összefoglalás

3 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

4 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)

5 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

6 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 );... }

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

8 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;

9 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. 266-282. István Zólyomi, Zoltán Porkoláb. “Improving concept checking in Boost”. Boost Workshop, OOPSLA 2004, Vancouver.

10 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

11 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

12 Szabványos C++ adatfolyamok istream ifstream ostrea m iostream fstream ofstream Virtuális öröklődés részben megoldja (intruzív)

13 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

14 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

15 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. 209-227. 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. 459-470.

16 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

17 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

18 Használat: típusok generálása struct Appointment: public TypedXmlData { const MetaType& MetaInfo() const; Appointment(); DateTime StartDate; Nullable EndDate; String Text; };

19 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

20 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 );

21 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. 347-356 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

22 Ö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.

23 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. 266-282. 2)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. 209-227. 4)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. 459-470. 5)Szabolcs Payrits, Péter Dornbach, István Zólyomi. “Metadata-Based XML Serialization for Embedded C++”. Proceedings of ICWS 2006, pp. 347-356 6)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 7)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. 445-454. 9)Á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. 301-308. 10)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.39-44.


Letölteni ppt "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."

Hasonló előadás


Google Hirdetések