Fontos

Tesztek készítése Templight-hoz

Template osztályok és függvények intenzív használata közben gyakran hasznos, ha a fejlesztő bele tud nézni a példányosítás folyamatába. Ebben nyújt hatalmas segítséget a Templight nevű Clang bővítmény. Ennek a bővítménynek a prototípusa a gyakorlatban hasznosnak bizonyult. A végleges változat magas színvonalon való elkészítésének elengedhetetlen feltétele, hogy teszteket lehessen hozzá készíteni. Azonban a template osztályok példányosítása során a fordító (bizonyos keretek között) szabadon dönthet a példányosítások sorrendjéről, aminek eredményeképpen a példányosítás folyamatát leíró gráf pontos alakját nem lehet előre megmondani, mert több lehetséges helyes gráf is lehet egy adott forráskód esetén. Olyan módszer kidolgozására van szükség, hogy egy gráfról meg lehessen mondani, hogy helyes-e vagy sem.

A dolgozat célja annak kiderítése, hogy egy ilyen fordító bővítményt hogyan lehet hatékonyan tesztelni.

Template osztályok példányainak átlátható megjelenítése

Template osztályok intenzív használata esetén gyakran előfordul, hogy bonyolult, nehezen átlátható módon kerülnek template osztályok példányosításra. A template osztályok típus paraméterei további template osztályok példányai, melyek típus paraméterei további template osztályok példányai, stb. Ez előfordulhat generikus könyvtárak intenzív használata és lusta kierétékelésű template metaprogramokban való hibakeresés során is.

A dolgozat célja egy olyan alkalmazás készítése, mely template osztályok példányait átlátható módon jeleníti meg. Az eszköz két legfőbb felhasználási területe a hibaüzenetek értelmezése, a template osztályok példányainak azokból való kinyerése és megjelenítése, illetve a Metashell által megjelenített összetettebb típusok átlátható megjelenítése lenne.

Nem szabványos lehetőségek elemzése fordítás idejű stringek létrehozásához

A Boost.Metaparse könyvtár segítségével rá lehet bírni egy szabványos C++ fordítót egy, a C++-tól különböző nyelven írt kódrészlet lefordítására. Ez rendkívül hasznos domén specifikus nyelvek (DSL) C++-ba ágyazásakor, illetve programkönyvtárak API-jának készítésekor. Az idegen kódrészlet egy string literálban szerepel és template metaprogramok segítségével dolgozza fel a C++ fordító.

Jelenleg C++-ban nincs szabványos módja annak, hogy egy string literál tartalmát template metaprogramokból fel lehessen dolgozni. A könyvtár egy makrók, constexpr és template függvények segítségével kerüli meg ezt a problémát, viszont ez korlátozza a string literál tartalmának hosszát, illetve a hatékonyság rovására megy.

A dolgozat célja annak a vizsgálata, hogy a különböző fordítókban elérhető, nem szabványos kiterjesztések felhasználásával milyen mértékben javíthatók a fordítás idejű stringeket használó könyvtárak hatékonysága és kifejezőereje. Ezen felül azt vizsgálná még a dolgozat, hogy a különböző módszerek közül melyiket lenne érdemes szabványosításra javasolni.

C++98 alapú metaprogramok modernizálásának módszerei

A 2011-es C++ szabvány rengeteg hatékony, új eszközt biztosít fordítás idejű algoritmusok implementálásához. Viszont több, komolyabb template metaprogramozást támogató könyvtár létezik, melyek a régi szabvány alapján készültek és nem használják ki az új szabvány nyújtotta lehetőségeket. Ez általában a kifejezőerő és a hatékonyság rovására megy.

A dolgozat célja annak a vizsgálata, hogy milyen módon lehet és érdemes a régi metaprogramokat modernizálni, illetve hogy lehetséges-e ezt olyan módon megtenni, hogy a könyvtárak továbbra is működjenek régi fordítókkal, viszont ki tudják használni az új lehetőségeket, ha olyan környezetben használják őket, ahol ezek elérhetők.

Debugger készítése C/C++ előfordítóhoz

A C++ nyelv adta lehetőségek háttérbe szorították a makrók használatát, ám teljesen kiváltani nem tudták őket. Bizonyos esetekben elkerülhetetlen a makrók használata, más esetekben pedig ésszerű választás hordozható és konfigurálható kódgenerátorként használni őket, például programkönyvtárak felületének készítésekor.

A makrók működése általában könnyen átlátható, ám amikor kódgenerátorként használják, könnyen születhetnek összetettebb makrók is, melyek esetében már hasznos lenne, ha a fejlesztők számára lennének elérhető eszközök a hibák felderítéséhez.

A Metashell, melynek része az MDB, a template osztályok és függvények használatát támogató eszköz. A dolgozat célja annak vizsgálata, hogy miként lehetne a Metashellhez és MDB-hez hasonló eszközöket készíteni makrókhoz. Meg kellene vizsgálni, hogy a Templighthoz hasonló módon kiegészíthető-e a Clang fordító olyan lehetőséggel, hogy nyomon lehessen követni a makrók behelyettesítésének folyamatát, illetve, hogy a kapott eredmények segítségével készíthető-e az MDB-hez hasonló eszköz makrókhoz.

C++ constexpr kifejezések debugolása

A C++11 és C++14-es szabványok óta a C++ metaprogamozás egyre meghatározóbb elemei lesznek a constexpr kifejezések. A Metashell nevű eszköz segítségével könnyen tudunk interaktívan kiértékelni constexpr kifejezéseket is. Sajnos viszont a Metashellben található MDB tool nem ad lehetőséget a constexpr kifejezések debugolására.

A dolgozat témája a constexpr kifejezés debugolás lehetséges megközlítéseinek körbejárása, implementálása és létező eszközökkel való integrálása.

Minta illesztés C++ típusokra

Az MDB nevű tool C++ template metaprogramok interaktív debugolására ad lehetőséget runtime debuggerekéhez (gdb, lldb) hasonló interfésszel. Nagyobb metaprogramok debugolásának elengedhetetlen részét képezik a breakpointok, melyeket típusokra lehet illeszteni. Sajnos a jelenleg használt, egyszerű reguláris kifejezéseken alapuló algoritmusnak gyakran nincs elegendő kifejező ereje a megfelelő típusok kiválasztásához.

A dolgozat témája egy olyan C++ típusokra specializált nyelv elkészítése, amellyel könnyen lehet kifejezni tetszőleges feltételt a típusra nézve és ezzel pontosan meghatárzoni a breakpointok helyét.

C++ Template metaprogramok profilozása

Az egyik leggyakrabban előforduló érv a template metaprogramok használata ellen a meghosszabbodott fordítási idő szokott lenni. Logikus megoldás erre a problémára a metaprogramok optimalizálása lenne. Ehhez viszont meg kell keresni, hogy mely részeket érdemes optimalizálni. Erre lehetőséget adna egy olyan tool, amely meg tudná mondani, hogy melyik template példányosítás mennyi ideig tart.

A dolgozat témája egy eszköz implementálása mellyel könnyen megtalálhatók a template metaprogramokban azon templatek, amellyek a hosszú fordítási időért felelnek. Ehhez segítséget nyújt a Templight nevű clang kiegészítés, mely megadja az profilozáshoz szükséges nyers információkat.

Nice to have

Több fordító támogatása Metashellből

A template metaprogramok fejlesztése/karbantartása közben gyakran van arra szükség, hogy a fejlesztő egy metaprogramot végrehajtson és a végrehajtás eredményét megjelenítse. A legtöbb fejlesztői környezetben az egyetlen eszköz, amire támaszkodhat, az a fordítóprogram. Azonban a fordítóprogram használata erre a célra nehézkes, mivel a fordítók nincsenek erre felkészítve. A bevett gyakorlat az, hogy a fejlesztő ráveszi a fordítót, hogy egy olyan hibaüzenetet jelenítsen meg, mely tartalmazza a metaprogram végrehajtásának eredményét, majd a megjelenített hibaüzenetben megkeresi ezt.

A Metashell egy interaktív shell, melyben a fejlesztő egyszerűen végrehajthat metaprogramokat és azonnal meg tudja nézni az eredményt. Az eszköz a libclang-on alapszik, a metaprogramok végrehajtásához a Clang fordítót használja.

A metaprogramok számára a fordító a platform: más-más fordítókon eltérhet a viselkedésük a szabvány nem pontos követése, vagy a fordítók hiányosságai miatt. Ha valaki nem Clang-al fejleszti a metaprogramjait, akkor problémát jelenthet egy Clang alapú shellt használni a hibakeresés, tesztelés során.

A Boost programkönyvtár csomag biztosít egy TypeIndex könyvtárat, melynek segítségével futási időben megjeleníthető egy metaprogram végrehajtásának az eredménye. A dolgozat célja annak a vizsgálata, hogy ez a könyvtár miként használható fel arra, hogy a Metashell képes legyen a Clang-tól eltérően, más fordítót használva működni.

Printf argumentum lista automatikus generálása

A printf függvények egy kompakt, elterjedt és könnyen használható módszert biztosí­tanak formázott kimenetek írásához. A C könyvtárban elérhető printf függvény nem típusbiztos, szabálytalan használata nehezen felderíthető problémákhoz vezet.

Az Mpllibs.SafePrintf könyvtár biztosít egy eszközt a printf függvények fordítási időben történő ellenőrzéséhez, mely a formázó stringhez képest ellenőrzi a további paraméterek számát és típusát. A könyvtár használata során gyakran előfordul, hogy a paraméterek típusát túlságosan is pontosan kell meghatározni (pl. int vagy long int). Ezek a fejlesztés során felesleges részletek, amikkel a programozónak foglalkoznia kell, illetve néha nem is ismertek (pl. generikus kódban).

A dolgozat célja annak a vizsgálata, hogy az Mpllibs.SafePrintf által használt megoldás kibővíthető-e olyan módon, hogy a formázó stringet kevésbé pontosan kelljen meghatározni (pl. előjeles egész szám) és a könyvtár a paraméterek típusából automatikusan generálja a ténylegesen használt formázó stringet.

Lásd még: https://github.com/sabel83/mpllibs/issues/3

Template metaprogram debugger fejlesztői környezetekbe ágyazása

A Metashell egy interaktív shell, melyben a fejlesztő egyszerűen végrehajthat metaprogramokat és azonnal meg tudja nézni az eredményt, illetve lépésről lépésre végig tudja nézni, hogyan történik a metaprogram végrehajtása.

A fejlesztők általában egy integrált fejlesztői környezetben (IDE) dolgoznak. Sok esetben onnét indítják a fordítást és a debuggert is. A Metashell ezzel szemben egy önálló alkalmazás, melyet külön, megfelelő paraméterekkel el kell indítani.

A dolgozat célja annak a vizsgálata, hogy a Metashellt, egy a fordítás debuggolására szolgáló eszközt hogyan érdemes az integrált fejlesztői környezetekbe beágyazni, hogy az hatékonyan használható legyen.