ParaSail (programming language)#Examples

{{for|the recreational kiting activity|Parasailing}}

{{Multiple issues|

{{primary sources|date=October 2017}}

{{cleanup |reason=summarise the language concisely, do not abuse wikipedia for advertising, example(s) too long |date=December 2021}}

}}

{{Use dmy dates|date=December 2021}}

{{Infobox programming language

| name = ParaSail

| logo = Logo_for_ParaSail_Programming_Language.jpg

| logo caption = Logo for ParaSail Programming Language

| paradigm = compiled, concurrent, imperative, structured, object-oriented

| designer = S. Tucker Taft

| developer = AdaCore

| released = {{Start date and age|2009}}

| latest release version = 9.3

| latest release date = {{Start date and age|2021|06|06|df=yes}}

| latest preview version =

| latest preview date =

| typing = strong, static

| scope =

| programming language =

| platform = x86

| operating system = Linux, macOS, Windows

| license = GPL v3

| file ext = .psi, .psl

| file format =

| website = {{URL|parasail-lang.org}}

| implementations = psli, pslc

| dialects =

| influenced by = Modula, Ada, Pascal, ML

| influenced = Nim{{cite web|url= https://nim-lang.org/araq/destructors.html|title=Nim without GC|first=Andreas|last=Rumpf|website=Araq's Musings|date=2017-10-19|access-date=2020-09-01}}

}}

Parallel Specification and Implementation Language (ParaSail) is an object-oriented parallel programming language. Its design and ongoing implementation is described in a blog[http://parasail-programming-language.blogspot.com ParaSail blog] and on its official website.[http://parasail-lang.org ParaSail website]

ParaSail uses a pointer-free programming model, where objects can grow and shrink, and value semantics are used for assignment. It has no global garbage collected heap. Instead, region-based memory management is used throughout. Types can be recursive, so long as the recursive components are declared optional. There are no global variables, no parameter aliasing, and all subexpressions of an expression can be evaluated in parallel. Assertions, preconditions, postconditions, class invariants, etc., are part of the standard syntax, using a Hoare-like notation. Any possible race conditions are detected at compile time.

Initial design of ParaSail began in September 2009, by S. Tucker Taft.

Both an interpreter using the ParaSail virtual machine, and an LLVM-based ParaSail compiler are available. Work stealing is used for scheduling ParaSail's light-weight threads. The latest version can be downloaded from the ParaSail website.

Description

{{Expand section|date=February 2018}}

The syntax of ParaSail is similar to Modula, but with a class-and-interface-based object-oriented programming model more similar to Java or C#.

More recently, the parallel constructs of ParaSail have been adapted to other syntaxes, to produce Java-like, Python-like, and Ada-like parallel languages, dubbed, respectively, Javallel, Parython, and Sparkel (named after the Ada subset SPARK on which it is based). Compilers and interpreters for these languages are included with the ParaSail implementation.

Examples

The following is a Hello world program in ParaSail:

func Hello_World(var IO) is

IO.Println("Hello, World");

end func Hello_World;

The following is an interface to a basic map module:

interface BMap; Element_Type is Assignable<>> is

op "[]"() -> BMap; // Create an empty map

func Insert(var BMap; Key : Key_Type; Value : Element_Type);

func Find(BMap; Key : Key_Type) -> optional Element_Type;

func Delete(var BMap; Key : Key_Type);

func Count(BMap) -> Univ_Integer;

end interface BMap;

Here is a possible implementation of this map module,

using a binary tree:

class BMap is

interface Binary_Node<> is

// A simple "concrete" binary node module

var Left : optional Binary_Node;

var Right : optional Binary_Node;

const Key : Key_Type;

var Value : optional Element_Type; // null means deleted

end interface Binary_Node;

var Tree : optional Binary_Node;

var Count := 0;

exports

op "[]"() -> BMap is // Create an empty map

return (Tree => null, Count => 0);

end op "[]";

func Insert(var BMap; Key : Key_Type; Value : Element_Type) is

// Search for Key, overwrite if found, insert new node if not

for M => BMap.Tree loop

if M is null then

// Not already in the map; add it

M := (Key => Key, Value => Value, Left => null, Right => null);

BMap.Count += 1;

else

case Key =? M.Key of

[#less] =>

continue loop with M.Left;

[#greater] =>

continue loop with M.Right;

[#equal] =>

// Key is already in the map;

// bump count if Value was null;

if M.Value is null then

BMap.Count += 1;

end if;

// in any case overwrite the Value field

M.Value := Value;

return;

end case;

end if;

end loop;

end func Insert;

func Find(BMap; Key : Key_Type) -> optional Element_Type is

// Search for Key, return associated Value if present, or null otherwise

for M => BMap.Tree while M not null loop

case Key =? M.Key of

[#less] =>

continue loop with M.Left;

[#greater] =>

continue loop with M.Right;

[#equal] =>

// Found it; return the value

return M.Value;

end case;

end loop;

// Not found in BMap

return null;

end func Find;

func Delete(var BMap; Key : Key_Type) is

// Search for Key; delete associated node if found

for M => BMap.Tree while M not null loop

case Key =? M.Key of

[#less] =>

continue loop with M.Left;

[#greater] =>

continue loop with M.Right;

[#equal] =>

// Found it; if at most one subtree is non-null, overwrite

// it; otherwise, set its value field to null

// (to avoid a more complex re-balancing).

if M.Left is null then

// Move right subtree into M

M <== M.Right;

elsif M.Right is null then

// Move left subtree into M

M <== M.Left;

else

// Cannot immediately reclaim node;

// set value field to null instead.

M.Value := null;

end if;

// Decrement count

BMap.Count -= 1;

end case;

end loop;

// Not found in the map

end func Delete;

func Count(BMap) -> Univ_Integer is

// Return count of number of items in map

return BMap.Count;

end func Count;

end class BMap;

Here is a simple test program for the BMap module:

import PSL::Core::Random;

import BMap;

func Test_BMap(Num : Univ_Integer; Seed : Univ_Integer) is

// Test the Binary-Tree-based Map

var Ran : Random := Start(Seed); // Start a random-number sequence

// Declare a map from integers to strings

var M : BMap Univ_Integer, Element_Type => Univ_String>;

M := []; // Initialize the map to the empty map

for I in 1..Num*2 forward loop // Add elements to the map

const Key := Next(Ran) mod Num + 1;

const Val := "Val" | To_String(I);

Println("About to insert " | Key | " => " | Val);

Insert(M, Key, Val);

end loop;

Println("Count = " | Count(M));

for I in 1..Num loop // Search for elements in the map

const Key := Next(Ran) mod Num + 1;

Println("Looking for " | Key | ", found " | Find(M, Key));

end loop;

for I in 1..Num/3 loop // Delete some elements from the map

const Key := Next(Ran) mod Num + 1;

Println("About to delete " | Key);

Delete(M, Key);

end loop;

Println("Count = " | Count(M));

for I in 1..Num forward loop // Search again for elements in the map

Println("Looking for " | I | ", found " | Find(M, I));

end loop;

end func Test_BMap;

References

{{Reflist}}

=General references=

  • {{cite news |url=http://www.technologyreview.com/news/424836/new-language-for-programming-in-parallel/ |title=New Language for Programming in Parallel |last=Graham-Rowe |first=Duncan |date=28 July 2011 |work=Technology Review |publisher=MIT |access-date=18 August 2012 |archive-date=26 October 2015 |archive-url=https://web.archive.org/web/20151026064123/http://www.technologyreview.com/news/424836/new-language-for-programming-in-parallel/ |url-status=dead }}
  • {{cite news |url=http://www.eetimes.com/electronics-news/4218331/SofCheck-ParaSail-parallel-language |title=SofCheck preps ParaSail parallel language |last=Clarke |first=Peter |date=28 July 2011 |work=EETimes|publisher=UBM Electronics}}
  • {{cite news |url=http://www.eetimes.com/design/embedded/4375616/ParaSail--Less-is-more-with-multicore |title=ParaSail: Less is more with multicore |last=Taft |first=S. Tucker |date=9 June 2012 |work=EETimes|publisher=UBM Electronics}}
  • {{cite news |url=http://www.eejournal.com/archives/articles/20120718-language/ |title=Does the World Need a New Programming Language? |last=Selwood |first=Dick |date=18 July 2012 |work=EEJournal|publisher=techfocus media, inc.}}