Fables - Funkcionális programozási nyelv ágens-alapú szimulációkhoz
1. Fables Funkcionális programozási nyelv ágens-alapú szimulációkhoz Legéndi Richárd Olivér [email_address] ELTE IKKK 2006. november 23.
2. Bevezetés 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 Swarm-ra épül RePast (2001): Javás szimulációs csomag A problémák: Elég bonyolultak Komoly programozói tapasztalatot igényel a használatuk (pl. OO szemlélet, GUI létrehozás, stb.) …
3. 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
4. A Fables Muliparadigmás 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 Típusnélküliség (!)
5. 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; size = 100; randomBit = discreteUniform(0,1); between(x, y, z) = x < y < z; quadEq X 1(a, b, c) = a^2 + sqrt(D) where ( D = b^2 – 4*a*c ); signum(a) = a < 0 => -1 | a == 0 => 0 otherwise 1; squares = { x^2 : x is [-10..10] } ;
7. Példa // Ants at wanderlust model Ants; antNum = 100; worldSize = 100; norm (x) = x mod worldSize; class Ant begin var pos; move(x) = pos := norm( pos + x ); schedule Stepper cyclic 1 { 1 : move discreteUniform(-1, 0, 1) ; } end antsAt = [ a.pos : a is Ant ]; startUp { seed(0); [ new Ant[ pos := worldSize/2 ] : i is [1..antNum] ]; } end
8. A Fordító Több részfeladat: Parser: a forrás feldolgozása, absztrakt szintaxisfa felépítése Típusozó: a típus hozzárendelése minden node-hoz Transzformációk Optimalizációk Célkód generálása Egyelőre csak RePast, külön szimulációs és GUI modell Ants.fab Ants.java AntsGUI.java
9. Típusozás 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 max. 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) Konverziók, pl. 2.1 + 1 => double Függvénycsaládok generálása, ha ugyan az a függvény más-más típusú argumentumokkal szerepel pl. f(1);…;f(0.5) => int f(int), double f(double)
10. Transzformációk A parser a típusinformációk hiányában mindenből konstanst fordít Mi legyen konstans, változó ill. függvény? 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, függvények felcímkézése Stb.
11. 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ó
12. 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.
13. Segédeszközök Dokumentum generátor Rögtön megcsinálja a modellből egy cikk vázlatát Nagyban hasonlít pl. a javadoc-ra Dokumentációs comment: ”/**” ill. ”*/” Több formátum: HTML, PDF, RTF, LaTeX forrás (->DVI, PS) Eclipse plugin RePast-tó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 Fables IME generál le
14. Összefoglalás Köszönöm a figyelmet! Fables Beta 1.0.1: http://www.aitia.ai/services_and_products/simulation_systems/fables