Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

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

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

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

Описание [ править ]

Синтаксис из похож заниматься парасейлингом с Модулой , но с объектно-ориентированной моделью программирования класса и интерфейсом на основе более похож на Java или C # .

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

Примеры [ править ]

Ниже представлена ​​программа Hello world в ParaSail:

func  Hello_World ( var  IO )  - это  ввод-вывод . Println ( "Привет, мир" ); конец  func  Hello_World ;

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

интерфейс  BMap < Key_Type  is  Ordered <>;  Element_Type  является  назначаемым < >>  is  op  "[]" ()  - >  BMap ;  // Создаем пустую карту func  Insert ( var  BMap ;  Key  :  Key_Type ;  Value  :  Element_Type );  func  Find ( BMap ;  Key  :  Key_Type )  - >  необязательный  Element_Type ;  func  Delete ( var  BMap ;  Key  :  Key_Type );  func  Count ( BMap )  - >  Univ_Integer ; конечный  интерфейс  BMap ;

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

класс  BMap  - это interface  Binary_Node <>  is  // Простой "конкретный" модуль двоичного узла  var  Left  :  optional  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 );  конец  операции  "[]" ; FUNC  Insert ( вар  ВМАР ;  Key  :  key_type ;  Значение  :  ELEMENT_TYPE )  является  // Искать ключ, перезапись , если найден, вставка нового узла , если не  для  M  =>  ВМАР . Цикл дерева,  если M равно нулю, то // его еще нет на карте; добавьте его M : = ( Key => Key , Value => Value , Left => null , Right => null ); BMap                    . Счетчик  + =  1 ;  в противном  случае  ключ  =?  M . Ключ  из  [ #less ]  =>  продолжить  цикл  с  М . Слева ;  [ #Greater ]  =>  продолжить  цикл  с  М . Правильно ;  [ #equal ]  =>  // Ключ уже на карте;  // увеличить счетчик, если Value было нулевым;  если  М . Значение  равно нулю,  тогда  BMap . Считать + =  1 ;  конец,  если ;  // в любом случае перезапись поле Value  M . Значение  : =  Значение ;  возврат ;  конец  корпуса ;  конец,  если ;  конец  петли ;  end  func  Insert ; func  Find ( BMap ;  Key  :  Key_Type )  - >  необязательный  Element_Type  is  // Поиск ключа, возврат связанного значения, если он присутствует, или null в противном случае  для  M  =>  BMap . Дерево, в  то время как  M  не нулевой  цикл  case  Key  =?  M . Ключ  из  [ #less ]  =>  продолжить  цикл  с  М . Слева ;  [ #greater ]  =>  продолжить петля  с  М . Правильно ;  [ #equal ]  =>  // Нашел; возвращает значение  возвращаемого  M . Стоимость ;  конец  корпуса ;  конец  петли ;  // Не найдено в BMap  return  null ;  end  func  Find ; func  Delete ( var  BMap ;  Key  :  Key_Type )  is  // Поиск ключа; удалите связанный узел, если он найден  для  M  =>  BMap . Дерево в  то время как  M  не нулевой  цикл  случай  Key  =?  M . Ключ  из  [ #less ]  =>  продолжить  цикл  с  М . Слева ;  [ #Greater ]  =>  продолжить  цикл  с  М . Верно;  [ #equal ]  =>  // Нашел; если не более одного поддерева не равно нулю,  //  перезаписываем его; в противном случае установите для поля значения значение null // (чтобы избежать более сложной повторной балансировки).  если  М . Left  равно нулю ,  то  // Переместить правое поддерево в M  M  <==  М . Правильно ;  ELSIF  M . Право  равна нулю ,  то  // Переместить левое поддерево в M  M  <==  М . Слева ;  else  // Невозможно немедленно вернуть узел;  // вместо этого устанавливаем поле значения в null.  M .Значение  : =  null ;  конец,  если ;  //  Уменьшить счетчик BMap . Счетчик  - =  1 ;  конец  корпуса ;  конец  петли ;  // Не найдено на карте  end  func  Delete ; func  Count ( BMap )  - >  Univ_Integer  is  // Возвращает количество элементов на карте  return  BMap . Граф ;  end  func  Count ;конец  класса  BMap ;

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

импорт  PSL :: Core :: Random ; импорт  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  прямой  цикл  // Добавление элементов на карту  const  Key  : =  Next ( Ran )  mod  Num  +  1 ;  const  Val  : =  "Val"  |  To_String ( I );  Println ( "Собираюсь вставить"  |  Ключ  |  "=>"  |  Val );  Вставка ( М ,  Ключ ,  Вал );  конец  цикла;  Println ( "Счетчик ="  |  Счетчик ( M )); for  I  in  1 .. Num  loop  // Поиск элементов на карте  const  Key  : =  Next ( Ran )  mod  Num  +  1 ;  Println ( "Ищу"  |  Ключ  |  ", найдено"  |  Найти ( M ,  Ключ ));  конец  петли ; for  I  in  1 .. Num / 3  loop  // Удаляем некоторые элементы с карты  const  Key  : =  Next ( Ran )  mod  Num  +  1 ;  Println ( «Об удалении»  |  Клавиша );  Удалить ( M ,  ключ );  конец  петли ;  Println ( "Счетчик ="  |  Счетчик ( M )); for  I  in  1 .. Num  forward  loop  //  Повторный поиск элементов на карте Println ( "Ищем"  |  I  |  ", найдено"  |  Find ( M ,  I ));  конец  петли ;end  func  Test_BMap ;

Ссылки [ править ]

  1. ^ Rumpf, Andreas (19 октября 2017). «Ним без GC» . Размышления Арака . Дата обращения 1 сентября 2020 .
  2. ^ Блог ParaSail
  3. ^ a b c Веб-сайт ParaSail

Общие ссылки [ править ]

  • Грэм-Роу, Дункан (28 июля 2011 г.). «Новый язык для параллельного программирования» . Обзор технологий . Массачусетский технологический институт.
  • Кларк, Питер (28 июля 2011 г.). «SofCheck подготавливает параллельный язык ParaSail» . EETimes . UBM Electronics.
  • Тафт, С. Такер (9 июня 2012 г.). «ParaSail: Меньше значит больше с многоядерностью» . EETimes . UBM Electronics.
  • Селвуд, Дик (18 июля 2012 г.). «Нужен ли миру новый язык программирования?» . EEJournal . techfocus media, inc.


Внешние ссылки [ править ]

  • Официальный веб-сайт
  • Блог процесса проектирования и внедрения
  • Группа языковых новостей ParaSail