Логотип разработан Абузаром Аббаси | |
Парадигма | скомпилированный, параллельный, императивный, структурированный, объектно-ориентированный |
---|---|
Разработано | С. Такер Тафт |
Разработчик | 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 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;