Fables - Funkcionális programozási nyelv ágens-alapú szimulációkhoz

14
Fables Funkcionális programozási nyelv ágens-alapú szimulációkhoz Legéndi Richárd Olivér [email protected] ELTE IKKK 2006. november 23.

description

Ikkk neumann legendi_fables

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

Fables

Funkcionális programozási nyelv ágens-alapú szimulációkhoz

Legéndi Richárd Olivé[email protected]

ELTE IKKK2006. november 23.

Page 2: Fables - Funkcionális programozási nyelv ágens-alapú szimulációkhoz

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.)– …

Page 3: Fables - Funkcionális programozási nyelv ágens-alapú szimulációkhoz

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 4: Fables - Funkcionális programozási nyelv ágens-alapú szimulációkhoz

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 (!)

Page 5: Fables - Funkcionális programozási nyelv ágens-alapú szimulációkhoz

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;

quadEqX1(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] };

Page 6: Fables - Funkcionális programozási nyelv ágens-alapú szimulációkhoz

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( "Initialization..." );

[ new Agent[ money := 0 ] :

_ is [1..agents] ];

}

schedule Main cyclic 10 {

1 : printLn "Event at 1, 11, 21, ..." ;

2 : printLn "Event at 2, 12, 22, ..." ;

}

Page 7: Fables - Funkcionális programozási nyelv ágens-alapú szimulációkhoz

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

Page 8: Fables - Funkcionális programozási nyelv ágens-alapú szimulációkhoz

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

Page 9: Fables - Funkcionális programozási nyelv ágens-alapú szimulációkhoz

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 szerepelpl. f(1);…;f(0.5) => int f(int), double f(double)

Page 10: Fables - Funkcionális programozási nyelv ágens-alapú szimulációkhoz

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.

Page 11: Fables - Funkcionális programozási nyelv ágens-alapú szimulációkhoz

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 12: Fables - Funkcionális programozási nyelv ágens-alapú szimulációkhoz

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 13: Fables - Funkcionális programozási nyelv ágens-alapú szimulációkhoz

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

Page 14: Fables - Funkcionális programozási nyelv ágens-alapú szimulációkhoz

Összefoglalás

• Köszönöm a figyelmet!

• Fables Beta 1.0.1:http://www.aitia.ai/services_and_products/simulation_systems/fables