El lenguaje de implementación y especificación paralela ( ParaSail ) es un lenguaje de programación paralelo orientado a objetos . Su diseño e implementación en curso se describe en un blog [2] y en su sitio web oficial. [3]
Paradigma | compilado , concurrente , imperativo , estructurado , orientado a objetos |
---|---|
Diseñada por | S. Tucker Taft |
Desarrollador | AdaCore |
Apareció por primera vez | 2009 |
Lanzamiento estable | 8.4 / 2 de noviembre de 2019 |
Disciplina de mecanografía | fuerte , estático |
Plataforma | x86 |
SO | Linux , macOS , Windows |
Licencia | GPL v3 |
Extensiones de nombre de archivo | .psi, .psl |
Sitio web | parasail-lang |
Implementaciones importantes | |
psli, pslc | |
Influenciado por | |
Modula , Ada , Pascal , ML | |
Influenciado | |
Nim [1] |
ParaSail utiliza un modelo de programación sin punteros , donde los objetos pueden crecer y encogerse, y se utiliza semántica de valores para la asignación. No tiene un montón de recolección de basura global . En su lugar, la gestión de memoria basada en regiones se utiliza en todas partes. 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 afirmaciones , precondiciones , poscondiciones , invariantes de clase , etc., son parte de la sintaxis estándar, utilizando una notación similar a Hoare . Las posibles condiciones de carrera se detectan en el momento de la compilación .
El diseño inicial de ParaSail comenzó en septiembre de 2009, por S. Tucker Taft.
Tanto un intérprete utilizando el ParaSail máquina virtual , y un LLVM basados en ParaSail compilador están disponibles. Robo de trabajo se utiliza para la programación de peso ligero de ParaSail hilos . La última versión se puede descargar del sitio web de ParaSail. [3]
Descripción
La sintaxis de ParaSail es similar a Modula , pero con un modelo de programación orientado a objetos basado en clases e interfaces más similar 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 (llamados así por el subconjunto Ada SPARK en en el que se basa). Los compiladores e intérpretes para estos idiomas se incluyen con la implementación de ParaSail. [3]
Ejemplos de
El siguiente es un programa Hola mundo en ParaSail:
func Hello_World ( var IO ) es IO . Println ( "Hola, mundo" ); end func Hello_World ;
La siguiente es una interfaz para un módulo de mapa básico:
interfaz BMap < Key_Type is Ordered <>; Element_Type es asignable < >> es op "[]" () - > BMap ; // Crea un mapa vacío func Insert ( var BMap ; Clave : Key_Type ; Valor : Element_Type ); func Find ( BMap ; Key : Key_Type ) - > opcional Element_Type ; func Delete ( var BMap ; Key : Key_Type ); func Count ( BMap ) - > Univ_Integer ; interfaz final BMap ;
Aquí hay una posible implementación de este módulo de mapa, usando un árbol binario:
clase BMap es interface Binary_Node <> es // Un módulo de nodo binario "concreto" simple var Izquierda : opcional Binary_Node ; var Derecha : nodo_binario opcional ; const Clave : Key_Type ; var Valor : opcional Element_Type ; // nulo significa interfaz final eliminada Binary_Node ; var Tree : opcional Binary_Node ; var Count : = 0 ; exportaciones op "[]" () - > BMap is // Crea un mapa vacío return ( Tree => null , Count => 0 ); end op "[]" ; func Insert ( var BMap ; Key : Key_Type ; Value : Element_Type ) es // Buscar clave, sobrescribir si se encuentra, insertar nuevo nodo si no es para M => BMap . Bucle de árbol si M es nulo entonces // Aún no está en el mapa; agregarlo M : = ( Clave => Clave , Valor => Valor , Izquierda => nulo , Derecha => nulo ); BMap . Cuenta + = 1 ; en caso contrario, clave =? M . Key de [ #less ] => continuar bucle con M . Izquierda ; [ #Greater ] => continuar bucle con M . Derecha ; [ #equal ] => // La clave ya está en el mapa; // recuento de golpes si el valor era nulo; si M . El valor es nulo y luego BMap . Cuenta + = 1 ; terminar si ; // en cualquier caso sobrescribir el campo Valor M . Valor : = Valor ; volver ; caso final ; terminar si ; bucle final ; end func Insertar ; func Find ( BMap ; Key : Key_Type ) - > opcional Element_Type es // Buscar clave, devolver el valor asociado si está presente, o nulo en caso contrario para M => BMap . Árbol mientras M no caso de bucle nulo Clave =? M . Key de [ #less ] => continuar bucle con M . Izquierda ; [ #Greater ] => continuar bucle con M . Derecha ; [ #equal ] => // Lo encontré; devolver el valor de retorno M . Valor ; caso final ; bucle final ; // No se encuentra en BMap return null ; end func Find ; func Delete ( var BMap ; Key : Key_Type ) es // Buscar clave; eliminar el nodo asociado si se encuentra para M => BMap . Árbol mientras M no caso de bucle nulo Clave =? M . Key de [ #less ] => continuar bucle con M . Izquierda ; [ #Greater ] => continuar bucle con M . Derecha ; [ #equal ] => // Lo encontré; si como máximo un subárbol no es nulo, // lo sobrescriba ; de lo contrario, establezca su campo de valor en nulo // (para evitar un reequilibrio más complejo). si M . Izquierda es nulo entonces // Mover subárbol derecho en M M <== M . Derecha ; elsif M . Derecho es nulo entonces // Mover subárbol izquierdo en M M <== M . Izquierda ; else // No se puede reclamar el nodo inmediatamente; // establece el campo de valor en nulo en su lugar. M . Valor : = nulo ; terminar si ; // Disminuir el recuento BMap . Cuenta - = 1 ; caso final ; bucle final ; // No se encuentra en el mapa end func Delete ; func Count ( BMap ) - > Univ_Integer es // Devuelve el recuento del número de elementos en el mapa return BMap . Contar ; end func Count ; clase final BMap ;
Aquí hay un programa de prueba simple para el módulo BMap:
importar PSL :: Core :: Random ; importar BMap ; func Test_BMap ( Num : Univ_Integer ; Seed : Univ_Integer ) es // Probar el mapa basado en árbol binario var Ran : Random : = Start ( Seed ); // Iniciar una secuencia de números aleatorios // Declarar un mapa de enteros a cadenas var M : BMap < Key_Type => Univ_Integer , Element_Type => Univ_String >; M : = []; // Inicializa el mapa al mapa vacío for I in 1 .. Num * 2 forward loop // Agrega elementos al mapa const Key : = Next ( Ran ) mod Num + 1 ; const Val : = "Val" | To_String ( I ); Println ( "A punto de insertar" | Clave | "=>" | Val ); Insertar ( M , clave , Val ); bucle final ; Println ( "Count =" | Count ( M )); for I in 1 .. Num loop // Buscar elementos en el mapa const Key : = Next ( Ran ) mod Num + 1 ; Println ( "Buscando" | Tecla | ", encontrado" | Buscar ( M , Tecla )); bucle final ; for I in 1 .. Num / 3 loop // Elimina algunos elementos del mapa const Key : = Next ( Ran ) mod Num + 1 ; Println ( "A punto de eliminar" | Tecla ); Eliminar ( M , tecla ); bucle final ; Println ( "Count =" | Count ( M )); for I in 1 .. Num forward loop // Buscar de nuevo elementos en el mapa Println ( "Buscando" | I | ", encontrado" | Find ( M , I )); bucle final ;end func Test_BMap ;
Referencias
- ^ Rumpf, Andreas (19 de octubre de 2017). "Nim sin GC" . Reflexiones de Araq . Consultado el 1 de septiembre de 2020 .
- ^ Blog de ParaSail
- ^ a b c Sitio web de ParaSail
Referencias generales
- Graham-Rowe, Duncan (28 de julio de 2011). "Nuevo lenguaje para programar en paralelo" . Revisión de tecnología . MIT.
- Clarke, Peter (28 de julio de 2011). "SofCheck prepara el lenguaje paralelo de ParaSail" . EETimes . Electrónica UBM.
- Taft, S. Tucker (9 de junio de 2012). "ParaSail: Menos es más con multinúcleo" . EETimes . Electrónica UBM.
- Selwood, Dick (18 de julio de 2012). "¿Necesita el mundo un nuevo lenguaje de programación?" . EEJournal . techfocus media, inc.
enlaces externos
- Página web oficial
- Blog de proceso de diseño e implementación
- Grupo de noticias de idiomas de ParaSail