Articulo de referencia

Joyce (lenguaje de programación)

Joyce es un lenguaje de programación seguro para computación concurrente diseñado por Per Brinch Hansen en la década de 1980. [ 1 ] Se basa en el lenguaje secuencial Pascal y en...

Joyce es un lenguaje de programación seguro para computación concurrente diseñado por Per Brinch Hansen en la década de 1980. [ 1 ] Se basa en el lenguaje secuencial Pascal y en los principios de los procesos secuenciales comunicantes (CSP). Fue creado para subsanar las deficiencias de CSP como lenguaje de programación y para proporcionar una herramienta, principalmente didáctica, para la implementación de sistemas de computación distribuida .

El lenguaje se basa en el concepto de agentes ; procesos que se ejecutan simultáneamente y se comunican únicamente mediante canales y paso de mensajes . Los agentes pueden activar subagentes de forma dinámica y recursiva . El desarrollo de Joyce sentó las bases del lenguaje SuperPascal , también desarrollado por Hansen alrededor de 1993.

Características

Joyce se basa en un pequeño subconjunto de Pascal, extendido con características inspiradas en CSP para la concurrencia. [ 2 ] Las siguientes secciones describen algunas de las características más novedosas que se introdujeron.

Agentes

Un agente es un procedimiento que consta de un conjunto de instrucciones y, posiblemente, definiciones anidadas de otros agentes. Un agente puede activar dinámicamente subagentes que se ejecutan simultáneamente con su creador . Un agente solo puede finalizar cuando todos sus subagentes también hayan finalizado. Por ejemplo, un agente process2activa process1:

agente proceso1 ( x , y : entero ) ;comenzar...fin ;proceso del agente2 () ;usar proceso1 ;comenzarproceso1 ( 9 , 17 ) ;fin ;

La activación de un agente crea nuevas instancias de todas las variables locales y el valor de cada parámetro formal se copia a una variable local. Por lo tanto, los agentes no pueden acceder a las variables de otros agentes y solo pueden comunicarse mediante canales. Esta restricción evita problemas asociados con el uso de variables compartidas, como las condiciones de carrera .

Comunicación

Los agentes se comunican a través de entidades llamadas canales . Los canales tienen un alfabeto que define el conjunto de símbolos que se pueden transmitir. Los canales se crean dinámicamente y se accede a ellos mediante variables de puerto . Un tipo de puerto se define por un conjunto distinto de símbolos que constituyen su alfabeto. Los símbolos con múltiples valores se definen con un tipo específico. Por ejemplo:

flujo = [ int ( entero ) , eos ] ;

El símbolo int(integer)denota un símbolo de mensajeint llamado de cualquier valor entero. La segunda declaración de símbolo sin tipo eos(fin de flujo) se denomina señal . Una vez que se ha definido un tipo de puerto, se puede declarar una variable de puerto de ese tipo:

salida: transmisión en: flujo 

Y luego, una entidad de canal, interna al agente que la crea, puede activarse de la siguiente manera:

+salida; 

Los símbolos se pueden enviar y recibir en los canales utilizando los operadores de entrada y salida de estilo CSP ?, !respectivamente. La comunicación solo puede ocurrir si existe un agente receptor que coincida con el agente emisor. El agente receptor debe esperar recibir el tipo de símbolo que se envía. Por ejemplo, el valor 9 seguido del eossímbolo se envía en el puerto out:

¡ fuera ! int ( 9 ) ¡ fuera ! eos

Y se recibe un mensaje entero en una variable del tipo correspondiente, seguido de eos:

recibido : entero en ? int ( recibido ) en ? eos

Declaraciones de encuestas

Las instrucciones de sondeo se basan en el concepto de alternativas protegidas de CSP. Una instrucción de sondeo se compone de un conjunto de instrucciones, cada una protegida por una instrucción de canal de entrada. Cuando se encuentra una coincidencia de comunicación entre un agente transmisor y una protección, se ejecuta la protección, seguida de la instrucción correspondiente. Por ejemplo:

encuesta en ? X -> x := x + 1 | en ? Y -> y := y + 1 fin 

Cuando inse monitorea el puerto para las señales Xo Y, en una comunicación coincidente, las variables correspondientes xo yse incrementan.

Seguridad

Joyce fue diseñado para ser un lenguaje seguro en el sentido de que un compilador sería capaz de detectar todas las violaciones de las reglas del lenguaje.

Programa de ejemplo

A continuación se presenta un programa de ejemplo completo, extraído del artículo original que introduce el lenguaje de programación Joyce, [ 1 ] que implementa un algoritmo para generar números primos basado en una técnica de cribado . Un sieveagente recibe una secuencia de enteros de su predecesor, siendo el primero un número primo. Elimina todos los múltiplos de este primo de la secuencia y activa a un sucesor. Este proceso continúa hasta que la eosseñal se propaga a través del conjunto de cribas.

agente tamiz ( entrada , salida : flujo ) ; var más : booleano ; x , y : entero ; succ : flujo ; inicio sondeo entrada ? entero ( x ) -> + succ ; tamiz ( succ , salida ) ; más := verdadero | entrada ? eos -> salida ! eos ; más := falso fin ; mientras más hacer sondeo entrada ? entero ( y ) -> si y mod x <> 0 entonces succ ! entero ( y ) | entrada ? eos -> salida ! entero ( x ) ; succ ! eos ; más := falso fin ; fin ;

El siguiente agente inicializa el conjunto de agentes de cribado y les introduce una secuencia de números enteros entre 3 y 9999.

agente primos ; usar generar , tamizar , imprimir ; var a , b : flujo ; inicio + a ; + b ; generar ( a , 3 , 2 , 4999 ) ; tamizar ( a , b ) ; imprimir ( b ) fin ;

Implementación

Asignación de pila

Debido a la ejecución concurrente de los procedimientos del agente, no se puede utilizar un esquema convencional de asignación de pila secuencial , ya que los registros de activación de las llamadas del agente no siguen un patrón de último en entrar, primero en salir. En cambio, las relaciones creador-subagente forman una pila con estructura de árbol. Se utiliza un esquema simple para implementar este comportamiento, que funciona asignando nuevos registros de activación en la parte superior de la pila y vinculando los registros de activación de los subagentes con el registro de su creador. Estos registros se liberan solo cuando el agente ha terminado y se encuentran en la parte superior de la pila. [ 3 ] La efectividad de este esquema depende de la estructura y el comportamiento de un programa, lo que en algunos casos resultará en un uso deficiente de la memoria. Un esquema más efectivo fue implementado en el lenguaje SuperPascal de Hansen .

Referencias

  1. 1 2 Hansen, Brinch (2002). «Joyce: Un lenguaje de programación para sistemas distribuidos». En Hansen, Per Brinch (ed.). El origen de la programación concurrente: De los semáforos a las llamadas a procedimientos remotos . Nueva York, Nueva York: Springer. pp. 464–492 . doi : 10.1007/978-1-4757-3472-0 . ISBN  978-1-4419-2986-0. S2CID 44909506 . 
  2. Hansen, Brinch (junio de 1989). "El informe lingüístico de Joyce" . Software: Practice and Experience . 19 (6). John Wiley & Sons: 553–578 . doi : 10.1002/spe.4380190606 . S2CID 30474491 . 
  3. Hansen, Brinch (junio de 1989). "Una implementación multiprocesador de Joyce" . Software: Practice and Experience . 19 (6). John Wiley & Sons: 579–592 . doi : 10.1002/spe.4380190606 . S2CID 30474491 . 
  • Sitio web oficial , Archivo Brinch Hansen, un conjunto de sus documentos.