ParaSail
ParaSail (абревіатура від англ. Parallel Specification and Implementation Language) — мова паралельної специфікації та реалізації, це об'єктно-орієнтована мова паралельного програмування. Розробка і реалізація ParaSail описується в блозі й на офіційному сайті [Архівовано 16 листопада 2021 у Wayback Machine.] мови.
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;
Посилання
- Graham-Rowe, Duncan (28 липня 2011). New Language for Programming in Parallel. Technology Review. MIT. Архів оригіналу за 26 жовтня 2015. Процитовано 7 червня 2016.
- Clarke, Peter (28 липня 2011). SofCheck preps ParaSail parallel language. EETimes. UBM Electronics.
- Taft, S. Tucker (9 червня 2012). ParaSail: Less is more with multicore. EETimes. UBM Electronics. Архів оригіналу за 7 липня 2012. Процитовано 7 червня 2016.
- Selwood, Dick (18 липня 2012). Does the World Need a New Programming Language?. EEJournal. techfocus media, inc. Архів оригіналу за 20 квітня 2016. Процитовано 7 червня 2016.
- ParaSail: A Pointer-Free Path to Object-Oriented Parallel Programming.
На цю статтю не посилаються інші статті Вікіпедії. Будь ласка розставте посилання відповідно до прийнятих рекомендацій. |