Occam (dil)

Occam
İlk versiyonun tarihi 1983
Paradigma Eşzamanlı programlama , dağıtılmış hesaplama , Zorunlu
Geliştirici Inmos
Son sürüm 2.1 (1988)
Tarafından etkilenmiş Sıralı süreçleri iletmek

Occam programlama dili bir programlama dili O tarafından geliştirilen 1983 yılında ortaya çıktı, mimari paralel şekilde adapte olan Inmos onun programlanması için Transputer paralel mimarileri , aynı zamanda diğer platformlara taşıdık edilmiştir.

İsim, William of Occam'a (bazen Ockham olarak yazılır) ve Occam'ın usturasının metodolojik ilkesine bir övgüdür .

Occam dili, komutların sıralı olarak (SEQ ile) yürütülmesine ek olarak, talimatların paralel olarak yürütülmesini (PAR ile) ve hatta süreçlerin (ALT ile) "asenkron paralelleştirilmesini" sunan bir prosedür dilidir. birçoklarından birinin deterministik uygulaması. Süreçlerin PAR'da yürütülmesi Ada'da olduğu gibi randevularla yapılır .

Occam ayrıca Edsger Dijkstra'nın "korunan emirlerini" de içerir  : bir süreç ancak sistem tarafından değerlendirilen korumasının değeri doğruysa başlatılır.

Inmos Transputer Geliştirme Sistemi (TDS) Bu dil için klasik geliştirme aracı, ama kullanmak mümkün oldu Paralel C veya diğer araçları. TDS editörü , çok yenilikçi olan kod katlamaya izin verdi .

Temel prensipler

Occam'da girinti önemlidir, bu da Pascal ve C'den miras alınan diğer dillerde ortak olan blokların başlangıç ​​ve bitiş işaretlerinden kaçınır (begin ... end, {...}, loop ... endloop vb. ). Bir ifade, bir satır sonu ile sonlandırılır. Tüm satırların aynı girintide başladığı bir blokta birkaç ifade birlikte gruplanabilir.

Paralel süreçler arasındaki iletişim, "CHAN OF" ifadesi ile tanımlanan "kanallar" ile yapılır. Bu kanallar hızlı seri çift yönlü bağlantılar (2 Mb / sn, 4 bağlantı / Transputer, CPU'dan bağımsız iletişim) ile gerçekleştirilir. Bir işlem verileri kanal üzerinden "!" İle gönderir. başka bir işlem verileri "?" ile alırken, iletim ve alım eşzamanlıdır:

keyboard ? c screen ! c

SEQ , birbiri ardına sırayla değerlendirilen ifadelerin bir listesini sunar. Misal:

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

PAR , eşzamanlı olarak değerlendirilmesi muhtemel ifadelerin bir listesini duyurur. Misal:

PAR p() q()

ALT , tutulan ifadelerin bir listesini gösterir . Korumaları ikili koşulları ve kanalda giriş kombinasyonlarıdır. Koşulları doğru olan ve giriş kanalları hazır olanlardan bir alternatif çalıştırılır. Misal:

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

Bu örnek, "c1" ve "c2" kanallarından (hazırlarsa) verileri okuyacak ve bunları tek bir "birleştirilmiş" çıkış kanalında birleştirecektir. CountN sayacı 100'e ulaşırsa, N kanalının okuması devre dışı bırakılacaktır. Kanalın durumu ile ilgili bir talep iki sayaç tarafından cevaplanacaktır.

Kod örnekleri

Bazı gerçek kod örnekleri

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

Başka bir örnek :

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

Kanal çoklayıcı örneği:

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

Evrim

Ayrıca görün

İlgili Makaleler

Dış bağlantılar

Referanslar

  1. TDS hakkında Inmos teknik notu
  2. http://www.moria.de/~michael/fe/folding.html
  3. (en) Ericsson-Zenith , Occam 2 Referans Kılavuzu , Prentice-Hall,1988( ISBN  0-13-629312-3 )