Joyce (programmeringsspråk)
Paradigm | samtidig , imperativ , strukturerad |
---|---|
Familj | Wirth Pascal |
Designad av | Per Brinch Hansen |
Dök först upp | 1987 |
Stabil frisättning | 1/1987
|
Maskinskrivningsdisciplin | Stark |
Influerad av | |
att kommunicera sekventiella processer , Pascal , Samtidigt Pascal | |
Influerad | |
SuperPascal |
Joyce är ett säkert programmeringsspråk för concurrent computing designat av Per Brinch Hansen på 1980-talet. Det är baserat på det sekventiella språket Pascal och principerna för att kommunicera sekventiella processer ( CSP). Det skapades för att åtgärda bristerna i CSP som ska användas som ett programmeringsspråk, och för att tillhandahålla ett verktyg, främst för undervisning, för implementering av distribuerade datorsystem.
Språket är baserat kring begreppet agenter ; samtidigt exekverade processer som endast kommunicerar med hjälp av kanaler och meddelandeförmedling . Agenter kan aktivera subagenter dynamiskt och rekursivt . Utvecklingen av Joyce utgjorde grunden för språket SuperPascal , även det utvecklat av Hansen runt 1993.
Funktioner
Joyce är baserad på en liten delmängd av Pascal, utökad med funktioner inspirerade från CSP för samtidighet. Följande avsnitt beskriver några av de mer nya funktionerna som introducerades.
Agenter
En agent är en procedur som består av en uppsättning satser och möjligen kapslade definitioner av andra agenter. En agent kan dynamiskt aktivera subagenter som körs samtidigt med deras skapare . En agent kan endast avslutas när alla dess subagenter också har avslutats. Till exempel aktiverar en agent process2
process1
:
agent process1 ( x , y : heltal ) ;
börja ... slut ; agent process2 () ;
använd process1 ; påbörja process1 ( 9 , 17 ) ; slut ;
Aktiveringen av en agent skapar nya instanser av alla lokala variabler och värdet för varje formell parameter kopieras till en lokal variabel. Därför kan agenter inte komma åt variabler för andra agenter och får endast kommunicera genom användning av kanaler. Denna begränsning förhindrar problem i samband med användningen av delade variabler såsom rasförhållanden .
Kommunikation
Agenter kommunicerar genom enheter som kallas kanaler . Kanaler har ett alfabet som definierar uppsättningen symboler som kan sändas. Kanaler skapas dynamiskt och nås med hjälp av portvariabler . En porttyp definieras av en distinkt uppsättning symboler som utgör dess alfabet. Symboler med flera värden definieras med en specifik typ. Till exempel:
ström = [ int ( heltal ) , eos ] ;
Symbolen int(heltal)
betecknar en meddelandesymbol som kallas int
av vilket heltalsvärde som helst. Den andra typlösa symboldeklarationen eos
(end of stream) heter en signal . När en porttyp har definierats kan en portvariabel av den typen deklareras:
ut : strömma in : strömma
Och sedan kan en kanalenhet, intern hos agenten som skapar den, aktiveras enligt följande:
+ut;
Symboler kan sedan skickas och tas emot på kanaler med CSP-liknande in- och utgångsoperatorer ?
och !
respektive. En kommunikation kan bara ske om det finns en mottagande agent som matchar den sändande agenten. Den mottagande agenten måste förvänta sig att ta emot symboltypen som skickas. skickas värdet 9 följt av eos- symbolen vid port
ut
:
ut ! int ( 9 ) ut ! eos
Och ett heltalsmeddelande tas emot i en variabel av matchande typ, följt av eos
:
mottagen : heltal i ? int ( mottaget ) i ? eos
Valutlåtanden
Omröstningsutlåtanden är baserade på CSP-konceptet med skyddade alternativ. En polling-sats består av en uppsättning satser, var och en skyddad av en ingångskanalsats. När en kommunikation matchas mellan en sändande agent och en vakt, exekveras bevakningen, följt av motsvarande uttalande. Till exempel:
omröstning i ? X -> x := x + 1 | i ? Y -> y := y + 1 ände
Där porten in
övervakas för signalerna X
eller Y , på en matchande kommunikation,
inkrementeras motsvarande variabler x
eller y .
säkerhet
Joyce designades för att vara ett säkert språk i den meningen att en kompilator skulle kunna upptäcka alla brott mot språkreglerna.
Exempel på program
Följande är ett komplett exempelprogram, hämtat från originalartikeln som introducerar programmeringsspråket Joyce, som implementerar en algoritm för att generera primtal baserat på en siktningsteknik för generering av primtal . Ett siktmedel
skickas en ström av heltal från sin föregångare, den första är ett primtal. Den tar bort alla multiplar av detta primtal från strömmen och aktiverar en efterföljare. Detta fortsätter tills eos
-signalen fortplantas längs uppsättningen av siktar.
0
agentsil ( inp , ut : ström ) ; _
var mer : boolean ; x , y : heltal ; succ : ström ; börja omröstning inp ? int ( x ) -> + succ ; sila ( succ , ut ) ; mer := sant | inp ? eos -> ut ! eos ; mer := falskt slut ; medan fler gör poll inp ? int ( y ) -> om y mod x <> så succ ! int ( y ) | inp ? eos -> ut ! int ( x ) ; succ ! eos ; mer := falskt slut ; slut ;
Följande agent initierar uppsättningen siktmedel och matar in en ström av heltal mellan 3 och 9999 i dem.
agent primtal ;
använda generera , sikta , skriva ut ; var a , b : stream ; börja + a ; + b ; generera ( a , 3 , 2 , 4999 ) ; sikt ( a , b ) ; print ( b ) slut ;
Genomförande
Stacktilldelning
På grund av samtidig exekvering av agentprocedurer kan ett konventionellt sekventiellt stackallokeringsschema inte användas eftersom aktiveringsposterna för agentanropen inte följer ett sist-in-först-ut-mönster. Istället bildar skapar-subagent-relationerna en trädstrukturerad stack. Ett enkelt schema används för att implementera detta beteende, vilket fungerar genom att tilldela nya aktiveringsposter överst i stacken, och länka subagenters aktiveringsposter till deras skapares post. Dessa poster frigörs endast när agenten har avslutats och de är överst i stacken. Effektiviteten av detta schema beror på strukturen och beteendet hos ett program, vilket i vissa fall kommer att resultera i dålig minnesanvändning. Ett mer effektivt schema implementerades på Hansens språk SuperPascal .
externa länkar
Officiell webbplats , Brinch Hansen Archive, en uppsättning av hans papper