Parallel Specification and Implementation Language (ParaSail) is an
object-oriented
Object-oriented programming (OOP) is a programming paradigm based on the concept of "objects", which can contain data and code. The data is in the form of fields (often known as attributes or ''properties''), and the code is in the form of pro ...
parallel programming language. Its design and ongoing implementation is described in a blog
ParaSail blog
/ref> and on its official website.[ParaSail website](_blank)
/ref>
ParaSail uses a pointer-free programming model, where objects
Object may refer to:
General meanings
* Object (philosophy), a thing, being, or concept
** Object (abstract), an object which does not exist at any particular time or place
** Physical object, an identifiable collection of matter
* Goal, an ...
can grow and shrink, and value semantics are used for assignment. It has no global garbage collected
Garbage, trash, rubbish, or refuse is waste material that is discarded by humans, usually due to a perceived lack of utility. The term generally does not encompass bodily waste products, purely liquid or gaseous wastes, or toxic waste produ ...
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
Hoare is an English surname derived from Middle English '' hor(e)'' meaning grey- or white-haired. Notable people with the surname include:
* Albert Alfred Hoare, known as Bert Hoare (1874–1962), South Australian politician
* Des Hoare (born 19 ...
-like notation. Any possible race conditions are detected at compile time
In computer science, compile time (or compile-time) describes the time window during which a computer program is compiled.
The term is used as an adjective to describe concepts related to the context of program compilation, as opposed to concept ...
.
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/emulation of a computer system. Virtual machines are based on computer architectures and provide functionality of a physical computer. Their implementations may involve specialized hardw ...
, and an LLVM
LLVM is a set of compiler and toolchain technologies that can be used to develop a front end for any programming language and a back end for any instruction set architecture. LLVM is designed around a language-independent intermediate represen ...
-based ParaSail compiler
In computing, a compiler is a computer program that translates computer code written in one programming language (the ''source'' language) into another language (the ''target'' language). The name "compiler" is primarily used for programs that ...
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 ( constituency) ...
of ParaSail is similar to Modula, but with a class-and-interface-based object-oriented programming model more similar to Java
Java (; id, Jawa, ; jv, ꦗꦮ; su, ) is one of the Greater Sunda Islands in Indonesia. It is bordered by the Indian Ocean to the south and the Java Sea to the north. With a population of 151.6 million people, Java is the world's List ...
or C#.
More recently, the parallel constructs of ParaSail have been adapted to other syntaxes, to produce Java
Java (; id, Jawa, ; jv, ꦗꦮ; su, ) is one of the Greater Sunda Islands in Indonesia. It is bordered by the Indian Ocean to the south and the Java Sea to the north. With a population of 151.6 million people, Java is the world's List ...
-like, Python
Python may refer to:
Snakes
* Pythonidae, a family of nonvenomous snakes found in Africa, Asia, and Australia
** ''Python'' (genus), a genus of Pythonidae found in Africa and Asia
* Python (mythology), a mythical serpent
Computing
* Python (pro ...
-like, and Ada
Ada may refer to:
Places
Africa
* Ada Foah, a town in Ghana
* Ada (Ghana parliament constituency)
* Ada, Osun, a town in Nigeria
Asia
* Ada, Urmia, a village in West Azerbaijan Province, Iran
* Ada, Karaman, a village in Karaman Province, Tur ...
-like parallel languages
Parallel is a geometric term of location which may refer to:
Computing
* Parallel algorithm
* Parallel computing
* Parallel metaheuristic
* Parallel (software), a UNIX utility for running programs in parallel
* Parallel Sysplex, a cluster of IBM ...
, 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
Less or LESS may refer to: fewer than,: not as much.
Computing
* less (Unix), a Unix utility program
* Less (stylesheet language), a dynamic stylesheet language
* Large-Scale Scrum (LeSS), a product development framework that extends Scrum
Other ...
=>
continue loop with M.Left;
greater=>
continue loop with M.Right;
equal
Equal(s) may refer to:
Mathematics
* Equality (mathematics).
* Equals sign (=), a mathematical symbol used to indicate equality.
Arts and entertainment
* ''Equals'' (film), a 2015 American science fiction film
* ''Equals'' (game), a board game
...
=>
// 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
Less or LESS may refer to: fewer than,: not as much.
Computing
* less (Unix), a Unix utility program
* Less (stylesheet language), a dynamic stylesheet language
* Large-Scale Scrum (LeSS), a product development framework that extends Scrum
Other ...
=>
continue loop with M.Left;
greater=>
continue loop with M.Right;
equal
Equal(s) may refer to:
Mathematics
* Equality (mathematics).
* Equals sign (=), a mathematical symbol used to indicate equality.
Arts and entertainment
* ''Equals'' (film), a 2015 American science fiction film
* ''Equals'' (game), a board game
...
=>
// 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
Less or LESS may refer to: fewer than,: not as much.
Computing
* less (Unix), a Unix utility program
* Less (stylesheet language), a dynamic stylesheet language
* Large-Scale Scrum (LeSS), a product development framework that extends Scrum
Other ...
=>
continue loop with M.Left;
greater=>
continue loop with M.Right;
equal
Equal(s) may refer to:
Mathematics
* Equality (mathematics).
* Equals sign (=), a mathematical symbol used to indicate equality.
Arts and entertainment
* ''Equals'' (film), a 2015 American science fiction film
* ''Equals'' (game), a board game
...
=>
// 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