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-подібного коду. Компілятори та інтерпретатори , і використовують реалізацію 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). . Technology Review. MIT. Архів оригіналу за 26 жовтня 2015. Процитовано 7 червня 2016.
- Clarke, Peter (28 липня 2011). SofCheck preps ParaSail parallel language. EETimes. UBM Electronics.
- Taft, S. Tucker (9 червня 2012). . EETimes. UBM Electronics. Архів оригіналу за 7 липня 2012. Процитовано 7 червня 2016.
- Selwood, Dick (18 липня 2012). . EEJournal. techfocus media, inc. Архів оригіналу за 20 квітня 2016. Процитовано 7 червня 2016.
- ParaSail: A Pointer-Free Path to Object-Oriented Parallel Programming.
На цю статтю не посилаються інші статті Вікіпедії. Будь ласка розставте посилання відповідно до . |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
ParaSail abreviatura vid angl Parallel Specification and Implementation Language mova paralelnoyi specifikaciyi ta realizaciyi ce ob yektno oriyentovana mova paralelnogo programuvannya Rozrobka i realizaciya ParaSail opisuyetsya v blozi j na oficijnomu sajti 16 listopada 2021 u Wayback Machine movi ParaSail vikoristovuye model programuvannya bez vkazivnikiv de ob yekti mozhut zbilshuvatisya i zmenshuvatisya i semantika znachen vikoristovuyutsya dlya priznachen V nij nemaye globalnoyi kupi zboru smittya Upravlinnya zberigannyam danih na osnovi regioniv vikoristovuyetsya u movi Tipi mozhut buti rekursivnimi yaksho rekursivni komponenti ogolosheni yak neobov yazkovi V nij nemaye globalnih zminnih ta parametriv nakladennya spektriv i vsi pidvirazhennya virazhen mozhut prijmati znachennya paralelno Tverdzhennya peredumovi postumovi invarianti klasiv i t d ye chastinoyu standartnogo sintaksisu Bud yaki mozhlivi stani gonitvi viyavlyayutsya pid chas kompilyaciyi Pochatkova rozrobka ParaSail rozpochalasya u veresni 2009 roku Takerom Taftom Yak i interpretator yakij vikoristovuye virtualnu mashinu ParaSail tak i kompilyator na osnovi LLVM ye dostupnimi v ParaSail Tehnika vikradennya roboti vikoristovuyetsya dlya planuvannya potokiv ParaSail Ostannyu versiyu movi mozhna zavantazhiti z vebsajtu ParaSail CiliBezpechna pidtrimka neyavnogo i yavnogo paralelizmu Uzagalnennya chasu kompilyaciyi vikonannya tverdzhen peredumov postumov i invariantiv klasu Efektivne bez vkazivnikove na osnovi regionu upravlinnya zberigannyam danih Znajoma na osnovi klasiv ta interfejsiv ta ob yektno oriyentovana model programuvannya OpisSintaksis ParaSail podibnij do Modula ale vin na osnovi klasiv ta interfejsiv ta ob yektno oriyentovanoyi modeli programuvannya tomu takozh podibnij i do Java abo C Zovsim nedavno paralelni konstrukciyi ParaSail buli adaptovani dlya inshih sintaksisiv dlya stvorennya Java podibnogo Python podibnogo i Ada podibnogo kodu Kompilyatori ta interpretatori i vikoristovuyut realizaciyu ParaSail PrikladiNizhche navedeno priklad vsesvitno vidomoyi programi Hello world v ParaSail func Hello World var IO is IO Println Hello World end func Hello World Nizhche navedeno interfejs bazovogo modulya karti interface BMap lt Key Type is Ordered lt gt Element Type is Assignable lt gt gt is op gt BMap Create an empty map func Insert var BMap Key Key Type Value Element Type func Find BMap Key Key Type gt optional Element Type func Delete var BMap Key Key Type func Count BMap gt Univ Integer end interface BMap Os mozhliva realizaciya ciyeyi karti modulya vikoristovuyuchi binarne derevo class BMap is interface Binary Node lt gt 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 gt BMap is Create an empty map return Tree gt null Count gt 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 gt BMap Tree loop if M is null then Not already in the map add it M Key gt Key Value gt Value Left gt null Right gt null BMap Count 1 else case Key M Key of less gt continue loop with M Left greater gt continue loop with M Right equal gt 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 gt optional Element Type is Search for Key return associated Value if present or null otherwise for M gt BMap Tree while M not null loop case Key M Key of less gt continue loop with M Left greater gt continue loop with M Right equal gt 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 gt BMap Tree while M not null loop case Key M Key of less gt continue loop with M Left greater gt continue loop with M Right equal gt 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 lt M Right elsif M Right is null then Move left subtree into M M lt 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 gt Univ Integer is Return count of number of items in map return BMap Count end func Count end class BMap Os prosta testova programa dlya modulya VMAR 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 lt Key Type gt Univ Integer Element Type gt Univ String gt 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 gt 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 PosilannyaGraham Rowe Duncan 28 lipnya 2011 Technology Review MIT Arhiv originalu za 26 zhovtnya 2015 Procitovano 7 chervnya 2016 Clarke Peter 28 lipnya 2011 SofCheck preps ParaSail parallel language EETimes UBM Electronics Taft S Tucker 9 chervnya 2012 EETimes UBM Electronics Arhiv originalu za 7 lipnya 2012 Procitovano 7 chervnya 2016 Selwood Dick 18 lipnya 2012 EEJournal techfocus media inc Arhiv originalu za 20 kvitnya 2016 Procitovano 7 chervnya 2016 ParaSail A Pointer Free Path to Object Oriented Parallel Programming Na cyu stattyu ne posilayutsya inshi statti Vikipediyi Bud laska rozstavte posilannya vidpovidno do prijnyatih rekomendacij