Joyce (programmeringsspråk)

Joyce
Paradigm samtidig , imperativ , strukturerad
Familj Wirth Pascal
Designad av Per Brinch Hansen
Dök först upp 1987 ; 36 år sedan ( 1987 )
Stabil frisättning
1/1987 ; 36 år sedan ( 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  <>  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