ParaSail (абревіатура від англ. Parallel Specification and Implementation Language) — мова паралельної специфікації та реалізації, це об'єктно-орієнтована мова паралельного програмування. Розробка і реалізація ParaSail описується в блозі й на офіційному сайті мови.
ParaSail використовує модель програмування без вказівників, де об'єкти можуть збільшуватися і зменшуватися, і семантика значень використовуються для призначень. В ній немає глобальної купи збору сміття. Управління зберіганням даних на основі регіонів використовується у мові. Типи можуть бути рекурсивними, якщо рекурсивні компоненти оголошені, як необов'язкові. В ній немає глобальних змінних та параметрів накладення спектрів, і всі підвираження виражень можуть приймати значення паралельно. Твердження, передумови, постумови, інваріанти класів і т.д., є частиною стандартного синтаксису. Будь-які можливі стани гонитви виявляються під час компіляції.
Початкова розробка ParaSail розпочалася у вересні 2009 року Такером Тафтом.
Як і інтерпретатор, який використовує віртуальну машину ParaSail, так і компілятор на основі LLVM є доступними в ParaSail. Техніка викрадення роботи використовується для планування потоків ParaSail. Останню версію мови можна завантажити з вебсайту ParaSail. Цілі Безпечна підтримка неявного і явного паралелізму. Узагальнення часу компіляції виконання тверджень, передумов, постумов і інваріантів класу. Ефективне, без вказівникове, на основі регіону управління зберіганням даних. Знайома на основі класів та інтерфейсів та об'єктно-орієнтована модель програмування.
Опис Синтаксис ParaSail подібний до Modula, але він на основі класів та інтерфейсів та об'єктно-орієнтованої моделі програмування, тому також подібний і до Java або C#.
Зовсім недавно паралельні конструкції ParaSail були адаптовані для інших синтаксисів, для створення Java-подібного, Python-подібного, і Ada-подібного коду. Компілятори та інтерпретатори Javallel, Parython і Sparke використовують реалізацію ParaSail.
Приклади Нижче наведено приклад всесвітньо відомої програми Hello world в ParaSail : func Hello_World(var IO) is IO.Println("Hello, World"); end func Hello_World;
Нижче наведено інтерфейс базового модуля карти:
interface BMap<Key_Type is Ordered<>; 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;
Ось можлива реалізація цієї карти модуля, використовуючи бінарне дерево:
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;
Ось проста тестова програма для модуля ВМАР:
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<Key_Type => 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;
Посилання
ParaSail: A Pointer-Free Path to Object-Oriented Parallel Programming.