ParaSail (langage de programmation) - ParaSail (programming language)

ParaSail
Logo pour ParaSail Programming Language.jpg
Logo conçu par Abouzar Abbasi
Paradigme compilé , simultané , impératif , structuré , orienté objet
Conçu par S. Tucker Taft
Développeur AdaCore
Première apparition 2009 ; Il y a 11 ans ( 2009 )
Version stable
8.4 / 2 novembre 2019 ; il y a 10 mois ( 02/11/2019 )
Discipline de frappe fort , statique
Plate-forme x86
OS Linux , macOS , Windows
Licence GPL v3
Extensions de nom de fichier .psi, .psl
Site Internet parasail-lang .org
Principales implémentations
psli, pslc
Influencé par
Modula , Ada , Pascal , ML
Influencé
Nim

Parallel Specification and Implementation Language ( ParaSail ) est un langage de programmation parallèle orienté objet . Sa conception et sa mise en œuvre en cours sont décrites dans un blog et sur son site officiel.

ParaSail utilise un modèle de programmation sans pointeur , dans lequel les objets peuvent croître et se réduire, et la sémantique des valeurs est utilisée pour l'affectation. Il n'a pas de tas global de récupération de place . Au lieu de cela, la gestion de la mémoire basée sur la région est utilisée partout. Les types peuvent être récursifs, tant que les composants récursifs sont déclarés facultatifs . Il n'y a pas de variables globales, pas d'alias de paramètre et toutes les sous-expressions d'une expression peuvent être évaluées en parallèle. Les assertions , les conditions préalables , les postconditions , les invariants de classe , etc. font partie de la syntaxe standard, en utilisant une notation semblable à Hoare . Toutes les conditions de concurrence possibles sont détectées au moment de la compilation .

La conception initiale de ParaSail a commencé en septembre 2009, par S. Tucker Taft.

Un interpréteur utilisant la machine virtuelle ParaSail et un compilateur ParaSail basé sur LLVM sont disponibles. Le vol de travail est utilisé pour la planification de poids léger PARASAIL threads . La dernière version peut être téléchargée sur le site Web de ParaSail.

La description

La syntaxe de ParaSail est similaire à celle de Modula , mais avec un modèle de programmation orienté objet basé sur des classes et des interfaces plus similaire à Java ou C # .

Plus récemment, les constructions parallèles de PARASAIL ont été adaptés à d' autres syntaxes, pour produire Java -comme, Python -comme et Ada -comme langues parallèles , surnommé respectivement, Javallel, Parython et Sparkel ( du nom du sous - ensemble Ada SPARK sur sur lequel il est basé). Des compilateurs et des interprètes pour ces langages sont inclus avec l'implémentation ParaSail.

Exemples

Ce qui suit est un programme Hello world dans ParaSail:

func Hello_World(var IO) is
    IO.Println("Hello, World");
end func Hello_World;

Voici une interface vers un module de carte de base:

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;

Voici une implémentation possible de ce module de carte, en utilisant un arbre binaire:

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;

Voici un programme de test simple pour le module 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;

Les références

Références générales


Liens externes