ݺߣ

ݺߣShare a Scribd company logo
Fables Funkcionális programozási nyelv  ágens-alapú szimulációkhoz Legéndi Richárd Olivér [email_address] ELTE IKKK 2006. november 23.
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.) …
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
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 (!)
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]   } ;
Imperatív paradigmák Inicializálás: seed() beállítása Paraméterek Ágensek létrehozása Schedule-ok: Bárhol definiálhatóak Ciklikus / nem ciklikus Nevesített: dinamikusan létrehozható/törölhető startUp  (agents) { seed(0); printLn( &quot;Initialization...&quot; ); [  new  Agent[ money := 0 ] : _  is  [1..agents] ]; } schedule  Main  cyclic  10 { 1 : printLn &quot;Event at 1, 11, 21, ...&quot;   ; 2 : printLn &quot;Event at 2, 12, 22, ...&quot;   ; }
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
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
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)
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.
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ó
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.
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
Összefoglalás Köszönöm a figyelmet! Fables Beta 1.0.1: http://www.aitia.ai/services_and_products/simulation_systems/fables

More Related Content

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] } ;
  • 6. Imperatív paradigmák Inicializálás: seed() beállítása Paraméterek Ágensek létrehozása Schedule-ok: Bárhol definiálhatóak Ciklikus / nem ciklikus Nevesített: dinamikusan létrehozható/törölhető startUp (agents) { seed(0); printLn( &quot;Initialization...&quot; ); [ new Agent[ money := 0 ] : _ is [1..agents] ]; } schedule Main cyclic 10 { 1 : printLn &quot;Event at 1, 11, 21, ...&quot; ; 2 : printLn &quot;Event at 2, 12, 22, ...&quot; ; }
  • 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