stringtranslate.com

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

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 ;

Ссылки

  1. ^ Rumpf, Andreas (19 октября 2017 г.). «Nim без GC». Araq's Musings . Получено 1 сентября 2020 г.
  2. ^ Блог ParaSail
  3. ^ Сайт abc ParaSail

Общие ссылки


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