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

редактировать
Для развлекательного кайтинга см. Парасейлинг.
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.

Содержание
  • 1 Описание
  • 2 Примеры
  • 3 ссылки
    • 3.1 Общие ссылки
  • 4 Внешние ссылки
Описание

Синтаксис из похож заниматься парасейлингом с Модулой, но с объектно-ориентированной моделью программирования класса и интерфейсом на основе более похож на 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 BMaplt;Key_Type is Orderedlt;gt;; Element_Type is Assignablelt;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;

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

class BMap is interface Binary_Nodelt;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;

Вот простая тестовая программа для модуля 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: BMaplt;Key_Type =gt; Univ_Integer, Element_Type =gt; Univ_Stringgt;; 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;
Ссылки

Общие ссылки

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

Последняя правка сделана 2023-04-21 06:35:08
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте