A Fables programozási nyelv

Párhuzamosság

Szintaxis

Kommunikáció

Kidolgozásra vár.

Szinkronizáció

Schedule-ok

Egy modell végrehajtásához szorosan hozzátartozik az események végrehajtása és ütemezése. Az eseményeket schedule-okon keresztül időzíthetjük. Schedul-okat mind modellekhez, mind ágensekhez definiálhatunk. Időpontokhoz rendelhetünk eseményeket, a sorrend ez alapján dől el. Ugyanarra az időpontra ütemezett feladatok között a globális véletlengenerátor dönt pártatlan ütemezés mellett.

Az általános szintaxisa a következő:

schedule <ScheduleName> { <events> }

Ahol az egyes események definíciója a következő lehet:

<time> : <expression1> <expression2> ... <expressionN>;

Példa:

schedule Main { 1 : printLn "Event at 1."; 2 : printLn "Event at 2."; }
A név elhagyható.

Példa:

schedule { 1 : printLn "This is an event."; 2 : printLn "Another."; }
Ha a név adott, akkor függvényeket is hívhatunk a schedule-on.

A schedule-ok lehetnek ciklikusok is, amit a cyclic kulcsszóval jelezhetünk, majd egy természetes számmal megadjuk a mértékét:

schedule <ScheduleName> cyclic <period> { ...
Ha egy schedule ciklikus, akkor periódikusan végrehajtódik, a megadott periódus szerint.

Példa:

schedule Main cyclic 10 { 1 : printLn "Event at 1, 11, 21, ..."; 2 : printLn "Event at 2, 12, 22, ..."; }

A schedule-ok dinamikusan elindíthatók és leállíthatók a startSchedule és stopSchedule standard library műveletekkel. Amikor egy modell elindul, akkor minden globális schedule-ja elindul. Amikor nincs már több végrehajtható schedule a végrehajtási sorban, akkor a modell futása befejeződik.

A time egy másik standard library függvény, ami visszaadja a az aktuális globális időt.

Az idők a schedule definíciókban mindig relatívak a kezdeti időpillanathoz, nem lehetnek negatívak, nem utemezhetők a “múltba”. A globális schedule-ok a 0. időpillanatban indulnak.

Példa:

class Agent begin schedule { 5 : printLn ("Time is now : " ++ time); } schedule Main { 10 : new Agent; }
Time is now : 15

Véletlenek

A Fables környezet egyetlen globális pszuedó-random generátort használ a működése során. Ez garantálja a modell determinisztikusságát. Ennek a generátornak a működése a seed függvénnyel állítható be:

seed(13)
Alapvetően a modell egy véletlen generátorral működik, de természetesen lehetőség van külön inicializált generátorokat használni. Minden egyes újonnan inicializált generátort egy névvel kell azonosítani, ami alapján hivatkozható.

Elsőként hozzá kell adni a modell véletlen generátorainak listájához az StdLib addXXX műveletein keresztül (ahol XXX a kívánt eloszlás neve), innentől kezdve lesz használható.

Minden egyes alkalommal, amikor egy új generátort hozunk létre, be lehet állítani az ő seed() értékét is. Ha nincs megadva explicit érték, akkor implicit 0-ra inicializálódik az értéke.

Példa:

startUp { // General seed seed(100); // U1 with seed 111 addUniform("U1", 222); // U2 with seed 0 addUniform("U2"); } ... a = uniform("U1", 1.0, 10.0); b = uniform("U2", 1.0, 10.0);