Jump to content

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

ПараСейл
Логотип языка программирования ParaSail
Парадигма скомпилированный , параллельный , императивный , структурированный , объектно-ориентированный
Разработано С. Такер Тафт
Разработчик АдаКор
Впервые появился 2009 год ; 15 лет назад ( 2009 )
Стабильная версия
9.3 / 6 июня 2021 г .; 3 года назад ( 06.06.2021 )
Дисциплина набора текста сильный , статичный
Платформа х86
ТЫ Linux , MacOS , Windows
Лицензия Лицензия GPL v3
Расширения имен файлов .psi, .psl
Веб-сайт парасейлинг-ланг .org
Основные реализации
псли, пслц
Под влиянием
Модуль , Ада , Паскаль , ML
Под влиянием
Nim [1]

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

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

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

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

Описание [ править ]

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

Совсем недавно параллельные конструкции ParaSail были адаптированы к другим синтаксисам для создания Java -подобных, Python -подобных и Ada -подобных параллельных языков , получивших названия соответственно Javallel, Parython и Sparkel (названных в честь подмножества Ada SPARK на на чем он основан). Компиляторы и интерпретаторы этих языков включены в реализацию ParaSail. [3]

Примеры [ править ]

Ниже приведена программа 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;

Ссылки [ править ]

  1. ^ Румпф, Андреас (19 октября 2017 г.). «Ним без GC» . Размышления Арака . Проверено 1 сентября 2020 г.
  2. ^ Блог ParaSail
  3. Перейти обратно: Перейти обратно: а б с Сайт ПараСейл

Общие ссылки [ править ]


Внешние ссылки [ править ]

Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: b2e151a9746ccc1ebb8523cc41ad799b__1712878740
URL1:https://arc.ask3.ru/arc/aa/b2/9b/b2e151a9746ccc1ebb8523cc41ad799b.html
Заголовок, (Title) документа по адресу, URL1:
ParaSail (programming language) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)