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

25
Fables Funkcionális programozási nyelv ágens-alapú szimulációkhoz Legéndi Richárd Olivér [email protected] diplomavédés 2009. január 27.

Upload: farica

Post on 19-Mar-2016

40 views

Category:

Documents


3 download

DESCRIPTION

Fables Funkcionális programozási nyelv ágens-alapú szimulációkhoz. Legéndi Richárd Olivér [email protected] diplomavédés 2009. január 27. 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 - PowerPoint PPT Presentation

TRANSCRIPT

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

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

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

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

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

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

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

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

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

Az eredmény

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

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

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

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

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

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

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

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

É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

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

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

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

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

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

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

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

Ö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!