ParaSail (programmeringsspråk)
Paradigm | sammanställd , samtidig , imperativ , strukturerad , objektorienterad |
---|---|
Designad av | S. Tucker Taft |
Utvecklare | AdaCore |
Dök först upp | 2009 |
Stabil frisättning | 9.3 / 6 juni 2021
|
Maskinskrivningsdisciplin | stark , statisk |
Plattform | x86 |
OS | Linux , macOS , Windows |
Licens | GPL v3 |
Filnamnstillägg | .psi, .psl |
Hemsida | |
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 på "[]" ; 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 då // 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 då // Flytta höger underträd till M M <== M . Rätt ; elsif M . Höger är null då // 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
- Graham-Rowe, Duncan (28 juli 2011). "Nytt språk för parallellprogrammering" . Teknikgranskning . MIT.
- Clarke, Peter (28 juli 2011). "SofCheck förbereder ParaSail parallellspråk" . EETimes . UBM Electronics.
- Taft, S. Tucker (9 juni 2012). "ParaSail: Less is more with multicore" . EETimes . UBM Electronics.
- Selwood, Dick (18 juli 2012). "Behöver världen ett nytt programmeringsspråk?" . EEJournal . techfocus media, inc.