ParaSail (язык программирования)
![]() | В данной статье поднимается несколько вопросов. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти шаблонные сообщения )
|
![]() Логотип языка программирования ParaSail | |
Парадигма | скомпилированный , параллельный , императивный , структурированный , объектно-ориентированный |
---|---|
Разработано | С. Такер Тафт |
Разработчик | АдаКор |
Впервые появился | 2009 год |
Стабильная версия | 9.3
/ 6 июня 2021 г |
Дисциплина набора текста | сильный , статичный |
Платформа | х86 |
ТЫ | Linux , MacOS , Windows |
Лицензия | Лицензия GPL v3 |
Расширения имен файлов | .psi, .psl |
Веб-сайт | парасейлинг-ланг |
Основные реализации | |
псли, пслц | |
Под влиянием | |
Модуль , Ада , Паскаль , ML | |
Под влиянием | |
Nim [1] |
Язык параллельной спецификации и реализации ( ParaSail ) — объектно-ориентированный язык параллельного программирования . Его конструкция и текущая реализация описаны в блоге. [2] и на его официальном сайте. [3]
ParaSail использует указателей модель программирования без , в которой объекты могут увеличиваться и уменьшаться, а для присвоения используется семантика значений. У него нет глобальной кучи мусора . Вместо этого управление памятью на основе регионов повсеместно используется . Типы могут быть рекурсивными, если рекурсивные компоненты объявлены необязательными . Здесь нет глобальных переменных, псевдонимов параметров, и все подвыражения выражения могут вычисляться параллельно. Утверждения , предусловия , постусловия , инварианты классов и т. д. являются частью стандартного синтаксиса , использующего нотацию, подобную Хоару . Любые возможные состояния гонки обнаруживаются во время компиляции .
Первоначальная разработка ParaSail началась в сентябре 2009 года С. Такером Тафтом.
как интерпретатор, ParaSail использующий виртуальную машину , так и LLVM ParaSail на базе компилятор Доступен . Кража работы используется для планирования легких потоков ParaSail . Последнюю версию можно скачать с сайта ParaSail. [3]
Описание [ править ]
![]() | Этот раздел нуждается в расширении . Вы можете помочь, дополнив это . ( февраль 2018 г. ) |
Синтаксис Java ParaSail аналогичен Modula , но с моделью объектно-ориентированного программирования на основе классов и интерфейсов, более похожей на или C # .
Совсем недавно параллельные конструкции ParaSail были адаптированы к другим синтаксисам для создания Java -подобных, Python -подобных и Ada -подобных параллельных языков , получивших названия соответственно Javallel, Parython и Sparkel (названных в честь подмножества Ada SPARK на на чем он основан). Компиляторы и интерпретаторы этих языков включены в реализацию ParaSail. [3]
Примеры [ править ]
Ниже приведена программа Hello world в ParaSail:
func Hello_World ( var IO ) — это
IO . Println ( «Привет, мир» );
завершение функции Hello_World ;
Ниже приведен интерфейс базового модуля карты:
интерфейс BMap < Key_Type заказан ; <> Element_Type — назначаемый < >> is
op "[]" () - > BMap ; // Создаём пустую карту
func Insert ( var BMap ; Key : Key_Type ; Value : Element_Type );
func Найти ( BMap ; Ключ : Тип_ключа ) - > необязательный Тип_элемента ;
func Удалить ( вар BMap ; Ключ : Key_Type );
func Count ( BMap ) - > Univ_Integer ;
конечный интерфейс BMap ;
Вот возможная реализация этого модуля карты: используя двоичное дерево:
класс BMap —
интерфейс Binary_Node <> —
// Простой «конкретный» модуль двоичного узла
var Left : необязательный Binary_Node ;
var Right : необязательно Binary_Node ;
константный ключ : Key_Type ;
var Значение : необязательный Element_Type ; // значение null означает удаленный
конечный интерфейс Binary_Node ;
var Tree : необязательно Binary_Node ;
вар Количество := 0 ;
экспортирует
op "[]" () - > BMap is // Создаем пустую карту
return ( Tree => null , Count => 0 );
завершить операцию "[]" ;
func Insert ( var BMap ; Key : Key_Type ; Value : Element_Type ) //
Поиск ключа, перезапись, если найден, вставка нового узла, если нет
M = > BMap . Древовидный цикл
, если M равен нулю , то
// Еще не на карте; добавьте его
M := ( Key => Key , Value => Value , Left => null , Right => null );
БМап . Счет += 1 ;
иначе
регистр Ключ =? М. Клавиша #less
[ ] M =>
продолжить цикл с помощью . Левый ;
[ #greater ] =>
продолжить цикл с помощью M . Верно ;
[ #equal ] =>
// Ключ уже есть в карте;
// счетчик ударов, если значение равно нулю;
если М . Значение равно нулю, тогда
BMap . Счет += 1 ;
конец , если ;
// в любом случае перезаписываем поле
M. значения Значение := Значение ;
возвращаться ;
конец дела ;
конец , если ;
конец цикла ;
конец функции Insert ;
func Find ( BMap ; Key : Key_Type ) - > необязательный Element_Type :
// Поиск ключа, возврат связанного значения, если оно присутствует, или ноль в противном случае
для M => BMap . Дерево , пока M не имеет нулевого цикла
= . Key ? М. Клавиша #less
[ ] M =>
продолжить цикл с помощью . Левый ;
[ #greater ] =>
продолжить цикл с помощью M . Верно ;
[ #equal ] =>
// Нашел; вернуть значение
return M . Ценить ;
конец дела ;
конец цикла ;
// Не найдено в BMap
return null ;
конец функции Найти ;
func Удалить ( var BMap ; Key : Key_Type ) —
// Поиск ключа; удалить связанный узел, если он найден
для M => BMap . Дерево , пока M не имеет нулевого цикла
= . Key ? М. Клавиша #less
[ ] M =>
продолжить цикл с помощью . Левый ;
[ #greater ] =>
продолжить цикл с помощью M . Верно ;
[ #equal ] =>
// Нашел; если хотя бы одно поддерево не пустое,
// перезаписать его; в противном случае установите для поля значения значение null
// (чтобы избежать более сложной перебалансировки).
если М . значение Left равно нулю Тогда
// Переместить правое поддерево в M
M <== M . Верно ;
Эльсиф М. правое равно нулю Тогда
// Переместить левое поддерево в M
M <== M . Левый ;
else
// Невозможно немедленно вернуть узел;
// вместо этого устанавливаем в поле значения значение null.
М. Значение : = ноль ;
конец , если ;
// Уменьшение счетчика
BMap . Счет -= 1 ;
конец дела ;
конец цикла ;
карты
// Не найдено в конечной функции . Удалить ;
func Count ( BMap ) - > Univ_Integer is
// Возвращает количество элементов на карте
return BMap . Считать ;
конец функции Count ;
конечный класс BMap ;
Вот простая тестовая программа для модуля BMap:
импортировать PSL :: Core :: Random ;
импортировать БМап ;
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 >;
М := []; // Инициализируем пустую карту
для I in 1 .. Num * 2 вперед цикла // Добавляем элементы на карту
const Key := Next ( Ran ) mod Num + 1 ;
const Val := "Val" | To_String ( я );
Println ( "О вставке" | Key | " => " | Val );
Вставить ( М , Ключ , Вал );
конец цикла ;
Println ( "Count =" | Count ( M ));
for I in 1 .. Num цикл // Поиск элементов на карте
const Key := Next ( Ran ) mod Num + 1 ;
Println ( "Ищу " | Ключ | ", найдено " | Найти ( M , Ключ ));
конец цикла ;
for I in 1 .. Num / 3 цикл // Удалить некоторые элементы с карты
const Key := Next ( Ran ) mod Num + 1 ;
Println ( "Собираюсь удалить" | Ключ );
Удалить ( М , Ключ );
конец цикла ;
Println ( "Count =" | Count ( M ));
for I in 1 .. Num вперед цикл // Снова ищем элементы на карте
Println ( "Ищем " | I | ", найдено " | Найти ( M , I ));
конец цикла ;
конец функции Test_BMap ;
Ссылки [ править ]
- ^ Румпф, Андреас (19 октября 2017 г.). «Ним без GC» . Размышления Арака . Проверено 1 сентября 2020 г.
- ^ Блог ParaSail
- ^ Перейти обратно: а б с Сайт ПараСейл
Общие ссылки [ править ]
- Грэм-Роу, Дункан (28 июля 2011 г.). «Новый язык для параллельного программирования» . Обзор технологий . Массачусетский технологический институт. Архивировано из оригинала 26 октября 2015 года . Проверено 18 августа 2012 г.
- Кларк, Питер (28 июля 2011 г.). «SofCheck готовит параллельный язык ParaSail» . ЭТаймс . УБМ Электроникс.
- Тафт, С. Такер (9 июня 2012 г.). «ParaSail: с многоядерными процессорами меньше значит лучше» . ЭТаймс . УБМ Электроникс.
- Селвуд, Дик (18 июля 2012 г.). «Нужен ли миру новый язык программирования?» . Электронный журнал . Техфокус Медиа, Инк.
Внешние ссылки [ править ]
- Семейство языков программирования Паскаль
- Параллельные языки программирования
- Процедурные языки программирования
- Языки системного программирования
- Кроссплатформенное программное обеспечение
- Языки программирования, созданные в 2009 году.
- программное обеспечение 2009 года
- Бесплатные программные проекты