Parallel Specification and Implementation Language ( ParaSail ) — это объектно-ориентированный параллельный язык программирования . Его дизайн и текущая реализация описаны в блоге [2] и на его официальном сайте. [3]
ParaSail использует модель программирования без указателей , в которой объекты могут увеличиваться и уменьшаться, а для назначения используется семантика значений. В нем нет глобальной кучи для сбора мусора . Вместо этого используется региональное управление памятью . Типы могут быть рекурсивными, если рекурсивные компоненты объявлены необязательными . Нет никаких глобальных переменных, нет псевдонимов параметров, и все подвыражения выражения могут быть вычислены параллельно. Утверждения , предварительные условия , постусловия , инварианты классов и т. д. являются частью стандартного синтаксиса , использующего нотацию, подобную Хоару . Любые возможные условия гонки обнаруживаются во время компиляции .
Первоначальное проектирование ParaSail началось в сентябре 2009 года С. Такером Тафтом.
Доступны как интерпретатор, использующий виртуальную машину ParaSail , так и компилятор ParaSail на основе LLVM . Для планирования легких потоков ParaSail используется захват работы . Последнюю версию можно загрузить с веб-сайта ParaSail. [3]
Синтаксис ParaSail похож на Modula , но с основанной на классах и интерфейсах объектно-ориентированной моделью программирования, больше похожей на Java или 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 ; // Создать пустую карту 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 ;
Вот возможная реализация этого модуля карты с использованием бинарного дерева:
класс BMap - это interface Binary_Node <> is // Простой «конкретный» двоичный узел module var Left : необязательный Binary_Node ; var Right : необязательный Binary_Node ; const Key : Key_Type ; var Value : необязательный Element_Type ; // null означает удаленный конечный интерфейс Binary_Node ; var Tree : необязательный Binary_Node ; var Count := 0 ; экспорт op "[]" () - > BMap is // Создаем пустую карту return ( Tree => null , Count => 0 ); end op "[]" ; func Insert ( var BMap ; Key : Key_Type ; Value : Element_Type ) is // Поиск Key, перезапись, если найден, вставка нового узла, если нет, for M => BMap . Tree loop if M is null then // Еще не на карте; добавить его M := ( Key => Key , Value => Value , Left => null , Right => null ); BMap . Count += 1 ; else case Key =? M . Key of [ #less ] => продолжить цикл с M . Left ; [ #greater ] => продолжить цикл с M . Right ; [ #equal ] => // Key уже на карте; // увеличить количество, если Value было null; если M . Value равно null , то BMap . Count += 1 ; end if ; // в любом случае перезаписать поле Value M . Value := Value ; return ; end case ; end if ; end loop ; конец функции Вставить ; func Find ( BMap ; Key : Key_Type ) - > необязательно Element_Type is // Поиск ключа, возврат связанного значения, если оно есть, или null в противном случае for M => BMap . Tree while M not null loop case Key =? M . Key of [ #less ] => продолжить цикл с M . Left ; [ #greater ] => продолжить цикл с M . Right ; [ #equal ] => // Нашел; возвратил значение return M . Value ; end case ; end loop ; // Не найдено в BMap return null ; end func Find ; func Delete ( var BMap ; Key : Key_Type ) is // Поиск ключа; удаление связанного узла, если он найден for M => BMap . Tree while M not null loop case Key =? M . Key of [ #less ] => продолжить цикл с M . Left ; [ #greater ] => продолжить цикл с M . Right ; [ #equal ] => // Нашел его; если не более одного поддерева не равно null, перезаписать // его; в противном случае установить его поле значения в null // (чтобы избежать более сложной повторной балансировки). if M . Left is null then // Переместить правое поддерево в M M <== M . Right ; elsif M . Right is null then // Переместить левое поддерево в M M <== M . Left ; else // Невозможно немедленно вернуть узел; // вместо этого установить поле значения в null. M . Value := null ; end if ; // Уменьшить счетчик BMap . Count -= 1 ; end case ; end loop ; // Не найдено в карте end func Delete ; func Count ( BMap ) - > Univ_Integer is // Возвращает количество элементов на карте return BMap.Count ; end func Count ; конец класса BMap ;
Вот простая тестовая программа для модуля BMap:
import PSL :: Core :: Random ; import BMap ; func Test_BMap ( Num : Univ_Integer ; Seed : Univ_Integer ) is // Тестирование карты на основе двоичного дерева var Ran : Random := Start ( Seed ); // Запуск последовательности случайных чисел // Объявляем отображение целых чисел в строки var M : BMap < Key_Type => Univ_Integer , Element_Type => Univ_String >; M := []; // Инициализируем карту пустой картой for I in 1 .. Num * 2 forward loop // Добавляем элементы на карту const Key := Next ( Ran ) mod Num + 1 ; const Val := "Val" | To_String ( I ); Println ( "Сейчас будет вставлено " | Key | " => " | Val ); Insert ( M , Key , Val ); end loop ; Println ( "Count = " | Count ( M )); for I in 1 .. Num loop // Поиск элементов на карте const Key := Next ( Ran ) mod Num + 1 ; Println ( "Ищем " | Key | ", найдено " | Find ( M , Key )); end loop ; for I in 1 .. Num / 3 loop // Удалить некоторые элементы из карты const Key := Next ( Ran ) mod Num + 1 ; Println ( "Собирается удалить " | Key ); Delete ( M , Key ); end loop ; Println ( "Count = " | Count ( M )); for I in 1 .. Num forward loop // Повторный поиск элементов на карте Println ( "Ищем " | I | ", найдено " | Find ( M , I )); end loop ;конец функции Test_BMap ;