ParaSail (programmeringsspråk)

ParaSail
Logo for ParaSail Programming Language.jpg
Logotyp för ParaSail programmeringsspråk
Paradigm sammanställd , samtidig , imperativ , strukturerad , objektorienterad
Designad av S. Tucker Taft
Utvecklare AdaCore
Dök först upp 2009 ; 14 år sedan ( 2009 )
Stabil frisättning
9.3 / 6 juni 2021 ; 21 månader sedan ( 2021-06-06 )
Maskinskrivningsdisciplin stark , statisk
Plattform x86
OS Linux , macOS , Windows
Licens GPL v3
Filnamnstillägg .psi, .psl
Hemsida parasail-lang .org
Stora implementeringar
psli, pslc
Influerad av
Modula , Ada , Pascal , ML
Influenced
Nim

Parallel Specification and Implementation Language ( ParaSail ) är ett objektorienterat parallellt programmeringsspråk . Dess design och pågående implementering beskrivs i en blogg och på dess officiella hemsida.

ParaSail använder en pekarfri programmeringsmodell, där objekt kan växa och krympa, och värdesemantik används för tilldelning. Den har ingen global sophög som samlas in . Istället används regionbaserad minneshantering genomgående. Typer kan vara rekursiva, så länge som de rekursiva komponenterna deklareras som valfria . Det finns inga globala variabler, ingen parameteralias och alla underuttryck av ett uttryck kan utvärderas parallellt. Påståenden , förutsättningar , postvillkor , klassinvarianter , etc., är en del av standardsyntaxen, med en Hoare -liknande notation. Eventuella tävlingsförhållanden upptäcks vid kompileringstiden .

Initial design av ParaSail började i september 2009, av S. Tucker Taft.

Både en tolk som använder den virtuella ParaSail-maskinen och en LLVM -baserad ParaSail- kompilator är tillgängliga. Arbetsstöld används för att schemalägga ParaSails lätta trådar . Den senaste versionen kan laddas ner från ParaSails webbplats.

Beskrivning

Syntaxen för ParaSail liknar Modula , men med en klass- och gränssnittsbaserad objektorienterad programmeringsmodell mer lik Java eller C# .

På senare tid har de parallella konstruktionerna av ParaSail anpassats till andra syntaxer för att producera Java -liknande, Python -liknande och Ada -liknande parallella språk , dubbade respektive Javallel, Parython och Sparkel (uppkallad efter Ada-delmängden SPARK på som den är baserad). Kompilatorer och tolkar för dessa språk ingår i ParaSail-implementeringen.

Exempel

Följande är ett Hello world-program i ParaSail:

   
    
   func  Hello_World  (  var  IO  )  är  IO  .  Println  (  "Hej världen" )  ;  end  func  Hello_World  ; 

Följande är ett gränssnitt till en grundläggande kartmodul:

       
         

            
           
         
       
  gränssnitt  BMap  <  Key_Type  är  beställd  <>;  Element_Type  är  tilldelningsbar  <  >>  är  op  "[]"  ()  -  >  BMap  ;  // Skapa en tom karta  func  Insert  (  var  BMap  ;  Key  :  Key_Type  ;  Value  :  Element_Type  );  func  Sök  (  BMap  ;  Key  :  Key_Type  )  -  >  valfritt  Element_Type  ;  func  Delete  (  var  BMap  ;  Key  :  Key_Type  );  func  Count  (  BMap  )  -  >  Univ_Integer  ;  slutgränssnitt  BMap  ;  _  

Här är en möjlig implementering av denna kartmodul, med hjälp av ett binärt träd:

  

      
      
            
            
           
              
      

        
       0

  

          
              0
      

             
      
            
               
                
                             
                  
            
                   
                  
                      
                  
                      
                  
                   
                   
                      
                         
                    
                   
                     
                   
                
             
         
      

            
      
               
                
               
                   
               
                   
               
                
                 
             
         
        
         
      

          
      
               
                
               
                   
               
                   
               
                
                
                
                   
                    
                      
                   
                    
                      
                
                    
                    
                      
                 
                
                  
             
         
        
      

        
      
         
      

  klass  BMap  är  gränssnittet  Binary_Node  <>  är  // En enkel "konkret" binär nodmodul  var  Left  :  optional  Binary_Node  ;  var  Right  :  optional  Binary_Node  ;  const  Nyckel  :  Key_Type  ;  var  Value  :  optional  Element_Type  ;  //  null betyder borttaget  slutgränssnitt  Binary_Node  ;  var  Tree  :  optional  Binary_Node  ;  var  Count  :=  ;  exports  op  "[]"  ()  -  >  BMap  är //   Skapa  en tom kartretur  (  Träd  =>  null  ,  Count  =>  );  slut  "[]"  ;  func  Insert  (  var  BMap  ;  Key  :  Key_Type  ;  Value  :  Element_Type  )  är  // Sök efter nyckel, skriv över om den hittas, infoga ny nod om inte  för  M  =>  BMap  .  Trädslinga  om  M  är null  // Inte redan i kartan  ;  lägg till det  M  :=  (  Nyckel  =>  Nyckel  ,  Värde  =>  Värde  ,  Vänster  =>  null  ,  Höger  =>  null  );  Bmap  .  Räkna  +=  1  ;  annat  fall  Nyckel  =?  M  .  Tangent  för  [  #less  ]  =>  fortsätt  loop  med  M  .  Vänster  ;  [  #greater  ]  =>  fortsätt  slinga  med  M  .  Rätt  ;  [  #equal  ]  =>  // Nyckeln finns redan på kartan;  // bump count om värdet var null;  om  M.  _  Värdet  är null  sedan  BMap  .  Räkna  +=  1  ;  sluta  om  ;  // skriv i alla fall över värdefältet  M  .  Värde  :=  Värde  ;  återvända  ;  slutfall  ;  _  sluta  om  ;  ändslinga  ;  _  slut  func  Infoga  ;  func  Sök  (  BMap  ;  Nyckel  :  Key_Type  )  -  >  valfri  Element_Type  är  // Sök efter nyckel, returnera tillhörande värde om det finns, eller null annars  för  M  =>  BMap  .  Träd  medan  M  inte noll  loop  case  Key  =?  M  .  Tangent  för  [  #less  ]  =>  fortsätt  loop  med  M  .  Vänster  ;  [  #greater  ]  =>  fortsätt  slinga  med  M  .  Rätt  ;  [  #equal  ]  =>  // Hittade det; returnera värdet   returnera  M  .  Värde  ;  slutfall  ;  _  ändslinga  ;  _  // Hittas inte i BMap  returnerar  null  ;  slut  func  Sök  ;  func  Delete  (  var  BMap  ;  Key  :  Key_Type  )  är  // Sök efter nyckel; ta bort associerad nod om den hittas   för  M  =>  BMap  .  Träd  medan  M  inte noll  loop  case  Key  =?  M  .  Tangent  för  [  #less  ]  =>  fortsätt  loop  med  M  .  Vänster  ;  [  #greater  ]  =>  fortsätt  slinga  med  M  .  Rätt  ;  [  #equal  ]  =>  // Hittade det; om högst ett underträd är icke-null, skriv över   // det; annars sätter du dess värdefält till null   // (för att undvika en mer komplex ombalansering).  om  M.  _  Vänster  är null  // Flytta höger underträd till M  M  <==  M  .  Rätt  ;  elsif  M  .  Höger  är null  // Flytta vänster underträd till M  M  <==  M  .  Vänster  ;  else  // Kan inte omedelbart återta noden;  // ställ in värdefältet till null istället.  M  .  Värde  :=  null  ;  sluta  om  ;  // Minska antalet  BMap  .  Räkna  -=  1  ;  slutfall  ;  _  ändslinga  ;  _  // Hittade inte i kartan  end  func  Ta bort  ;  func  Count  (  BMap  )  -  >  Univ_Integer  är //   Return  count av antal poster i kartretur  BMap  .  Räkna  ;  slut  func  Räkna  ;  slutklass  BMap  ;  _  

Här är ett enkelt testprogram för BMap-modulen:

 
 
       
    
           

    
            

        

           
               
             
              
          
     
      

         
               
               
     

          
               
          
         
     
      

           
               
     

   importera  PSL  ::  Core  ::  Random  ;  importera  BMap  ;  func  Test_BMap  (  Num  :  Univ_Integer  ;  Seed  :  Univ_Integer  )  är  // Testa den binära trädbaserade kartan  var  Ran  :  Random  :=  Start  (  Seed  );  // Starta en slumptalssekvens  // Deklarera en karta från heltal till strängar  var  M  :  BMap  <  Key_Type  =>  Univ_Integer  ,  Element_Type  =>  Univ_String  >;  M  :=  [];  // Initiera kartan till den tomma kartan  för  I  in  1  ..  Num  *  2  forward  loop  // Lägg till element till kartan  const  Key  :=  Next  (  Ran  )  mod  Num  +  1  ;  const  Val  :=  "Val"  |  To_String  (  I  );  Println  (  "About to insert "  |  Key  |  " => "  |  Val  );  Infoga  (  M  ,  Key  ,  Val  );  ändslinga  ;  _  Println  (  "Räkna = "  |  Räkna  (  M  ));  för  I  in  1  ..  Num  loop  // Sök efter element i kartan  const  Key  :=  Next  (  Ran  )  mod  Num  +  1  ;  Println  (  "Letar efter "  |  Nyckel  |  ", hittade "  |  Hitta  (  M  ,  Nyckel  ));  ändslinga  ;  _  för  I  in  1  ..  Num  /  3  loop  // Ta bort några element från kartan  const  Key  :=  Next  (  Ran  )  mod  Num  +  1  ;  Println  (  "About to radering"  |  Key  );  Ta bort  (  M  ,  Key  );  ändslinga  ;  _  Println  (  "Räkna = "  |  Räkna  (  M  ));  for  I  in  1  ..  Num  forward  loop  // Sök igen efter element i kartan  Println  (  "Looking for "  |  I  |  ", found "  |  Find  (  M  ,  I  ));  ändslinga  ;  _  end  func  Test_BMap  ; 

Allmänna referenser


externa länkar