ParaSail ( Parallel Specification and Implementation Language ) es un lenguaje de programación paralela orientado a objetos . Su diseño e implementación actual se describen en un blog [ 2 ] y en su sitio web oficial. [ 3 ]
ParaSail utiliza un modelo de programación sin punteros , donde los objetos pueden crecer y encogerse, y se utiliza la semántica de valores para la asignación. No tiene un montón global con recolección de basura . En su lugar, se utiliza una gestión de memoria basada en regiones . Los tipos pueden ser recursivos, siempre que los componentes recursivos se declaren opcionales . No hay variables globales, ni alias de parámetros, y todas las subexpresiones de una expresión se pueden evaluar en paralelo. Las aserciones , precondiciones , postcondiciones , invariantes de clase , etc., forman parte de la sintaxis estándar , utilizando una notación similar a la de Hoare . Cualquier posible condición de carrera se detecta en tiempo de compilación .
El diseño inicial de ParaSail fue iniciado en septiembre de 2009 por S. Tucker Taft.
Están disponibles tanto un intérprete que utiliza la máquina virtual ParaSail como un compilador ParaSail basado en LLVM . Para la planificación de los hilos ligeros de ParaSail se utiliza el robo de trabajo . La última versión se puede descargar desde el sitio web de ParaSail. [ 3 ]
Descripción
La sintaxis de ParaSail es similar a la de Modula , pero con un modelo de programación orientada a objetos basado en clases e interfaces, más parecido a Java o C# .
Más recientemente, las construcciones paralelas de ParaSail se han adaptado a otras sintaxis para producir lenguajes paralelos similares a Java , Python y Ada , denominados respectivamente Javallel, Parython y Sparkel (nombrados en honor al subconjunto SPARK de Ada en el que se basa). Los compiladores e intérpretes para estos lenguajes se incluyen con la implementación de ParaSail. [ 3 ]
Ejemplos
El siguiente es un programa "Hola mundo" en ParaSail:
func Hello_World ( var IO ) is IO . Println ( "Hola, Mundo" ); end func Hello_World ;A continuación se muestra una interfaz para un módulo de mapa básico:
interface BMap < Key_Type is Ordered <>; Element_Type is Assignable < >> is op "[]" () - > BMap ; // Crea un mapa vacíofunc Insertar ( var BMap ; Clave : Tipo_Clave ; Valor : Tipo_Elemento ); func Buscar ( BMap ; Clave : Tipo_Clave ) - > opcional Tipo_Elemento ; func Eliminar ( var BMap ; Clave : Tipo_Clave ); func Contar ( BMap ) - > Entero_Unit ; fin de la interfaz BMap ;Aquí se muestra una posible implementación de este módulo de mapa, utilizando un árbol binario:
La clase BMap esinterface Binary_Node <> is // Un módulo de nodo binario "concreto" simple var Left : optional Binary_Node ; var Right : optional Binary_Node ; const Key : Key_Type ; var Value : optional Element_Type ; // null significa eliminado end interface Binary_Node ;var Árbol : opcional Binary_Node ; var Contador := 0 ;exportacionesop "[]" () - > BMap es // Crea un mapa vacío return ( Tree => null , Count => 0 ); end op "[]" ;func Insertar ( var BMap ; Clave : Tipo_Clave ; Valor : Tipo_Elemento ) es // Buscar Clave, sobrescribir si se encuentra, insertar nuevo nodo si no para M => BMap . Tree loop si M es nulo entonces // No está ya en el mapa; agregarlo M := ( Clave => Clave , Valor => Valor , Izquierda => nulo , Derecha => nulo ); BMap . Count += 1 ; else case Clave =? M . Clave de [ #menor ] => continuar bucle con M . Izquierda ; [ #mayor ] => continuar bucle con M . Derecha ; [ #igual ] => // La clave ya está en el mapa; // incrementar contador si Valor era nulo; si M . Valor es nulo entonces BMap . Count += 1 ; fin si ; // en cualquier caso sobrescribir el campo Valor M . Valor := Valor ; retornar ; fin caso ; fin si ; fin bucle ; fin func Insertar ;func Find ( BMap ; Key : Key_Type ) - > optional Element_Type is // Buscar la clave, devolver el valor asociado si está presente, o null en caso contrario 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 ] => // Encontrado; devolver el valor return M . Value ; end case ; end loop ; // No encontrado en BMap return null ; end func Find ;func Delete ( var BMap ; Key : Key_Type ) is // Buscar Key; eliminar el nodo asociado si se encuentra 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 ] => // Encontrado; si como máximo un subárbol no es nulo, sobrescribirlo // de lo contrario, establecer su campo de valor a nulo // (para evitar un reequilibrio más complejo). if M . Left is null then // Mover el subárbol derecho a M M <== M . Right ; elsif M . Right is null then // Mover el subárbol izquierdo a M M <== M . Left ; else // No se puede reclamar el nodo inmediatamente; // establecer el campo de valor a nulo en su lugar. M . Value := null ; end if ; // Decrementar el contador BMap . Count -= 1 ; end case ; end loop ; // No se encuentra en el mapa fin de la función Eliminar ;func Count ( BMap ) - > Univ_Integer is // Devuelve el recuento del número de elementos en el mapa return BMap . Count ; end func Count ;fin de la clase BMap ;Aquí tenéis un programa de prueba sencillo para el módulo BMap:
import PSL :: Core :: Random ; import BMap ; func Test_BMap ( Num : Univ_Integer ; Seed : Univ_Integer ) is // Prueba el mapa basado en árbol binario var Ran : Random := Start ( Seed ); // Inicia una secuencia de números aleatorios// Declara un mapa de enteros a cadenas var M : BMap < Key_Type => Univ_Integer , Element_Type => Univ_String >;M := []; // Inicializa el mapa como un mapa vacíopara I en 1 .. Num * 2 bucle hacia adelante // Agregar elementos al mapa const Key := Next ( Ran ) mod Num + 1 ; const Val := "Val" | To_String ( I ); Println ( "A punto de insertar " | Key | " => " | Val ); Insert ( M , Key , Val ); fin del bucle ; Println ( "Cantidad = " | Count ( M ));para I en 1 .. Num bucle // Buscar elementos en el mapa const Key := Next ( Ran ) mod Num + 1 ; Println ( "Buscando " | Key | ", encontrado " | Find ( M , Key )); fin del bucle ;para I en 1 .. Num / 3 bucle // Eliminar algunos elementos del mapa const Key := Next ( Ran ) mod Num + 1 ; Imprimir ( "A punto de eliminar " | Key ); Eliminar ( M , Key ); fin del bucle ; Imprimir ( "Cantidad = " | Count ( M ));para I en 1 .. Num bucle hacia adelante // Buscar de nuevo elementos en el mapa Imprimir ( "Buscando " | I | ", encontrado " | Find ( M , I )); fin del bucle ;fin de la función Test_BMap ;Referencias
Referencias generales
- Graham-Rowe, Duncan (28 de julio de 2011). "Nuevo lenguaje para la programación en paralelo" . Technology Review . MIT. Archivado del original el 26 de octubre de 2015. Recuperado el 18 de agosto de 2012 .
- Clarke, Peter (28 de julio de 2011). "SofCheck prepara el lenguaje paralelo ParaSail" . EETimes . UBM Electronics.
- Taft, S. Tucker (9 de junio de 2012). "ParaSail: Menos es más con multinúcleo" . EETimes . UBM Electronics.
- Selwood, Dick (18 de julio de 2012). "¿Necesita el mundo un nuevo lenguaje de programación?" . EEJournal . techfocus media, inc.
Enlaces externos
- Sitio web oficial
- Blog sobre el proceso de diseño e implementación
- Grupo de noticias sobre el idioma ParaSail
- Familia de lenguajes de programación Pascal
- Lenguajes de programación concurrentes
- Lenguajes de programación procedimental
- lenguajes de programación de sistemas
- Software multiplataforma
- Lenguajes de programación creados en 2009
- Software de 2009
- Proyectos de software libre