Az Argus programozási nyelv

Áttekintés

Az Argus egy kísérleti programnyelv/rendszer elosztott programok készítésének és futtatásának támogatására. Az osztott rendszert olyan gráfként képzelhetjük el, amelynek csomópontjai számítógépek, élei pedig ezen gépek kommunikációs kapcsolatát megvalósító vezetékek. A számítógépek heterogének, tehát a processzorok típusát ill. számát tekintve is különbözők lehetnek. A támogatott alkalmazásoknak két fő jellemzője van: olyan adatokat használnak, amelyeknek végig konzisztensnek kell maradniuk a párhuzamosság és a hardver hibák mellett is; valamint, hogy nem szigorúan valós idejű alkalmazások. Ilyen feladat például az irodai automatizálás és ilyenek a banki rendszerek.

Egy ARGUS program egy vagy több csomóponton fut. Minden csomópont egy számítógép, amely egy vagy több processzorral rendelkezik és egy vagy több memóriaszintje van. A csomópontok egymással történő kommunikációja a hálózat feletti üzenetváltásokkal történik. Nem teszünk kikötést a hálózat topológiájára, például a hálózat lehet lokális hálózat, vagy lehet olyan, amelyben több lokális hálózat van összekapcsolva egy távoli hálózat által. Ilyen hálózatokban általában sokkal gyorsabb elérni egy lokális információt, mint egy olyant, amelyik egy másik csomópontban van tárolva.

Az Argust elsősorban olyan programok számára fejlesztették ki, amelyek on-line adatokat tartanak karban, s így egy lényeges követelmény, hogy akár konkurens hozzáférés, akár hardver hiba esetén az adatállomány konzisztens maradjon. Így alapvetően olyan kezelőrendszert igényelnek, amely akkor is képes bizonyos szolgáltatásokat nyújtani, ha komponensei abortáltak. Ezen felül fontos követelmény az is, hogy a felügyelő rendszer komponensei meghatározott csomópontokon helyezkedjenek el (tehát nem bizonyos csomópontokból irányítsák a rendszer működését), mivel egy lokális hálózaton belül a hozzáférési költség sokkal alacsonyabb, mint egy komplex hálózaton keresztül. Az is fontos, hogy a rendszer támogassa a dinamikus hálózati igényeket, vagyis programok illetve program komponensek átirányíthatók legyenek a csomópontok között.

Az osztott programoknak meg kell birkózniuk a hardware hibáival is. A csomópont illetve a hálózat egyaránt meghibásodhat. Az egyetlen mód, ahogy egy csomópont meghibásodhat, ha abortál, feltesszük, hogy meghibásodott csomópont nem küldhet üzeneteket a hálózatra. A hálózat elvesztheti az üzenetet vagy késlekedhet annak továbbításával vagy hibásan továbbíthatja azt. Lehetséges olyan osztás, hogy bizonyos csomópontok nem képesek kommunikálni bizonyos időszakokban. Ráadásul a hálózat elronthatja az üzeneteket, de mi feltesszük, hogy az ilyen hiba detektálható. Ez a feltevés tetszőleges valószínűséggel kielégíthető úgy, hogy az üzenet redundáns információt tartalmaz.

Az Argus alapja a CLU nyelv. Apró eltérésektől eltekintve (ezek a IV. függelékben megtalálhatók), a CLU kiterjesztése. Akárcsak a CLU-ban, az Argusban is megvannak a procedurális absztrakció kifejezésére szolgáló eljárások, a vezérlési absztrakciót kifejező iterátorok, és az adatabsztrakció eszközei, a clusterek. Ezek mellett az Argusban megjelenik a 'felügyelő' (guardian), amely egy vagy több erőforráshoz biztosít ellenőrzött hozzáférést. Ugyancsak újak az Argusban az 'egyedi modulok' (equate module), ezek segítségével kényelmesen definiálhatunk konstansokat. Ahogy a CLU-ban, a modulok itt is paraméterezhetőek, egyetlen modul több -- egymással rokon -- absztrakciót is definiálhat.

Objektumok és változók

Az Argus szemantikája objektumokról és változókról szól. Az objektumok adat-entitások, az alkalmazások létrehozzák és manipulálják őket. A változók nevek, amelyek objektumokra hivatkoznak. Minden objektumnak van típusa, amely meghatározza lehetséges viselkedését. A típus meghatározza az adott típusú objektumok létrehozására és manipulálására szolgáló primitív műveleteket.

Egy objektum hivatkozhat egy másik objektumra, akár önmagára is. Egy objektum több objektumra is hivatkozhat, illetve egy objektumra több objektum is hivatkozhat. Az objektumok az eljárás- és iterátorhívásoktól függetlenül léteznek.

Az objektumoknak több kategóriája létezik az Argusban. Azokat az objektumokat, amelyek időben változhatnak mutable objektumoknak nevezzük. A mutable objektumnak van állapota, amelyet a műveletek módosíthatnak, anélkül, hogy az objektum identitása megváltozna. A mutable objektum viselkedése így időfüggő. Az immutable objektumok állapota nem választható el identitásuktól. Az immutable objektum viselkedése nem időfüggő. Egy objektum atomi, ha a rá vonatkozó műveletek számára szinkonizációt és visszaállíthatóságot (recovery) biztosít. Egy objektum átvihető (transmissible) ha lehet távoli eljáráshívások paramétere és eredménye. Mivel a felügyelő, handler, creator és node objektumok lehetnek megosztottak több felügyelő között, ezeket globális objektumoknak szoktuk mondani. Minden más objektum, karakterek, egészek, eljárások, csak egyetlen felügyelőhöz tartozhatnak, ezek lokális objektumok.

A programokban változók használatosak az objektumok futási időben történő megnevezésére. Két változó ugyanazt az objektumot is jelölheti. A változók nem objektumok, nem jelölheti őket másik változó és nem hivatkozhat rájuk másik objektum.

A felügyelő modulok változói lehetnek stabilak (stable). A stabil változók objektumai túlélik a rendszerösszeomlásokat, ezeket stabil objektumoknak nevezzük.

Értékadások és hívások

Az Argus alapeseményei értékadások és hívások. Az 'x:=E' értékadás -- ahol x egy változó és E egy kifejezés -- hatására az x változó az E kiértékeléséből származó objektumokat fogja jelölni. Objektummásolás nem történik. Egy hívás során a hívó az argumentum objektumokat a hívott rutinnak adja át, a hívott pedig az eredmény objektumokat a hívónak adja vissza. Helyi hívások esetén az argumentumok átadása az értékadásnak megfelelően történik, megosztás szerinti paraméterátadásról van szó; távoli hívások esetén érték szerinti paraméterátadás történik. Helyi hívás esetén a rutin formális paraméterei a rutin lokális változói, ezeket értékadással inicializáljuk, az aktuális paraméterek kiértékelésének eredményével. Távoli hívások esetén az aktuális paraméterek kiértékeléséből származó objektumokról egy másolat készül, és ezt jut el a hívott handlerhez vagy creatorhoz. Ezekkel a másolatokkal inicializálódnak a formális argumentumok, ugyanúgy ahogy a lokális hívás esetén. A lokális objektumok közösek a hívó és a hívott eljárás vagy iterátor számára, de sohasem közösek a hívó és a hívott handler vagy creator számára.

Típushelyesség

A változó deklarációja meghatározza azoknak az objektumoknak a típusát, amelyeket a változó megnevezhet. Ha az x:=E értékadás helyes, akkor az x változó típusának tartalmaznia kell az E kifejezés típusát. Ez általában akkor teljesül, ha a típusok egyenlőek, kivéve rutin típusok esetén. (A kevesebb kivételt tartalmazó rutin típust tartalmazza a nálánál több kivétellel rendelkező, és ettől eltekintve vele megegyező rutin típus.

Az Argus típusos nyelv, nem lehetséges egy T típusú objektumot valamilyen más, S típusú objektumként kezelni (egyetlen kivétel, amikor T rutin és típusa tartalmazza S-t). Az Argus típusossága valamint az a kikötés, hogy típuskonverzió csak clusteren belül az absztrakt és konkrét típus között lehetséges, biztosítja, hogy az objektum viselkedését kizárólag típusának műveletei határozzák meg.

Szabályok és ajánlások

Ezen leírásban végig,és különösen majd az atomicitás leírása során, a nyelv haszálatának pragmatikus szabályait, és fő irányelveit láthatjuk. Néhány tulaj- donságot mely a nyelv garantálni szeretne,mint például hogy az atomi események valóban atomiak legyenek, nagyon nehéz vagy lehetetlen teljes egészében garantálni. Mint minden használható nyelvben, a programozóknak elég "kötelük" van hogy felakasszák magukat. A szabályok és az irányelvek megprobálják világosan kijelölni a nyelv és a programozó felelősségének területét.

A Program szerkezete

Egy Argusban készült program egy vagy több guardian-t tartalmaz, melyeket a guardian modulokban kell definiálni. Ezen modulokra ugyan azon szabályok vonatkoznak mint a többi Argus-beli modult. Az Argusban programozóknak lehető- ségük van egy gépen futó "nem stabil" programok írására is,melyek tekinthet- ünk úgy is mint párhuzamos CLU programokat. Ezen programokat használhatjuk több szálon futó programok elindításához. Minden modul egy különálló szöveges egység,és egymástól külön külön is lefordíthatóak. A fordítás maga a Section 3-ban lesz bővebben tárgyalva.