HOME

TheInfoList



OR:

Parallel Specification and Implementation Language (ParaSail) is an object-oriented parallel programming language. Its design and ongoing implementation is described in a blogParaSail blog
/ref> and on its official website.ParaSail website
/ref> 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,
precondition In computer programming, a precondition is a condition or predicate that must always be true just prior to the execution of some section of code or before an operation in a formal specification. If a precondition is violated, the effect of the ...
s,
postcondition In computer programming, a postcondition is a condition or predicate that must always be true just after the execution of some section of code or after an operation in a formal specification. Postconditions are sometimes tested using assertions w ...
s,
class invariant In computer programming, specifically object-oriented programming, a class invariant (or type invariant) is an invariant used for constraining objects of a class. Methods of the class should preserve the invariant. The class invariant constra ...
s, etc., are part of the standard
syntax In linguistics, syntax ( ) is the study of how words and morphemes combine to form larger units such as phrases and sentences. Central concerns of syntax include word order, grammatical relations, hierarchical sentence structure (constituenc ...
, using a Hoare-like notation. Any possible
race condition A race condition or race hazard is the condition of an electronics, software, or other system where the system's substantive behavior is dependent on the sequence or timing of other uncontrollable events, leading to unexpected or inconsistent ...
s are detected at
compile time In computer science, compile time (or compile-time) describes the time window during which a language's statements are converted into binary instructions for the processor to execute. The term is used as an adjective to describe concepts relat ...
. Initial design of ParaSail began in September 2009, by S. Tucker Taft. Both an interpreter using the ParaSail
virtual machine In computing, a virtual machine (VM) is the virtualization or emulator, emulation of a computer system. Virtual machines are based on computer architectures and provide the functionality of a physical computer. Their implementations may involve ...
, and an
LLVM LLVM, also called LLVM Core, is a target-independent optimizer and code generator. It can be used to develop a Compiler#Front end, frontend for any programming language and a Compiler#Back end, backend for any instruction set architecture. LLVM i ...
-based ParaSail
compiler In computing, a compiler is a computer program that Translator (computing), translates computer code written in one programming language (the ''source'' language) into another language (the ''target'' language). The name "compiler" is primaril ...
are available. Work stealing is used for scheduling ParaSail's light-weight threads. The latest version can be downloaded from the ParaSail website.


Description

The
syntax In linguistics, syntax ( ) is the study of how words and morphemes combine to form larger units such as phrases and sentences. Central concerns of syntax include word order, grammatical relations, hierarchical sentence structure (constituenc ...
of ParaSail is similar to
Modula The Modula programming language is a descendant of the Pascal language. It was developed in Switzerland, at ETH Zurich, in the mid-1970s by Niklaus Wirth, the same person who designed Pascal. The main innovation of Modula over Pascal is a mo ...
, but with a class-and-interface-based object-oriented programming model more similar to
Java Java is one of the Greater Sunda Islands in Indonesia. It is bordered by the Indian Ocean to the south and the Java Sea (a part of Pacific Ocean) to the north. With a population of 156.9 million people (including Madura) in mid 2024, proje ...
or C#. More recently, the parallel constructs of ParaSail have been adapted to other syntaxes, to produce
Java Java is one of the Greater Sunda Islands in Indonesia. It is bordered by the Indian Ocean to the south and the Java Sea (a part of Pacific Ocean) to the north. With a population of 156.9 million people (including Madura) in mid 2024, proje ...
-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


General references

* * * *


External links

*
Blog of design and implementation process

ParaSail language newsgroup
{{DEFAULTSORT:ParaSail (Programming Language) Pascal programming language family Concurrent programming languages Procedural programming languages Systems programming languages Cross-platform software Programming languages created in 2009 2009 software Free software projects