ParaSail (язык программирования) - ParaSail (programming language)

ParaSail
Логотип для языка программирования ParaSail.jpg
Логотип разработан Абузаром Аббаси
Парадигма скомпилированный , параллельный , императивный , структурированный , объектно-ориентированный
Разработано С. Такер Тафт
Разработчик AdaCore
Впервые появился 2009 ; 11 лет назад ( 2009 )
Стабильный выпуск
8.4 / 2 ноября 2019 ; 10 месяцев назад ( 2019-11-02 )
Печатная дисциплина сильный , статичный
Платформа x86
Операционные системы Linux , macOS , Windows
Лицензия GPL v3
Расширения имени файла .psi, .psl
Интернет сайт parasail-lang .org
Основные реализации
psli, pslc
Под влиянием
Модула , Ада , Паскаль , ML
Под влиянием
Ним

Язык параллельной спецификации и реализации ( ParaSail ) - это объектно-ориентированный язык параллельного программирования . Его дизайн и текущая реализация описаны в блоге и на официальном сайте.

ParaSail использует модель программирования без указателей , в которой объекты могут увеличиваться и уменьшаться, а семантика значений используется для присвоения. У него нет глобальной кучи сбора мусора . Вместо этого повсюду используется региональное управление памятью . Типы могут быть рекурсивными, если рекурсивные компоненты объявлены необязательными . Здесь нет глобальных переменных, нет псевдонимов параметров, и все подвыражения выражения могут оцениваться параллельно. Утверждения , предусловия , постусловия , инварианты классов и т. Д. Являются частью стандартного синтаксиса, использующего нотацию типа Хоара . Любые возможные состояния гонки обнаруживаются во время компиляции .

Первоначальный дизайн ParaSail был начат в сентябре 2009 года С. Такером Тафтом.

Оба переводчика с использованием летать на парашюте за катером виртуальную машину , и LLVM -На летать на парашюте за катером компилятор доступны. Кража работы используется для планирования легких потоков ParaSail . Последнюю версию можно скачать с сайта ParaSail.

Описание

Синтаксис из похож заниматься парасейлингом с Модулой , но с объектно-ориентированной моделью программирования класса и интерфейсом на основе более похож на Java или C # .

Совсем недавно, параллельные конструкты были летать на парашюте за катером адаптированы к другим синтаксисах, чтобы произвести Java -like, Python -like и Ada -как параллельных языков , дублированный, соответственно, Javallel, Parython и Sparkel (названный в честь подмножества 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;

Вот простая тестовая программа для модуля 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;

Ссылки

Общие ссылки


внешние ссылки