В этой статье слишком много ссылок на первоисточники . ( Октябрь 2017 г. ) ( Узнайте, как и когда удалить этот шаблон сообщения ) |
Парадигма | скомпилированный , параллельный , императивный , структурированный , объектно-ориентированный |
---|---|
Разработано | С. Такер Тафт |
Разработчик | AdaCore |
Впервые появился | 2009 |
Стабильный выпуск | 8.4 / 2 ноября 2019 г . |
Печатная дисциплина | сильный , статичный |
Платформа | x86 |
Операционные системы | Linux , macOS , Windows |
Лицензия | GPL v3 |
Расширения имени файла | .psi, .psl |
Веб-сайт | parasail-lang |
Основные реализации | |
psli, pslc | |
Под влиянием | |
Модула , Ада , Паскаль , ML | |
Под влиянием | |
Ним [1] |
Язык параллельной спецификации и реализации ( ParaSail ) - это объектно-ориентированный язык параллельного программирования . Его дизайн и текущая реализация описаны в блоге [2] и на официальном сайте. [3]
ParaSail использует модель программирования без указателей , в которой объекты могут увеличиваться и уменьшаться, а семантика значений используется для присвоения. У него нет глобальной кучи сбора мусора . Вместо этого повсюду используется региональное управление памятью . Типы могут быть рекурсивными, если рекурсивные компоненты объявлены необязательными . Здесь нет глобальных переменных, нет псевдонимов параметров, и все подвыражения выражения могут оцениваться параллельно. Утверждения , предусловия , постусловия , инварианты классов и т. Д. Являются частью стандартного синтаксиса, использующего нотацию типа Хоара . Любой возможныйусловия гонки обнаруживаются во время компиляции .
Первоначальный дизайн ParaSail был начат в сентябре 2009 года С. Такером Тафтом.
Оба переводчика с использованием летать на парашюте за катером виртуальную машину , и LLVM -На летать на парашюте за катером компилятор доступны. Кража работы используется для планирования легких потоков ParaSail . Последнюю версию можно скачать с сайта ParaSail. [3]
Описание [ править ]
Этот раздел нуждается в расширении . Вы можете помочь, добавив к нему . ( Февраль 2018 г. ) |
Синтаксис из похож заниматься парасейлингом с Модулой , но с объектно-ориентированной моделью программирования класса и интерфейсом на основе более похож на 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 ;
Ссылки [ править ]
- ^ Rumpf, Andreas (19 октября 2017). «Ним без GC» . Размышления Арака . Дата обращения 1 сентября 2020 .
- ^ Блог ParaSail
- ^ 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