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) is
IO.Println("Hello, World");
end func Hello_World;
Ниже приведен интерфейс базового модуля карты:
interface BMap<Key_Type is Ordered<>; Element_Type is Assignable<>> is
op "[]"() -> BMap; // Create an empty map
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;
Вот возможная реализация этого модуля карты: используя двоичное дерево:
class BMap is
interface Binary_Node<> is
// A simple "concrete" binary node module
var Left : optional Binary_Node;
var Right : optional Binary_Node;
const Key : Key_Type;
var Value : optional Element_Type; // null means deleted
end interface Binary_Node;
var Tree : optional Binary_Node;
var Count := 0;
exports
op "[]"() -> BMap is // Create an empty map
return (Tree => null, Count => 0);
end op "[]";
func Insert(var BMap; Key : Key_Type; Value : Element_Type) is
// Search for Key, overwrite if found, insert new node if not
for M => BMap.Tree loop
if M is null then
// Not already in the map; add it
M := (Key => Key, Value => Value, Left => null, Right => null);
BMap.Count += 1;
else
case Key =? M.Key of
[#less] =>
continue loop with M.Left;
[#greater] =>
continue loop with M.Right;
[#equal] =>
// Key is already in the map;
// bump count if Value was null;
if M.Value is null then
BMap.Count += 1;
end if;
// in any case overwrite the Value field
M.Value := Value;
return;
end case;
end if;
end loop;
end func Insert;
func Find(BMap; Key : Key_Type) -> optional Element_Type is
// Search for Key, return associated Value if present, or null otherwise
for M => BMap.Tree while M not null loop
case Key =? M.Key of
[#less] =>
continue loop with M.Left;
[#greater] =>
continue loop with M.Right;
[#equal] =>
// Found it; return the value
return M.Value;
end case;
end loop;
// Not found in BMap
return null;
end func Find;
func Delete(var BMap; Key : Key_Type) is
// Search for Key; delete associated node if found
for M => BMap.Tree while M not null loop
case Key =? M.Key of
[#less] =>
continue loop with M.Left;
[#greater] =>
continue loop with M.Right;
[#equal] =>
// Found it; if at most one subtree is non-null, overwrite
// it; otherwise, set its value field to null
// (to avoid a more complex re-balancing).
if M.Left is null then
// Move right subtree into M
M <== M.Right;
elsif M.Right is null then
// Move left subtree into M
M <== M.Left;
else
// Cannot immediately reclaim node;
// set value field to null instead.
M.Value := null;
end if;
// Decrement count
BMap.Count -= 1;
end case;
end loop;
// Not found in the map
end func Delete;
func Count(BMap) -> Univ_Integer is
// Return count of number of items in map
return BMap.Count;
end func Count;
end class BMap;
Вот простая тестовая программа для модуля BMap:
import PSL::Core::Random;
import BMap;
func Test_BMap(Num : Univ_Integer; Seed : Univ_Integer) is
// Test the Binary-Tree-based Map
var Ran : Random := Start(Seed); // Start a random-number sequence
// Declare a map from integers to strings
var M : BMap<Key_Type => Univ_Integer, Element_Type => Univ_String>;
M := []; // Initialize the map to the empty map
for I in 1..Num*2 forward loop // Add elements to the map
const Key := Next(Ran) mod Num + 1;
const Val := "Val" | To_String(I);
Println("About to insert " | Key | " => " | Val);
Insert(M, Key, Val);
end loop;
Println("Count = " | Count(M));
for I in 1..Num loop // Search for elements in the map
const Key := Next(Ran) mod Num + 1;
Println("Looking for " | Key | ", found " | Find(M, Key));
end loop;
for I in 1..Num/3 loop // Delete some elements from the map
const Key := Next(Ran) mod Num + 1;
Println("About to delete " | Key);
Delete(M, Key);
end loop;
Println("Count = " | Count(M));
for I in 1..Num forward loop // Search again for elements in the map
Println("Looking for " | I | ", found " | Find(M, I));
end loop;
end func 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 года
- Бесплатные программные проекты