A Cupit párhuzamos nyelv mesterséges neuronok programozására

Utasítások, vezérlési szerkezetek

Deklarációk

Definíciója:

TypeId AccessType Identifier [:= InitialValue]
AccesType: CONST VAR IO
, ahol a CONST értelem szerűen konstanst takar a VAR pedig változót. Az IO az I/O műveletek elvégzésére fenntartott váltózókat jelenti. Mivel minden architektúrán, operációs rendszeren ez más, a nyelv így ad módot a platformfüggetlenség, illetve a hordozhatóság megvalósítására. Ezen változók értékének lekérdezése, megváltoztatása ezen okból különbözik a többi változóétól, (lsd. később).

A nyelvben megtalálhatók az egyszerű utasítások, mint értékadás, vezérlésátadás, de megtalálható a párhuzamosságot és a halók felépítését segítő eszközök is.
Az utasításokat a ; választja el. Megengedett az üres utasítás is,de különösebb szerepe nincs.

Értékadások, kifejezések

C-hez hasonlóan nemcsak az egyszerű értékadás használható (:=), hanem a += -= *= /= %= is. Csomópontnak értékét csak az élek csatlakozása előtt lehet adni. Ennek oka, hogy csomópontok saját életet élnek, hát gondoskodjanak ők minderről.
Az értékadáshoz tartozik még az I/O művelet is. Ennek megkülönböztetésére, mint már említésre került, a fordítók platformfüggése miatt volt szükséges.

  Object <-- Object 
  Object --> Object 

Értékadások, kifejezések további kérdése, a típusok egyezése. Egyszerű típusoknál ez megegyezik a Module-2 megvalósításával. Intervallumoknál pedig akkor adható értékül az egyik a másiknak, ha az képes magába foglalni az eredetit. Operátorok:
Prioritás Operátor Leírás
1?:összevont if-then-else
2ORlogikai or
2XORlogikai xor
3ANDlogikai and
4= <> < >összehasonlítás
4<= <=összehasonlítás
4INIntervallum eleme
5BITORBittenkénti or
5BITXORBittenkénti xor
5...intervallum létrehozása
6BITANDBittenkénti and
7LSHIFTBalra tolás
7LRIGHTJobbra tolás
8+ -Összeadás kivonás
9* /Szorzás osztás
11**Hatványozás
11NOTLogikai not
11BITNOTBittenkénti not
11-Aritmetikai negáció
11MINIntervallum alsó határa
11MAXIntervallum felső határa
11RANDOMVéletlenszám
11TypeExplicit típus konverzió
12[]Tömb/Group eleme, párhuzamos változó létrehozása
13.Recor eleme
14()Zárójelezés

Adatok elérése, címzése

Adatokra a nevükkel, esetleg minősített nevükkel utalhatunk. Lehetőség van azonban kulcsszavas minősítésre is.
MEObjektumok alprogramjaiban használható és azt az objektumot jelenti, amire a hívás vonatkozott. Hasonlít a C++ this kulcsszavára.
YOU Használata a WTA, REDUCTION, MERGE esetében van (lsd. később). Ilyenkor a "második" objektum elemeit lehet segítségével elérni.
INDEX Csoportokra, tömbökre kiadott utasításoknál (lsd. alprogramok hívása) használható és visszaadja, hogy hányadik elemről van szó.

Alprogramok hívása

Az alprogramokat többféle csoportba oszthatjuk be: eljárás, függvény, művelet. Az eljárások természetesen jellegükből fakadóan objektumok tagjai is lehetnek, míg műveleteket csak globálisan definiálhatunk. Ennek ok, hogy a definiálható műveletek fordítása a párhuzamosság minél magasabb fokú kihasználtságát kísérli meg.

Eljárás

Az alprogramok definiálása a Modula-2 programnyelvhez hasonlóan történik. Eljárás esetén a PROCEDURE kulcsszó után a név, a paraméterlista, az IS kulcsszó, majd az utasítások és az azt záró END. A paraméterlistában lehetőség van érték szerint (alapértelmezett) és cím szerint (VAR kulcsszó) átadni a paramétereket. (Pontosabban, hogy érték , vagy érték-eredmény szerinti a paraméterátadás fordító függő - ennek oka, hogy, ez a szerző szerint függhet a párhuzamos rendszertől, és így szabadságot ad, az optimalizáláshoz.)
További lehetőség a CONST kulcsszó használata, melynek hatására a paraméter értékét nem lehet megváltoztatni.
Ha az alprogram egy objektumhoz tartozik (Node, Connection, Network), akkor a ME kulcsszóval a hívó objektum elemeit lehet elérni.
Függvény esetén a visszatérési érték típusával kell kezdeni a deklarációt, melyre a rekordnál elmondottak vonatkoznak. Érdekesség, hogy, míg függvénynek is lehet VAR paramétere és így azokat megváltoztathatja, a ME kulcsszóval elérhető elemeknek csak az értékét kérdezheti le.
A CuPit, lehetőséget ad az EXTERN kulcsszó használatára, ami csak deklarálja, de nem definiálja az alprogramot. (Az eljárásnak természetesen definiáltnak kell lenni valahol később.)

Reduction utasítás

Mivel ez egy művelet, melyet objektumok halmazán szándékozunk végrehajtani, szintén párhuzamos futást eredményez.
Szintaxisa:

REDUCTION obj.d:op INTO x
Ennek eredménye a következő három lehet:
1. obj egy háló változó. Ekkor a hívás helye a főprogramban kell hogy legyen,és d egy adattagja (nem csomópont, csomópontok csoportja) a hálónak. Az eredmény az x változóban a d adattagok redukáltja tárolódik.
2. obj csomópontok csoportja. Hívás helye ekkor háló alprogramja, d a csomópont adattagja, az eredmény pedig a csomópont d adattagjának redukáltja.
3. obj interface eleme egy csomópontnak. Hívás helye a csomópont alprogramja, d pedig adattagja az interface-hez csatlakozó élnek. A redukálás eredmény ekkor is x-be kerül.
Ha obj üres, akkor x értéke nem változik.

Winner-takes-all utasítás

Az elv a REDUCTION utasításhoz hasonló. A

 WTA obj:d.op:p(param)
eredménye:
1. obj háló változó. Hívás helye a főprogram, d adattag a hálóban. Az eredmény pedig az, hogy csak az összes példány op művelethez és d adattaghoz viszonyított győztesére hívódik meg a p eljárás.
2,3 eset a REDUCTION műveletnél elmondottakkal analóg módon valósul meg, és ha az obj halmaz üres, p hívása nem következik be egyáltalán.

Merge-hívás
Szintaxisa:
 MERGE obj;
Jelentéséről már volt szó.
Hívni csak a főprogramból lehet.

Vezérlési szerkezetek

Return

Alprogramok törzsében adható meg. Szerepe, az alprogramból történő kilépés, a visszatérési érték megadása.
Függvények esetén mivel ez az egyetlen mód, hogy megadjuk a visszatérési értéket, így legalább egy RETURN kulcsszónak szerepelnie kell a törzsben.

Elágazás

A többi programozási nyelvhez képest nem ad semmi újat.

IF kif. THEN utasítások ELSE utasítások END; IF kif. THEN utasítások ELSEIF kif. THEN utasítások ... END IF kif. THEN utasítások END

Ciklusok

A teljes definíció a következő:

LoopStmt: OptWhilePart REPEAT stmts OptUntilPart END OptREPEAT | FOR Object := expression ForLoopStep Expression REPEAT stmts OptUntilPart END OptRepeat OptWhilePart: /* nothing */ | WHILE expression OptUntilPart: /* nothing */ | UNTIL expression OptREPEAT: /* nothing */ | REPEAT ForLoopStep: UPTO | TO | DOWNTO
Itt a WHILE, UNTIL a többi programnyelvből megszokott intuitív definíciót kapta, a FOR ciklusnak pedig a következő jelentés jutott:
FOR i:= f TO t REPEAT s; UNTIL c END; i := f; t2:=t; WHILE i<=t2 REPEAT s; IF c THEN BREAK END; i += 1; END;

Adatok létrehozása

REPLICATE Object INTO expression;
Az objektumot expression példányban hozza létre. A 0 a törlést (öntörlést:) jelenti, az 1 pedig semmit sem tesz. Ha ez a szám negatív, hiba keletkezik.
Élek replikálásánál csak a 0,1 megengedett. Csomópontok esetén pedig expression-1 db új csomópont keletkezik. Hálók esetén további plusz, hogy expression helyett intervallumot is meg lehet adni. Ekkor annyi új példány keletkezik (az intervallumon belül), hogy a program a lehető leggyorsabban fusson.
EXTEND Object BY expression;
Ennek eredménye, hogy egy halón belül a csoportban levő csomópontok számát expression mennyiséggel változtatja meg a halmaz tetejétől számolva. Ha a végeredmény negatív szám lenne, run-time hiba lép fel.
CONNECT Object1 TO Object2; DISCONNECT Object1 From Object2;
Éleket lehet így definiálni. Fontos, hogy az élek irányítottak, és a csomópontok interface részének meg kell felelniük egymásnak. Például a CONNECT a[2...4].out TO b[].in1 eredménye az lesz, hogy létrejönnek élek az "a" 2,3,4 csomópontokból a b csomópontjaiba (a,b csomópontok csoportja/tömbje) mutatva. Amennyiben ezen élek léteztek, semmi sem változik.
A DISCONNECT a CONNECT inverze.
CONNECT/DICONNECT nem hajtható végre, mikor a háló replikálódik.