Occam (nyelv)

occam
Az első változat kelte 1983
Paradigma Egyidejű programozás , elosztott számítás , kötelező
Fejlesztő Inmos
Utolsó verzió 2.1 (1988)
Befolyásolta Szekvenciális folyamatok kommunikálása

Az Occam programozási nyelv egy párhuzamos architektúrához igazított programozási nyelv, amely 1983-ban jelent meg. Az Inmos fejlesztette ki Transputer párhuzamos architektúráinak programozására , de más platformokra is portolták.

A név tisztelgés Occami Vilmos (néha Ockham betűvel) és Occam borotvájának módszertani elve előtt .

Az Occam nyelv olyan eljárási nyelv, amely az utasítások szekvenciális (SEQ-val) végrehajtása mellett az utasítások párhuzamos végrehajtását (PAR-val), sőt a folyamatok (ALT-vel) „aszinkron párhuzamítását” is kínálja egy nem a sok közül az egyik determinisztikus végrehajtása. A folyamatok PAR-ban történő végrehajtása kinevezésekkel történik, mint Adában .

Az Occam tartalmazza Edsger Dijkstra "őrzött parancsát" is  : egy folyamat csak akkor indul el, ha az őrének a rendszer által értékelt értéke igaz.

Ennek a nyelvnek az Inmos Transputer Development System (TDS) volt a klasszikus fejlesztõeszköze, de a Parallel C vagy más eszközöket is lehetett használni . A TDS szerkesztő lehetővé tette a kódhajtogatást , ami nagyon innovatív volt.

Alapelvek

Az Occam-ban jelentős a behúzás, amely elkerüli a Pascaltól és a C-től örökölt más nyelvek közös blokkjainak kezdetét és végét (kezdet ... vég, {...}, hurok ... endloop stb. ). Egy kifejezést a sor vége zár le. Több kifejezés csoportosítható egy blokkba, ahol az összes sor ugyanazon behúzással kezdődik.

A párhuzamos folyamatok közötti kommunikáció a "CHAN OF" kifejezés által meghatározott "csatornákkal" történik. Ezeket a csatornákat a gyors soros kétirányú kapcsolatok valósítják meg (2 Mb / s, 4 link / Transputer, a CPU-tól független kommunikáció). Egy folyamat adatokat küld a csatornán a "!" Karakterrel míg egy másik folyamat "?" jellel fogadja az adatokat, az átvitel és a vétel szinkron:

keyboard ? c screen ! c

A SEQ bemutatja az egymás után kiértékelt kifejezések listáját. Példa:

SEQ x := x + 1 y := x * x

A PAR közzéteszi azoknak a kifejezéseknek a listáját, amelyeket valószínűleg egyszerre értékelnek. Példa:

PAR p() q()

Az ALT a megtartott állítások listáját jelzi . Az őrök a bináris feltételek és a csatorna bemenetének kombinációi. Alternatív megoldás valósul meg azok között, akiknek feltételei igazak és készek a bemeneti csatornák. Példa:

ALT count1 < 100 & c1 ? data SEQ count1 := count1 + 1 merged ! data count2 < 100 & c2 ? data SEQ count2 := count2 + 1 merged ! data status ? request SEQ out ! count1 out ! count2

Ez a példa beolvassa a "c1" és a "c2" csatornák adatait (ha készen állnak), és egyetlen "egyesített" kimeneti csatornává egyesíti azokat. Ha a countN számláló eléri a 100 értéket, akkor az N csatorna olvasása le lesz tiltva. A csatorna állapotára vonatkozó kérésre a két számláló válaszol.

Kódpéldák

Néhány valós kód példa

PROC Passe1 ( CHAN OF ANY FromKeyboard, CHAN OF INT FromServer, CHAN OF ANY ToServer, CHAN OF ANY FromNetwork, ToNetwork, []CHAN OF Process FromMenu, CHAN OF FilerProtocol FromFiler, ToFiler, []INT UserWindow, SystemWindow, []INT ConfigData, freespace, VAL []BYTE parnomfic, parNumVersion, FicSorties, INT FicSortiesPtr ) -- Constantes de configuration disque VAL WrkExt IS ".CPS": VAL OutExt IS ".LIE": VAL IntExt IS ".$$$": VAL MaxCompressedRecordSize IS 45: -- taille avec compression CGA !!! VAL kAccesSequentiel IS TRUE: VAL theta1 IS 1.618 (REAL32): -- Constantes estimees VAL MaxTailleZone IS 9111833: VAL MaxVilles2 IS INT ROUND ((REAL32 TRUNC MaxVilles)*theta1): -- Variables [ReadBufferSize]BYTE MyReadBuffer: INT FicPos, FicSize: -- position dans, et nombre d'octets du, fichier [80]BYTE FicRes1, FicInt: -- Fonctions BOOL FUNCTION EndOfFile() IS ( (FicPos+MyReadPtr) >= FicSize ) : BOOL FUNCTION NotFini() IS ( (Result=0) AND (NOT EndOfFile()) ) : PROC Erreur ( VAL []BYTE par ) [82]BYTE loc: --BOOL poub: --INT len: SEQ --len:=82 --InitTabByte(loc,' ') [loc FROM 0 FOR (SIZE par)]:=par [loc FROM (SIZE par) FOR 2]:="*c*n" --delete.string(len,loc,(SIZE par) + 2,81 - (SIZE par),poub) WriteInTextWindow(ToServer,SystemWindow,[loc FROM 0 FOR (SIZE par) + 2])) -- previously UserWindow

Egy másik példa :

IF sgf.res <> 0 SKIP TRUE IF compare.strings (ThfareKey, "99999999") <> 0 SEQ ThfareKeyInt := AtoI (ThfareKey) ThfareOffsets [ThfareKeyInt] := Offset TRUE SKIP

Példa egy csatorna multiplexerre:

WHILE TRUE VAR x; SEQ ALT c1 ? x c2 ? x c3 ? x

Evolúció

Lásd is

Kapcsolódó cikkek

Külső linkek

Hivatkozások

  1. Inmos műszaki megjegyzés a TDS-ről
  2. http://www.moria.de/~michael/fe/folding.html
  3. (en) Ericsson-Zenith , Occam 2 Reference Manual , Prentice-Hall,1988( ISBN  0-13-629312-3 )