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.
🔥 Top keywords: Головна сторінкаЧемпіонат Європи з футболу 2024Спеціальна:ПошукВікіпедія:Культурна спадщина та видатні постаті (2024)Збірна України з футболуБріджертониЧемпіонат Європи з футболу 2020YouTubeУкраїнаЧемпіонат Європи з футболуЗбірна Румунії з футболуРебров Сергій СтаніславовичГлобальний саміт мируРадіо «Свобода»ДефолтРумуніяЛунін Андрій ОлексійовичНаціональна суспільна телерадіокомпанія УкраїниДень батькаДовбик Артем ОлександровичШевченко Андрій МиколайовичЯрмоленко Андрій МиколайовичЧемпіонат Європи з футболу 2024 (кваліфікаційний раунд)Мудрик Михайло Петрович138-ма зенітна ракетна бригада (Україна)FacebookЄрмак Андрій БорисовичСексВійськові звання України22-га окрема механізована бригада (Україна)Зінченко Олександр ВолодимировичТериторіальний центр комплектування та соціальної підтримкиДумками навиворіт 2Чемпіонат Європи з футболу 2016Список операторів систем розподілу України2024 у телебаченніMegogoСписок українських жіночих іменКиїв