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

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

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

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

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

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

Описание

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

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

Примеры

Ниже приводится Привет, мир программа в ParaSail:

func Привет, мир(вар IO) является    IO.Println("Привет, мир");конец func Привет, мир;

Ниже приведен интерфейс базового модуля карты:

интерфейс BMap<Key_Type является Упорядоченный<>; Element_Type является Назначаемый<>> является    op "[]"() -> BMap;  // Создаем пустую карту    func Вставлять(вар BMap; Ключ : Key_Type; Ценить : Element_Type);    func Находить(BMap; Ключ : Key_Type) -> необязательный Element_Type;    func Удалить(вар BMap; Ключ : Key_Type);    func Считать(BMap) -> Univ_Integer;конец интерфейс BMap;

Вот возможная реализация этого модуля карты с использованием двоичного дерева:

учебный класс BMap является    интерфейс Binary_Node<> является      // Простой "конкретный" модуль двоичного узла        вар Оставили : необязательный Binary_Node;        вар Правильно : необязательный Binary_Node;        const Ключ : Key_Type;        вар Ценить : необязательный Element_Type;  // null означает удалено    конец интерфейс Binary_Node;    вар Дерево : необязательный Binary_Node;    вар Считать := 0;  экспорт    op "[]"() -> BMap является  // Создаем пустую карту        возвращаться (Дерево => ноль, Считать => 0);    конец op "[]";    func Вставлять(вар BMap; Ключ : Key_Type; Ценить : Element_Type) является      // Ищем ключ, перезаписываем, если найден, вставляем новый узел, если нет        за M => BMap.Дерево петля            если M нулевой тогда                // Еще нет на карте; добавить это                M := (Ключ => Ключ, Ценить => Ценить, Оставили => ноль, Правильно => ноль);                BMap.Считать += 1;            еще               дело Ключ =? M.Ключ из                 [#меньше] =>                   Продолжить петля с M.Оставили;                 [# больше] =>                   Продолжить петля с M.Правильно;                 [#равный] =>                   // Ключ уже есть на карте;                   // увеличить счетчик, если Value было нулевым;                   если M.Ценить нулевой тогда                       BMap.Считать += 1;                   конец если;                   // в любом случае перезаписываем поле Value                   M.Ценить := Ценить;                   возвращаться;               конец дело;            конец если;        конец петля;    конец func Вставлять;    func Находить(BMap; Ключ : Key_Type) -> необязательный Element_Type является      // Поиск ключа, возврат связанного значения, если он есть, или null в противном случае        за M => BMap.Дерево пока M не ноль петля            дело Ключ =? M.Ключ из              [#меньше] =>                Продолжить петля с M.Оставили;              [# больше] =>                Продолжить петля с M.Правильно;              [#равный] =>                // Нашел; вернуть значение                возвращаться M.Ценить;            конец дело;        конец петля;        // Не найдено в BMap        возвращаться ноль;    конец func Находить;    func Удалить(вар BMap; Ключ : Key_Type) является      // Поиск ключа; удалить связанный узел, если найден        за M => BMap.Дерево пока M не ноль петля            дело Ключ =? M.Ключ из              [#меньше] =>                Продолжить петля с M.Оставили;              [# больше] =>                Продолжить петля с M.Правильно;              [#равный] =>                // Нашел; если не более одного поддерева не равно нулю, перезаписать                // Это; в противном случае установите для поля значения значение null                // (чтобы избежать более сложной перебалансировки).                если M.Оставили нулевой тогда                    // Перемещаем правое поддерево в M                    M <== M.Правильно;                Эльсиф M.Правильно нулевой тогда                    // Перемещаем левое поддерево в M                    M <== M.Оставили;                еще                    // Невозможно немедленно вернуть узел;                    // вместо этого устанавливаем поле значения в null.                    M.Ценить := ноль;                конец если;                // Уменьшаем счетчик                BMap.Считать -= 1;            конец дело;        конец петля;        // Не найдено на карте    конец func Удалить;    func Считать(BMap) -> Univ_Integer является      // Возвращаем количество элементов на карте        возвращаться BMap.Считать;    конец func Считать;конец учебный класс BMap;

Вот простая тестовая программа для модуля BMap:

импорт PSL::Основной::Случайный;импорт BMap;func Test_BMap(Num : Univ_Integer; Семя : Univ_Integer) является    // Тестирование карты на основе двоичного дерева    вар Ран : Случайный := Начинать(Семя);  // Запускаем последовательность случайных чисел    // Объявляем карту от целых чисел к строкам    вар M : BMap<Key_Type => Univ_Integer, Element_Type => Univ_String>;    M := [];  // Инициализируем карту пустой картой    за я в 1..Num*2 вперед петля  // Добавляем элементы на карту        const Ключ := Следующий(Ран) мод Num + 1;        const Вал := "Вал" | Нанизывать(я);        Println("Собираюсь вставить" | Ключ | " => " | Вал);        Вставлять(M, Ключ, Вал);    конец петля;    Println("Count =" | Считать(M));    за я в 1..Num петля // Ищем элементы на карте        const Ключ := Следующий(Ран) мод Num + 1;        Println("Находясь в поиске " | Ключ | ", найденный " | Находить(M, Ключ));    конец петля;    за я в 1..Num/3 петля  // Удаляем некоторые элементы с карты        const Ключ := Следующий(Ран) мод Num + 1;        Println(«Собирается удалить» | Ключ);        Удалить(M, Ключ);    конец петля;    Println("Count =" | Считать(M));    за я в 1..Num вперед петля  // Снова ищем элементы на карте        Println("Находясь в поиске " | я | ", найденный " | Находить(M, я));    конец петля;конец func Test_BMap;

Рекомендации

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

Общие ссылки


внешняя ссылка