Fables Funkcionális programozási nyelv ágens-alapú szimulációkhoz
description
Transcript of Fables Funkcionális programozási nyelv ágens-alapú szimulációkhoz
![Page 1: Fables Funkcionális programozási nyelv ágens-alapú szimulációkhoz](https://reader035.fdocument.pub/reader035/viewer/2022062502/56814bed550346895db8cc65/html5/thumbnails/1.jpg)
FablesFunkcionális programozási nyelv
ágens-alapú szimulációkhoz
Legéndi Richárd Olivé[email protected]
diplomavédés2009. január 27.
![Page 2: Fables Funkcionális programozási nyelv ágens-alapú szimulációkhoz](https://reader035.fdocument.pub/reader035/viewer/2022062502/56814bed550346895db8cc65/html5/thumbnails/2.jpg)
Mi is a Fables?
Alapvetően egy funkcionális nyelv:– Funkcionális paradigmák:
változók, konstansok, relációk definiálására– Objektum elvűség:
ágensek definiálása osztályokkal– Imperatív nyelvi elemek az események leírására
Egyszerű, tömör, engedékeny szintaxis – erre törekedtünk Típusnélküliség
![Page 3: Fables Funkcionális programozási nyelv ágens-alapú szimulációkhoz](https://reader035.fdocument.pub/reader035/viewer/2022062502/56814bed550346895db8cc65/html5/thumbnails/3.jpg)
Példa
model Példa {var x := "String";konstans = 5;
függvény(x) = 2*x;
class Ágens {var id;
}
startUp {new Agent[id:=0];
}}
![Page 4: Fables Funkcionális programozási nyelv ágens-alapú szimulációkhoz](https://reader035.fdocument.pub/reader035/viewer/2022062502/56814bed550346895db8cc65/html5/thumbnails/4.jpg)
Miért kellett egy új nyelv?
A szimulációk eddigi eszközei:– Swarm (1996): az első szimulációs csomag, kísérleti jelleggel– MAML (1999): az első szimulációs nyelv, a Swarmra épül– RePast (2001): Javas szimulációs csomag (API)
A problémák:– Elég bonyolultak
– Komoly programozói tapasztalatot igényel a használatuk(pl. OO szemlélet, GUI programozás, stb.)
– …
Elsődleges felhasználói réteg:szociológusok, társadalomkutatók, közgazdászok, …
![Page 5: Fables Funkcionális programozási nyelv ágens-alapú szimulációkhoz](https://reader035.fdocument.pub/reader035/viewer/2022062502/56814bed550346895db8cc65/html5/thumbnails/5.jpg)
Cél
Egy olyan nyelv létrehozása, amely:– Egyszerű, minimális programozói tapasztalatot feltételez– Nyelvi szinten támogatja ágens-alapú szimulációk létrehozását,
irányítását és megfigyelését– Szintaxisa tükrözi a tudományos cikkekben használt formalizmust
![Page 6: Fables Funkcionális programozási nyelv ágens-alapú szimulációkhoz](https://reader035.fdocument.pub/reader035/viewer/2022062502/56814bed550346895db8cc65/html5/thumbnails/6.jpg)
Funkcionális paradigmák
Változók,konstansok
Függvények,Lokális definíciók,Elágazások
Felsorolási,intervallum és halmaz típusok
var x;méret = 100;
randomBit = discreteUniform( 0, 1 );között(x, y, z) = x < y < z;
signum(a) = a < 0 => -1 | a == 0 => 0
otherwise 1;
négyzetszámok ={ x^2 : x is [-10..10] };
![Page 7: Fables Funkcionális programozási nyelv ágens-alapú szimulációkhoz](https://reader035.fdocument.pub/reader035/viewer/2022062502/56814bed550346895db8cc65/html5/thumbnails/7.jpg)
Imperatív paradigmák
Inicializálás:– seed() beállítása– Paraméterek– Ágensek létrehozása
Ütemezők:– Bárhol definiálhatóak– Ciklikus / nem ciklikus– Nevesített: dinamikusan
létrehozható/törölhető
startUp (ágensek) { seed(0); printLn( "Inicializálás..." ); [ new Ágens[ money := 0 ] :
_ is [1.. ágensek] ];}
schedule FőÜtemező cyclic 10 { 1 : printLn ("1, 11, 21, ...") ; 2 : printLn ("2, 12, 22, ...") ;}
névListázás = for each a in Ágens do printLn ( a.név ) ;
![Page 8: Fables Funkcionális programozási nyelv ágens-alapú szimulációkhoz](https://reader035.fdocument.pub/reader035/viewer/2022062502/56814bed550346895db8cc65/html5/thumbnails/8.jpg)
Példa modell
// Vándorló hangyák: ~15 sor kódmodel Ants {
antNum = 100; worldSize = 100;
norm (x) = x mod worldSize;
class Ant { var pos; move(x) = pos := norm( pos + x ); schedule Stepper cyclic 1 { 1 : move(discreteUniform(-1,0,1)); } }
antsAt = [ a.pos : a is Ant ];
startUp { seed(1984);
[ new Ant[ pos := worldSize/2 ] :
i is [1..antNum] ];}
}
![Page 9: Fables Funkcionális programozási nyelv ágens-alapú szimulációkhoz](https://reader035.fdocument.pub/reader035/viewer/2022062502/56814bed550346895db8cc65/html5/thumbnails/9.jpg)
Az eredmény
![Page 10: Fables Funkcionális programozási nyelv ágens-alapú szimulációkhoz](https://reader035.fdocument.pub/reader035/viewer/2022062502/56814bed550346895db8cc65/html5/thumbnails/10.jpg)
A nagyobb részfeladatok
Értelmezés: – szintaktikai ellenőrzések– szintaxisfa felhúzása
Típusozás– minden kifejezésre, változóra
[Charting Wizard]– a lehetséges adatforrások megadása
Kódgenerálás, Optimalizáció– modell, GUI, tényleges producerek
![Page 11: Fables Funkcionális programozási nyelv ágens-alapú szimulációkhoz](https://reader035.fdocument.pub/reader035/viewer/2022062502/56814bed550346895db8cc65/html5/thumbnails/11.jpg)
Működés
Forrásállományok
IME
EclipseCompilerResult
• Fables forrás• Java importok• Chart leírók
• Hibalista• Modell• GUI kód• Dokumentációk• …
![Page 12: Fables Funkcionális programozási nyelv ágens-alapú szimulációkhoz](https://reader035.fdocument.pub/reader035/viewer/2022062502/56814bed550346895db8cc65/html5/thumbnails/12.jpg)
A Compiler
Lexer Precompiler
Transformator
SzintaktikusElemző
Típusozó
InformatorCP
Kódgenerátor
Fables forrás
Java importok
Generált
források
![Page 13: Fables Funkcionális programozási nyelv ágens-alapú szimulációkhoz](https://reader035.fdocument.pub/reader035/viewer/2022062502/56814bed550346895db8cc65/html5/thumbnails/13.jpg)
Hibajelzés
Lexer Precompiler
Transformator
SzintaktikusElemző
Típusozó
Informator
Kódgenerátor
![Page 14: Fables Funkcionális programozási nyelv ágens-alapú szimulációkhoz](https://reader035.fdocument.pub/reader035/viewer/2022062502/56814bed550346895db8cc65/html5/thumbnails/14.jpg)
A Compiler
Lexer Precompiler
Transformator
SzintaktikusElemző
Típusozó
InformatorCP
Kódgenerátor
Fables forrás
Java importok
Generált
források
![Page 15: Fables Funkcionális programozási nyelv ágens-alapú szimulációkhoz](https://reader035.fdocument.pub/reader035/viewer/2022062502/56814bed550346895db8cc65/html5/thumbnails/15.jpg)
Dokumentáció generálás
Lexer PrecompilerSzintaktikusElemző
Típusozó
Kódgenerátor
Fables forrás
Generáltdoksik
![Page 16: Fables Funkcionális programozási nyelv ágens-alapú szimulációkhoz](https://reader035.fdocument.pub/reader035/viewer/2022062502/56814bed550346895db8cc65/html5/thumbnails/16.jpg)
Architektúra
IME Fordító Fordító:
– Értelmező: source tokenek, szintakszisfa– Előfordító: szintakszisfa reprezentációs fa– Transformator: reprezentációs fán apróbb változtatások– Típusozó: felcímkézi a fát a típusinformációkkal– Fordító Charting Package
Új chart létrehozása, meglévő editálásaModel informátor: reprezentációs fa chartok
– Compiler: reprezentációs objektumok kódobjektumok kódobjektumok generált forrás (Közben optimalizáció)
A fordító a végén visszaad egy eredmény objektumot– Hiba és figyelmeztetési listák– Generált forráskódok
![Page 17: Fables Funkcionális programozási nyelv ágens-alapú szimulációkhoz](https://reader035.fdocument.pub/reader035/viewer/2022062502/56814bed550346895db8cc65/html5/thumbnails/17.jpg)
Értelmezők
JavaCC által generált parser:– Nyelvtan leírás (EBNF) JavaCC Parser
Grammar.jjt– Globálisan LL-1 nyelvtan– Lokálisan LL-2
AST objektumok ezekből áll össze a szintaxisfa
![Page 18: Fables Funkcionális programozási nyelv ágens-alapú szimulációkhoz](https://reader035.fdocument.pub/reader035/viewer/2022062502/56814bed550346895db8cc65/html5/thumbnails/18.jpg)
Előfordító
A szintaxisfa alapján felépítünk egy saját reprezentációt a modell köré.
Bejárjuk az egész fát, ez alapján építkezünk. Az eredmény nem egy fa lesz, hanem egy a
modellt reprezentáló objektum. A továbbiakban ezen az objektumon
dolgozunk.
![Page 19: Fables Funkcionális programozási nyelv ágens-alapú szimulációkhoz](https://reader035.fdocument.pub/reader035/viewer/2022062502/56814bed550346895db8cc65/html5/thumbnails/19.jpg)
Transzformációk
Apróbb beállítások a modellen, amik feltételezik annak teljességét– Mi legyen konstans, változó ill. függvény?
Fablesben definiált konstans nem feltétlen az, sőt!Pl.: random = uniform(0,1);Függőségi halmazok alapján: Ha értéke fordításnál meghatározható => konstans Ha paramétertől függ => inicializálandó változó Ha pl. véletlentől függ => változó Ha olyan konstanstól függ
– Lokális változók felcímkézése– …
![Page 20: Fables Funkcionális programozási nyelv ágens-alapú szimulációkhoz](https://reader035.fdocument.pub/reader035/viewer/2022062502/56814bed550346895db8cc65/html5/thumbnails/20.jpg)
Típusozás I
Az alapötlet: minden típust kideríthetünk az értékadásokból– Konstansok típusa adott (x=5)– Minden változónak csak 1 típusa lehet, azt az
értékadásokból derítjük ki (y:=x)– Beépített függvényeknél a típust a paraméterek típusainak
ismeretében ki lehet deríteni (z = 2+ 3*x)– Ezek alapján a felhasználói függvények típusai
meghatározhatóak rekurzívan ( f(u) = u + 2*z )
![Page 21: Fables Funkcionális programozási nyelv ágens-alapú szimulációkhoz](https://reader035.fdocument.pub/reader035/viewer/2022062502/56814bed550346895db8cc65/html5/thumbnails/21.jpg)
Típusozás II
Ha még nem ismerjük a paraméterek típusát?– Iteratív feldolgozás
Konverziók– x := 5; x:=2.1 – double vagy int? => double upcast– nem castolható eredmények TypeMismatch
Mi legyen, ha ugyan az a függvény más-más típusú argumentumokkal szerepel?
– Függvénycsaládok generálása pl. f(1);…;f(0.5) => int f(int), double f(double)
Értékadás szerű függvények?– Pl. union() halmazokra, mátrix (i,j)-edik elemének beállítása, stb.
![Page 22: Fables Funkcionális programozási nyelv ágens-alapú szimulációkhoz](https://reader035.fdocument.pub/reader035/viewer/2022062502/56814bed550346895db8cc65/html5/thumbnails/22.jpg)
Optimalizáció I
Függvényekben új lokális konstansok bevezetése– Olyan függvényhívásokra, aminek a függőségei nem változnak a két
kódrészlet között Inverz relációk számolása
– Adott tulajdonságú ágenseket nem iterálva, hanem hasheléssel keressük meg { a is Agent when a.member == f(x) } => hashset.get(f(x)) { a.member : a is Agent … } => keySet() használatával
Ahol lehet, natív tömbhasználat– Vectorok, Set-ek helyett– Nem mindig lehet, függhet a véletlentől, állapotváltozásoktól az iteráció
![Page 23: Fables Funkcionális programozási nyelv ágens-alapú szimulációkhoz](https://reader035.fdocument.pub/reader035/viewer/2022062502/56814bed550346895db8cc65/html5/thumbnails/23.jpg)
Optimalizáció II
Programinverzió– A felesleges közbülső adatszerkezetek eliminálása
Kis ellentmondás: olvasható kód generálása– Haladó felhasználóknak fontos!– Emiatt nem helyettesítjük a konstansokat az
értékükkel, nem vonjuk össze a kiértékelhető értékeket, stb.
![Page 24: Fables Funkcionális programozási nyelv ágens-alapú szimulációkhoz](https://reader035.fdocument.pub/reader035/viewer/2022062502/56814bed550346895db8cc65/html5/thumbnails/24.jpg)
Segédeszközök
Dokumentáció generátló ezsközök– Modellből egy cikk vázlata– Nagyban hasonlít pl. a javadoc-ra– Dokumentációs comment: ”/**” ill. ”*/”– Több formátum:
HTML, PDF, RTF, LaTeX forrás Saját Eclipse-alapú fejlesztőkörnyezet RePasttól független megjelenítő csomag:
– Egyszerűbb, független– A GUI generálása egy leírófájl alapján történik, amit a Charting
Package generál le
![Page 25: Fables Funkcionális programozási nyelv ágens-alapú szimulációkhoz](https://reader035.fdocument.pub/reader035/viewer/2022062502/56814bed550346895db8cc65/html5/thumbnails/25.jpg)
Összefoglalás
Funkcionális nyelv, tömör szintaxis Típusok nélkül dolgozunk Hasznos eszközkészlettel rendelkezik
Köszönöm a figyelmet!