Folyamatok létrehozása kommunikációja és műveletei
konstrukciója:
::= callmessage (
[ komponens-deklaráció [, komponens deklaráció]
...]
)
[konstans-paraméterek]
exit exit-típusállapot
[minimum]
[felhasználói kivételek] ...
::= inport of callmessage-típus entry-típusállapot
::=outport of inport-típus
konstans-paraméterek
::= constant ([ komponens-név [, komponens-név] ... ]
)
minimum
::= minimum minimum-típusállapot
felhasználói kivételek
::= exception felhasználói-kivétel-név
kivétel-típusállapota
Az input port, output port és callmessage típus családok a "nagyban programozás"-t hívatottak elősegíteni a rendszer processzekre bontásával, a processzek létrehozásával, köztük lévő kötések létrehozásával illetve a folyamatok közti kommunikációval.
Az input port vagy inport egy üzenet sor amelyre csatlakozás létesíthető. Hangsúlyos, hogy Hermesben az inportok értékek amely értékek inport változókban kerülnek eltárolásra, úgy mint az egészek vagy string értékek is egész vagy string változókban tárolandók.
Egy inport típus definíció meghatározza
a típus nevét amelyet üzenet típusnak nevezünk
és egy formális típusállapotot amit belépési
típusállapotnak hívunk. általában az üzenet
típusa a callmessage típusa, bár ez lehetne más
is, hiszen a send segítségével átadható
bármilyen érték az inportnak.
A belépési típusállapot megegyezik az üzenet
akkori típus értékeinek típusállapotával
amikor elküldésre kerül.
Két inport összehasonlítva akkor és csak akkor egyenlő ha azok ugyanazon inportok, vagy ugyanazon inportok konstans másolatai.
Az output port vagy outport csatlakozás egy input port ra. Haosnlóan az input porthoz ez is változó amelynek kezelése megegyezik az összes többi változó kezelésével. Változóban tárolható és üzenet formájában továbbítható. A programok azon képessége, hogy output portokat küldjenek és fogadjanak felruházza Hermest a képesség-alapú rendszerek erejével.
Két outport egyenlő, ha ugyanazon input portra csatlakoznak.
Minden new művelettel létrehozott input port különböző input port . Csakis konstans másolással hozhatunk létre azonosat.
Output port definíciója meghatározza az illeszthető input port típusát. Az adatok típus és típusállapota az output porton az illeszkedő input port üzenet típus és típusállapota által kerülnek meghatározásra.
Egy callmessage típus definíciója a következőkből áll:
A komponens deklaráció definiálja a hívási paramétereket. Ennek sorrendje fontos, hiszen híváskor a megfeleltetés is sorrendben történik.A konstans paraméterek állapota melyek komponensei nem módosíthatóak a hívott folyamat által.. Az exit formális típusállapot meghatározza a callmessage típusállapotát akkor amikor visszatér a hívóhoz normál eredménnyel. A minimum formális típusállapot meghatározza azt a legalacsonyabb típusállapotát a callmessage komponenseinek amelyre azok csökkenhetnek. Ez az a típusállapot amelyre a komponensek csökkenhetnek a callmessage eldobása után.
A callmessage kivételek kivétel névből és egy formális típusállapotból álnak. Ez a formális típusállapot határoza meg azt az állapotot amelybe a callmessage kerülhet kivétellel való visszatéréskor. A Discarded kivétel nem kerülhet bele ebbe a listába, mert ez mindenkor impliciten deklarált és az ehhez tartozó típusállapot a már korábban meghatározott minimum állapot.
Ha minimum típusállapot expliciten nem került kiírásra akkor egy olyan állapot lesz ez amelyben az összes konstans teljesen inicializált míg a többi rész inicializálatlan.
példa:
sample_interface: callmessage (
first: integer,
second: integer,
third: integer,
fourth: integer
)
constant ( first)
exit {init(first), init(second), init(
fourth)}
minimum {init(first), init(second)}
exception Failure {init(first), init(second),
init
(third), negative(first)};
sample_inport: inport of sample_interface
{init(first), init(second), init(third)};
sample_outport: outport of sample_inport;
A new művelet segíségével inicializálható
egy input port üres sorral és csatlakoztatás nélkül.
Az input port korábbi értéke eldobásra kerül.
::=new változó név
Az empty művelet a sor üres voltának lekérdezését
hívatott segíteni. Az operandusa inicializált inport
kell legyen.
::= empty of inport-változó
A connect két operandusú művelet amely a megadott
output portot csatlakoztatja a megadott input portra ha azok illeszthetők
és az input port inicializált. Az outport változó
korábbi értéke eldobásra kerül és
a művelet eredményeképpen az input port jelenlegi értékéhez
csatlakoztatja azt.
::= connect outport-változó to inport-változó
A call segítségével hajthatunk végre
hívást ami az eljáráshívásnek
feleltethető meg hagyományos nyelvekben.
Operandusai az outport változó és az argumentumok egy
listája. Az outportnak inicializáltnak kell lennie. Függvények
esetében a hívási paraméterek számának
eggyel kevesebbnek kell lennie a tényleges paraméter számnál.
A hiányzó paraméter lesz az eredmény.
Fontos megjegyezni, hogy ha a változók módosítható paramétereken keresztül kerülnek átadásra a módosítások elvesznek (például ha a 3-at átadjuk egy inout paraméternek és az eljárás 4-gyel tér vissza, a 3 értékét nem fogja megváltoztatni). Fügvényeknek az eredmény változón kívül nem lehet más módosítható változója.
Híváskor a következő lépések történnek:
Abban az esetben, ha az input port már korábban eldobásra került és az output port csatlakozás nélkül maradt Disconnected kivétel váltódik ki.
A receive utasítás segíségével az input port sorából üzenetet vehetünk ki, amennyiben az lehetséges, majd ezt egy célváltozóban tárolhatjuk. Az input port szükségszerűen inicializált. Annak meghatározása, hogy melyik üzenetet vegyük ki nemdeterminisztikusan történik.
Ha az inportnak nincs csatlakozása, akkor a Disconnected kivétel lép fel.
Ha van csatlakozása, de nincs ide küldött üzenet a fogadó utasítás végtelen ideig blokkolásra kerül.
::= receive callmessage-változó from inport-változó
A return utasítás által a callmessage visszatér a hívóhoz és a hívó végrehajtása újrakeződik.Opcionálisan egy kivétél is okozhat visszatérést a hívóhoz.
Visszatérés után a callmessage inicializálatlanná válik.
A folyamat végrehajtása folytatódik return végrehajtása után. Azaz nem terminál automatikusan ekkor. ámbár ez is megvalósíható az utasításnak a processz végére írásával vagy egy ezt követő ugrással a folyamat végére.
::=return callmessage-változó [exception felhasználói-kivétel-név]
A send egy változó értékét átmozgatja és sorba teszi egy input portra vonatkozóan. Operandusai a forrás változó és egy outport.Az említett változónak megfelelő típusúnak kell lennie és a típusállapota vagy egyezzen a belépési típusállapottal vagy magasabb legyen annál. Magasabb állapotra alkalmazhatóak megszorító műveletek és így elérhető a kívánt állapot. Az outportnak inicializáltnak kell lennie.
::= send forrás-kifejezés to outport-kifejezés
A create új processzt hoz létre. Operandusa a predefined!program típusú változó. Az eredmény egy outport.
A program típusállapotának ellenőrzöttnek kell lennie. A program processzek halmaza amelyek közül egy a fő program. A főprogram egy source module által előállt process_module konverziójának eredménye
Az inicializációs port az a változó amely a process
kulcsszót követi. Ennek input port típusúnak kell
lennie. Create végrehajtásakor a portok illeszthetőségének
ellenőrzése történik (ez az input port típus
egyezik-e a create által eredményezettel, ha nem InterfaceMismatch
váltódik ki).
Ha a kivétel nem lép fel az új processz létrejön
Ez a processz hajtja végre a program változóban lévő
főprogram által definiált programot, ami a begin kulcsszónál
indul.
::= create of változó.
A procedure művelet processz generátor művelet. Ellenőrzött programot kap paraméterként és output portot eredményez. Az InterfaceMismatch itt is felléphet akárcsak a create-nél.
Hatása hasonló a create-hez, de vele mégsem azonos. Az eltérés a következő:
Ami létrejön az nem a kijelölt programot futtató processz, hanem egy generátor processz.
Minden generátor folyamat hívásakor létrehozza a kijelölt programot futtató folyamat egy példányát. Ami azt követően elküldi a callmessage-t amit kapott az új folyamat inicializációs portjára.
::= procedure of változó