Algoritmusok megjelenítése egy magas szintű programnyelv vizuális nyomkövetőjén keresztül Podoski Péter és Zabb László Témavezetők: Dr. Fekete István, Veszprémi Anna ELTE IK
Bevezetés (motiváció) „Milyen nyelven és fejlesztői környezetben lehet jól tanítani a programozást?” Lehetőleg ne hagyjuk bealudni a kitalálógépet (az elmét) „Hogyan lehet egyszerűen, de mégis szemléletesen bemutatni a különféle algoritmusokat?” Klasszikus módszer (tábla és kréta) Mindenki írja meg magától a számára megfelelő megjelenítést A mi válaszunk egy saját fejlesztésű algoritmus-megjelenítő segédeszköz, a Psimulex Egyes helyeken az első kérdésre a válasz „triviális: matematika nyelvén és a nagyelőadó nevű környezetben”
Algoritmus-vizualizációk ma Célja főleg oktatási (esetleg kutatási) területre segíti az ismertetést és megértést olykor algoritmusok fejlesztésekor könnyítheti a hibakeresést Nehézség: könnyebb újat írni, mint találni egy megfelelőt Jellemző, hogy egyszerű Java appletekkel valósítják meg a demonstrációt „Milyen eszközzel, milyen nyelven és milyen környezetben is lehet jól tanítani a programozást?” – a Psimulex a mi válaszunk erre A listák ikonjait tegyük sötétebbé és esetleg szögletessé
Dijkstra algoritmusa Látványosak elsőre, de később unalmassá válnak
Legrövidebb út keresése Ausztráliában
Jeliot – program-vizualizáció Túl alacsonyszintű, inkább általános iskolás célközönség
MatrixPro – az egyik legáltalánosabb Saját algoritmus Java modulként csatolva
Egy nagyon ötletes megoldás: az egyik első gráfanimációs program
Az igény megfogalmazása Elvárások egy jó megjelenítővel kapcsolatban: Célközönség számára megfelelő ábrázolás Könnyedén lehessen a vizualizációkat módosítani, bővíteni (pl. Hanoi tornyai) Egyszerű telepítés Épüljön be a tanítási folyamatba Ne igényeljen magas szintű programozói tudást
Psimulex - lehetőségek .NET-ben írt nyílt forráskódú keretrendszer Algoritmusok megfogalmazása C-szerű nyelven Beépített fordítóprogram Algoritmusok futtatása Saját virtuális platform Többprocesszoros, akár hálózati emuláció Algoritmusok megjelenítése a program változóit megjelenítő általános grafikai könyvtár (WPF) Algoritmusok elemzése Műveletigény, memóriaigény
Architektúra
Saját nyelv Az algoritmusok szempontjából alapvető típusok (skalárisok, konténerek és fák, gráfok) Gyengén típusos imperatív nyelv, C-szerű szintaxissal Típuskonstrukció: rekord Fontosabb vezérlési szerkezetek Felhasználói függvények Több forrásfájl használata Globális változók
Saját virtuális platform Virtuális gép („mini” OS ütemezővel), folyamatok, szálak (futási és hívási veremmel) A virtuális gép processzora futtatja az ún. „Microlex” utasításokat (gépi kódnak megfelelő parancsokat) Az ütemező cserélhető Később virtuális hálózattá bővíthető Miért nem használtunk egy meglévő VM-et? szükségünk van a teljes kontrollra a futó program felett Miért nem pl. CodeDOM?
Fordítás gépi kódra Négy lépésben fordítunk, visitor (látogató) tervminta alkalmazásával
Parancsobjektumok A „parancs” tervminta alapján készültek Mindegyik gépi utasítás egy-egy parancsobjektum Az aktuális futási környezeten (szálon) dolgoznak Három fő csoportjuk van: Vezérlés-átadó parancsobjektumok (pl. Call, Jump) Konkrét (főleg aritmetikai) műveleteket végrehajtó parancsobjektumok Változókat, adatszerkezeteket kezelő parancsobjektumok
Saját típusrendszer Aránylag gazdag típuskészlet (skalár típusok, gyűjtemények, fák, gráfok) Java-hoz hasonlóan közös őstípus BaseType == Object Reflection-re épül, emiatt könnyen elérhető az egész .NET osztályhierarchia Felhasználói típus a rekord (egyelőre) A komplex típusok egymásba ágyazhatóak Automatikus típuskonverziók
Típushierarchia
Saját IDE Funkciók „LexLighter” (aktuális utasítás színezése) „Syntax highlight” Léptetési módszerek (hasonlóan a VS-hez) Korszerű IDE, fülek, több forrásfájl kezelése, testre szabható, ergonomikus Nézetek váltása Az angol kifejezések legyenek idézőjelben
Saját vizualizáció Az adatszerkezetek dinamikus, változást követő, interaktív megjelenítése „Montázs” – tetszőleges elrendezhetőség: Hívási verem megjelenítése Egy-egy lényeges adatszerkezet kiemelése Egymásba ágyazhatóság (fa elemei gráfok) Adatszerkezetek szerkeszthetőek futás közben is
Például bináris fák egy sorban
Szélességi bejárás
Egy bináris fa szintfolytonos bejárása a Psimulex-ben Mindez futás közben Egy bináris fa szintfolytonos bejárása a Psimulex-ben
Felhasználási területek Oktatás Algoritmusok Programozás Fordítóprogramok (assembly-szerű nyelvek logikája) Kutatás Elméletek tesztelése és bemutatása Fejlesztés Algoritmikus problémák megoldása itt és aztán implementálása Demonstráció Automatikusan létrejön a megjelenítés, csak a programot kell megírni, az inputot megszerkeszteni Ez legyen az elején (2. dia)
Távlati tervek Párhuzamos programozási eszközök teljes körű bevezetése lock, monitor, erőforrások, stb… .NET interoperabilitás növelése Psimulex-ben írt programból C# vagy IL kód generálása .NET Base Class Libraryt-t elérhetővé tenni Integráció a Visual Studio debuggerébe intelligens .NET adatszerkezet reflekció és saját grafikus „debugger visualizer” Internetes portál (pl. versenyekhez) Internetes portál nyitás, ahol pl. algoritmikus problémamegoldó versenyeket lehet indítani, gyorsaság, egyszerűség stb. szempontok szerint pontozva
Értékelés Tipikusan túlvállalt projekt: több kezdeti cél ma már csak terv Felhasználóbarátság egyelőre nem jellemző A megjelenítés nem grafikusi vénánkról árulkodik 2. iterációhoz képest stabil rendszermag (200 unit teszt) Könnyű bővíthetőség Sikerélmény
Összefoglaló Felmértük a jelenlegi igényeket és kínálatot az algoritmus megjelenítőkből Elhatároztuk, hogy készítünk egy általános algoritmus megjelenítő rendszert Ebből megvalósult a saját nyelven programozható virtuális gép, egy egyszerű grafikus csomag és egy alapszintű debugger Célok: az eddigi tapasztalatok alapján egy komplett segédeszköz publikálása
Köszönjük a figyelmet!