Az Euclid programozási nyelv

Párhuzamosság: Concurrent Euclid

Bevezető

Az Euclid nyelvben egyáltalán nincs nyelvi eszköz a párhuzamosság támogatására. Erre fejlesztették ki azonban a Concurrent Euclid -ot.

A Concurrent Euclid (ConEuc) "párhuzamos" leszármazottja a James Cordy és Rick Holt által a Toronto Egyetemen 1980-ban kifejlesztett Euclid programozási nyelvnek. A ConEucot párhuzamos, nagy teljesítményű, magas szinten megbízható rendszerprogramok írására tervezték, mint pl. operációs rendszerek, fordítóprogramok, és beágyazott processzor-rendszerek. A TUNIS operációs rendszert, egy UNIX-variánst teljesen ConEuc nyelven implementáltak. A Toronto UNIversity System a kora-80-as években a torontói egyetemen fejlesztett, UNIX -hoz hasonló operációs rendszer. Legközelebb a UnixV7-hez áll, de teljesen újratervezett kernellel. A ConEuc az Euclid egy(az alapokat egybefoglaló) "mag-részét" terjeszti ki processekkel, monitorokkal (C.A.R. Hoare specifikációja szerint), valamint rendszerprogramozási nyelvi konstrukciókkal, mint pl.elkülöníthető fordítás, abszolút című változók, típuskonverziók, long-integer típus(ok), stb.

A ConEuc -t egy kicsi(50k bytes), gyors, hordozható fordítóval implementálták, ami önfordító, cserélhető kódgenerátorokkal. Számos számítógép-architektúrához fejlesztettek magas színvonalú kódgenerátorokat úgymint PDP-11, VAX-11, Motorola 68000 és Motorola 6809, amelyek a legjobb C fordítókhoz hasonlítható kódokat produkáltak. Concurrent Euclid programok futtathatóak magán a számítógépen is (egy apró assembly - kernellel támogatva), vagy szimulációs/szimulált módban, egy operációs rendszer egyszerű processeként.

A Turing programozási nyelv közvetlen leszármazottja ConEuc -nak; végül is a legtöbb alkalmazásban ennek Turing Plus dialektusa helyettesíti a ConEuc -ot. TTV editor: komplett ConEuc IDE eszköz.(A Toronto egyetemen :( ) - Turing 4.1.1: ingyenesen letölthető.

ConEuc
Paradigma: multi-paradigmás:struktuált, imperatív, funkcionális
"Nyilvánosságra hozták":1980-ban
Tervezők:James Cordy & Ric Holt
Fejlesztők:James Cordy & Ric Holt
Típusrendszer:erősen típusos, statikus
"Tervezésére hatott":Euclid, Communicating Sequential Processes
"Tervezése hatott":Turing Plus
"Operációs rendszer:"Több platformon működik : PDP-11, VAX-11, Motorola 68000, Motorola 6809

(a fenti bevezető forrása: wikipedia.org)

Folyamtok, monitorok

Következzen egy tömör leírás a ConEuc párhuzamosságot leíró nyelvi elemeiről. A párhuzamos végrehajtás specifikálására és irányítására a ConEuc folyamatokat, monitorokat, (őr)feltétel-változókat, wait -és signal-utasításokat, és prioritási feltételeket alkalmaz. Egy folyamat vázlatos leírása látható az első ábrán.

var ModuleName: module include ... ... process ProcessName1 imports ... begin ... end ProcessName1 process ProcessName2 imports ... begin ... end ProcessName2 end module

Figure 1. Concurrent Euclid Processes

Az első ábrán látható példa két folyamatot deklarál a ModuleName modulon belül. Bármely modul tartalmazhat folyamatokat, amelyek a modul iniciális művelete után következnek (már ha létezik ilyen a modulban). A folyamatok párhuzamosan, nem-determinisztikus sebességgel hajtódnak végre. Egy folyamat importálhatja a modulban deklarált műveleteket/alprogramokat. Az összes eljárás és függvény re-entráns. Monitorokat a modulokhoz hasonlóan deklarálhatunk ConEuc -ban. A második ábrán egy ConEuc monitor vázlatos formája látható.

var ModuleName: module include ... var MonitorName: monitor imports ... exports (Procedure1, Procedure2) var ... {these are the variables housed in the monitor } procedure Procedure1 = imports ... begin ... end Procedure1 Procedure2 = imports ... begin ... end Procedure2 end monitor process Process1 imports (var MonitorName) begin ... MonitorName.Procedure1 ... end Process1 process Process2 imports (var MonitorName) begin ... MonitorName.Procedure2 ... end Process2 end module

Figure 2. Concurrent Euclid Monitors

A második ábrán egy monitort, a MonitorName -t deklaráltunk. A monitor változókat és alprogramokat tartalmaz. Két műveletet exportáltunk a monitorból: Procedure1 -et és Procedure2-t. Két folyamatot deklaráltunk Process1 és Process2 néven. Mindkét folyamat egy import záradékban importálja a MonitorName monitort. A monitorban deklarált műveletekhez a folyamatok ezzel az import záradékkal férnek hozzá. Process1 a monitor Procedure1 műveletét hívja. Procedure1 eléri a monitorban deklarált változókat. Egy monitor nem tartalmazhat modulokat, monitorokat vagy folyamatokat. Nem exportálhat változókat, csupán műveleteket. Semmi amit a monitorban deklarálunk nem látható a monitoron kívül, hacsak nem lett explicit exportálva egy export záradékban. A monitor tartalmazhat iniciális műveletet, ami előbb végrehajtódik mint a monitorba belépő műveletek (értsd: a monitorba történő első belépés alkalmával egyszer, a belépő process előtt). Természetesen, a monitorban egyszerre csak egy művelet hajtható végre.

Szinkronizáció

A ConEuc a szinkronizációt (őr)feltétel-változókkal és a wait, signal műveletek hívásával oldja meg. (Őr)feltétel-változókat monitoron belül deklarálhatunk. A wait és a signal (ezeken a) feltétel-változókon végez műveleteket. Wait és signal kizárólag monitor belsejéből hívható. A feltétel-változókat folyamatok soraként is vehetjük (mint a monitor egy várakozási sora). Egy wait(c) hívás a (monitor egy műveletét) hívó folyamatot berakja c várakozási sorba. Azután a hívó folyamatot kiléptetik a monitorból. A signal(c) eltávolít a c -ből egy várakozó folyamatot. Azután a signal-t hívó folyamatot kiléptetik a monitorból, és visszakerülhet és folytatódhat abban az esetben, ha már nincs több folyamat a monitorban. Ha egy signal(c) hívásakor nincs folyamat a c várakozási sorban, a (signal-t) hívó folytatódhat megszakítás nélkül. A folyamatok határozatlan sorrendben "törlődnek" egy (őr)feltétel-változó-várakozási-sorból. Ezért nem várhatjuk el, hogy a sorrend FIFO legyen. Ebben a környezetben lazán értelmezzük a sor fogalmát, nem szükséges, hogy igazi sorként kezeljük. A signal és wait -hoz kiegészítésképpen a ConEuc egy empty műveletet is megvalósít. Az empty egy Boolean függvény, ami feltétel-változókon operál és igazzal tér vissza ha van éppen a feltétel várakozási sorában folyamat; különben hamissal tér vissza.
Elnézést, a cikkben ez áll angolul (meglehet nézni), de a példaprogramoknál látott kódokkal éppenhogy fordítva lenne konzisztens.

A ConEuc prioritásos feltételeket is biztosít. Amikor a wait -et prioritásos feltételre hívjuk, a wait-nek megadunk egy nem-negatív prioritás értéket is, pl.: wait(c,3). Amikor pedig egy prioritásos feltételhez egy signal keletkezik, a legkisebb prioritású folyamat lesz felélesztve a várakozási sorból. Ezzel zárjuk ezt az ismertetőt. Bár tömör, de a példakódok értelmezéséhez elég kell legyen. A ConEuc párhuzamossággal kapcsolatos tulajdonságainak és használatuknak részletesebb leírása elérhető(a Toronto Egyetemen :( ) az alábbi hivatkozás(ok) használatával:
"Concurrent Euclid, the UNIX system, and Tunis" Holt. (R. C. Holt)

Fordítókról

A Toronto University -n így fordítanak:
A ConEuc compiler kétféleképp használható. Az egyik, hogy egy kézhezálló szövegszerkesztővel megírjuk a forrásfájlt. Mentsük el ".e" kiterjesztéssel. Azután hívjuk a compilert "cec filename.e" formában. A hibák(ha vannak) listája a filename.lst fájlban lesz megtalálható. A másik módszer a beépített fejlesztő környezet, a TTV(Toronto Teaching enVironment) használata. A "TTV" paranccsal hívható. A TTV szerkesztő a programírásra éppúgy alkalmas, mint a lefordítására vagy futtatására, az editor elhagyása nélkül (IDE eszköz :) ). Az op. rendszer promptjára írt "HOW"-al elérhető a compiler súgója. A cec parancssori opciók megtekintéséhez gépelje be:
"cec-h".

A TUNIS -ról

A TUNIS-t (Toronto UNIversity System) "hordozható, magas színvonalú, gyönyörűen felépített" operációs rendszernek szánták a készítői, bevallásuk szerint 1981-ben még éppen tesztelés alatt állt. Noha igen nagy mértékben kompatibilis a UNIX v7 -al, a kernelje teljesen máshogy épül fel. Magas szinten struktúrált, rétegeinek építőkövei ConEuc modulok. Minden modul az absztrakció egy újabb szintjét támogatja,méghozzá az import/export (láthatósági) szabályokkal. Példának vegyük a "memóriakezelő" modult: a felhasználói folyamatoknak futási területet biztosító memória-részeket valósítja meg (pl. "memória-rész" -típussal). A "memóriakezelő" szintjén kívül lényegtelen hogy cserével vagy lapozással kezelik ezeket a memória-részeket.
Általános célú operációs rendszer, azon felül 16 bites mikroprpocesszorral dolgozó önálló munkaállomásokra is szánták a tervezők, támogatásként mikroprocesszor-fejlesztő rendszerekhez,stb. Az apró assembly magon kívül mindent ConEucban írtak. Az itt használt ConEuc -compiler önfordító, kis méretű(50k), négymenetes fordító.