Articulo de referencia

Superpascal

SuperPascal es un lenguaje de programación imperativo y concurrente desarrollado por Per Brinch Hansen . [ 1 ] Fue diseñado como un lenguaje de publicación : una herramienta de ...

SuperPascal es un lenguaje de programación imperativo y concurrente desarrollado por Per Brinch Hansen . [ 1 ] Fue diseñado como un lenguaje de publicación : una herramienta de pensamiento que permite la expresión clara y concisa de conceptos en la programación paralela. Esto contrasta con los lenguajes de implementación, que suelen ser complejos debido a los detalles de la máquina y las convenciones históricas. Fue creado para satisfacer la necesidad de la época de un lenguaje de publicación paralelo. Podría decirse que pocos lenguajes actuales son lo suficientemente expresivos y concisos como para ser utilizados como herramientas de pensamiento.

Historia y desarrollo

SuperPascal se basa en el lenguaje secuencial Pascal de Niklaus Wirth , extendiéndolo con características para una concurrencia segura y eficiente. Pascal se utilizó ampliamente como lenguaje de publicación en la década de 1970. Se empleó para enseñar prácticas de programación estructurada y apareció en libros de texto, por ejemplo, sobre compiladores [ 2 ] y lenguajes de programación [ 3 ] . Hansen había desarrollado previamente el lenguaje Concurrent Pascal [ 4 ] , uno de los primeros lenguajes concurrentes para el diseño de sistemas operativos y sistemas de control en tiempo real .

Los requisitos de SuperPascal se basaron en la experiencia adquirida por Hansen durante tres años en el desarrollo de un conjunto de programas paralelos modelo, que implementaban métodos para problemas comunes en ciencias de la computación . [ 5 ] Esta experimentación le permitió llegar a las siguientes conclusiones sobre el futuro de la computación paralela científica :

  • Las futuras computadoras paralelas serán de propósito general , lo que permitirá a los programadores pensar en términos de configuraciones de procesos orientadas a problemas . Esto se basó en su experiencia programando redes de transputers , que eran procesadores de propósito general que podían conectarse en matrices , árboles o hipercubos .
  • Los problemas habituales en la ciencia computacional solo requieren paralelismo determinista , es decir, esperar la comunicación desde un canal particular , en lugar de desde varios.
  • Los algoritmos científicos paralelos pueden desarrollarse en un lenguaje de publicación elegante y probarse en una computadora secuencial . Una vez comprobado que un algoritmo funciona, puede implementarse fácilmente en un lenguaje de programación paralelo.

Esto dio lugar a los siguientes requisitos para un lenguaje de publicación paralelo:

  • El lenguaje debe extender un lenguaje estándar ampliamente utilizado con paralelismo determinista y comunicación de mensajes . Las extensiones deben respetar el espíritu del lenguaje estándar.
  • El lenguaje debe permitir programar configuraciones arbitrarias de procesos paralelos conectados mediante canales de comunicación. Estas configuraciones pueden definirse de forma iterativa o recursiva y crearse dinámicamente.
  • El lenguaje debería permitir que un compilador de una sola pasada compruebe que los procesos paralelos no interfieren de forma dependiente del tiempo.

Características

Las ideas clave en el diseño de SuperPascal fueron proporcionar una programación segura , con conceptos abstractos para el paralelismo. [ 6 ] [ 7 ]

Seguridad

SuperPascal es seguro porque permite que su compilador y sistema de tiempo de ejecución detecten la mayor cantidad posible de casos en los que los conceptos del lenguaje fallan y producen resultados sin sentido. [ 8 ] SuperPascal impone restricciones en el uso de variables que permiten que un compilador de una sola pasada verifique que los procesos paralelos sean disjuntos, incluso si los procesos usan procedimientos con variables globales, eliminando errores dependientes del tiempo. Varias características de Pascal eran ambiguas o inseguras y se omitieron en SuperPascal, como las etiquetas y gotosentencias, los punteros y las declaraciones anticipadas. [ 6 ]

Paralelismo

Las características paralelas de SuperPascal son un subconjunto de occam 2, con la generalidad añadida de arreglos de procesos dinámicos y procesos paralelos recursivos. [ 7 ]

Una parallelinstrucción indica que el número fijo de instrucciones que contiene debe ejecutarse en paralelo. Por ejemplo:

paralelo fuente() | hundir() fin 

Una forallinstrucción denota la ejecución paralela de una instrucción por un número dinámico de procesos, por ejemplo:

para todo i := 0 a 10 hacer algo() 

Canales y comunicación

Los procesos paralelos se comunican enviando mensajes tipados a través de canales creados dinámicamente. Los canales no son variables en sí mismos, sino que se identifican mediante un valor único conocido como referencia de canal , que se almacena en las variables de canal . Un canal se declara, por ejemplo, mediante la declaración

tipo canal = * ( booleano , entero ) ; var c : canal ;

que define un nuevo tipo (mixto) llamado canal y una variable de este tipo llamada c . Un canal de tipo mixto está restringido a transmitir solo los tipos especificados, en este caso valores booleanos y enteros. El canal c se inicializa mediante la openinstrucción:

abierto(c) 

La comunicación de mensajes se logra mediante las instrucciones send(channel, value)`and` receive(channel, variable). La expresión o variable que proporciona el valor para send`and` y la variable en ` receiveand` deben ser del mismo tipo que el primer argumento del canal. El siguiente ejemplo muestra el uso de estas funciones en un proceso que recibe un valor del canal izquierdo y lo envía por el derecho .

var izquierda , derecha : canal ; a : número ; recibir ( izquierda , a ) ; enviar ( derecha , a )

Las funciones sendy receivepueden aceptar múltiples argumentos de entrada y salida respectivamente:

enviar(canal, e1, e2,..., en); recibir(canal, v1, v2,..., vn) 

Pueden producirse los siguientes errores de comunicación en tiempo de ejecución :

  • La contención de canal se produce cuando dos procesos paralelos intentan enviar o recibir simultáneamente en el mismo canal.
  • Se produce un error de tipo de mensaje cuando dos procesos paralelos intentan comunicarse a través del mismo canal y la expresión de salida y la variable de entrada son de tipos diferentes.
  • Se produce un interbloqueo cuando una operación de envío o recepción espera indefinidamente a que finalice.

Recursión paralela

Los procedimientos recursivos se pueden combinar con sentencias parallelAND forallpara crear procesos recursivos paralelos. El siguiente ejemplo muestra cómo se puede definir recursivamente una secuenciaparallel de procesos mediante una sentencia AND.

procedimiento pipeline ( min , max : integer ; left , right : channel ) ; var middle : channel ; begin if min < max then begin open ( middle ) ; parallel node ( min , left , middle ) | pipeline ( min + 1 , max , middle , right ) end end else node ( min , left , right ) end ;

Otro ejemplo es la definición recursiva de un árbol de procesos :

procedimiento árbol ( profundidad : entero , fondo : canal ) ; var izquierda , derecha : canal ; inicio si profundidad > 0 entonces inicio abrir ( izquierda , derecha ) ; paralelo árbol ( profundidad - 1 , izquierda ) | árbol ( profundidad - 1 , derecha ) | raíz ( fondo , izquierda , derecha ) fin fin si no hoja ( fondo )

Control de interferencias

El aspecto más difícil de la programación concurrente es el comportamiento impredecible o no reproducible causado por errores dependientes del tiempo . Estos errores se producen por interferencias entre procesos paralelos, debido a actualizaciones de variables o conflictos de canal. Si los procesos que comparten una variable la actualizan en momentos impredecibles, el comportamiento resultante del programa depende del tiempo. Del mismo modo, si dos procesos intentan simultáneamente enviar o recibir datos en un canal compartido, el efecto resultante también depende del tiempo.

SuperPascal impone ciertas restricciones en el uso de variables y comunicación para minimizar o eliminar errores dependientes del tiempo. Con las variables, se requiere una regla simple: los procesos paralelos solo pueden actualizar conjuntos disjuntos de variables. [ 1 ] Por ejemplo, en una parallelinstrucción, una variable de destino no puede ser actualizada por más de un proceso, pero una variable de expresión (que no puede ser actualizada) puede ser utilizada por múltiples procesos. En algunas circunstancias, cuando una variable como un arreglo es el destino de múltiples procesos paralelos, y el programador sabe que su uso elemento a elemento es disjunto , entonces la restricción de disyunción puede ser anulada con una instrucción precedente [sic].

Estructura y sintaxis

SuperPascal es un lenguaje estructurado en bloques , con la misma sintaxis básica que Pascal. Un programa consta de una cabecera , definiciones de variables globales , definiciones de funciones o procedimientos y un procedimiento principal . Las funciones y los procedimientos constan de bloques , donde un bloque es un conjunto de instrucciones . Las instrucciones se separan con punto y coma, a diferencia de lenguajes como C o Java , donde se separan con punto y coma.

A continuación se muestra un ejemplo de un programa completo en SuperPascal, que construye una estructura de comunicación en paralelo con 100 nodos. Un nodo maestro envía un token entero al primer nodo, este se transmite a lo largo del protocolo y se incrementa en cada paso, hasta que finalmente el nodo maestro lo recibe y lo imprime.

canalización del programa ;const len ​​= 100 ;tipo canal = * ( entero ) ;var izquierda , derecha : canal ; valor : entero ;nodo de procedimiento ( i : entero ; izquierda , derecha : canal ) ; var valor : entero ; inicio recibir ( izquierda , valor ) ; enviar ( derecha , valor + 1 ) fin ;procedimiento crear ( izquierda , derecha : canal ) ; tipo fila = matriz [ 0 .. len ] de canal ; var c : fila ; i : entero ; inicio c [ 0 ] := izquierda ; c [ len ] := derecha ; para i := 1 hasta len - 1 hacer abrir ( c [ i ]) ; para todo i := 1 hasta len hacer nodo ( i , c [ i - 1 ] , c [ i ]) fin ;comenzar abierto ( izquierda , derecha ) ;envío paralelo ( izquierda , 0 ) | crear ( izquierda , derecha ) | recibir ( derecha , valor ) fin ;writeln ( 'El valor resultante es ' , valor ) end .

Implementación

El software SuperPascal se puede descargar gratuitamente desde el Archivo Brinch Hansen. [ 9 ] Consta de un compilador y un intérprete, ambos escritos en Pascal secuencial estándar (Pascal estándar ISO Nivel 1). Es compatible con el compilador GNU Pascal y las versiones más recientes del compilador Free Pascal (2.7.1+) con el -Misointerruptor, realizando las siguientes pequeñas modificaciones al código.

Para GPC, el archivo interpret.putiliza la función no estándar clock(línea 1786), que se utiliza para obtener la hora del sistema. En su lugar, getTimeStampse puede utilizar la función de Pascal extendido (que es compatible con el compilador GNU Pascal), declarando una variable de tipo TimeStamp, estableciéndola con la hora actual usando getTimeStampy asignando el Secondcampo de TimeStampa la variable t.

Free Pascal también necesita una solución al problema del "reloj" mencionado anteriormente (en Windows, basta con declarar gettickcount como externo con "clock" como nombre). Además, los reinicios/reescrituras que están marcados como no estándar en el código fuente deben cambiarse a pares de asignación/reinicio (o reescritura). (Es probable que GPC solo genere errores si se habilitan las banderas estrictas), y los comandos del preprocesador de C #include 'xx' deben cambiarse a {$include 'xx'}.

{ Código de tiempo para readtime en Freepascal en sistemas unix } Función FpTime ( var tloc : integer ) : integer ; nombre externo 'FPC_SYSC_TIME' ;procedimiento readtime ( var t : integer ) ; begin { Una función no estándar lee  el tiempo del procesador en ms } t := fptime ( t ) ; end ;

Referencias

  1. 1 2 Hansen, Per Brinch (1993), SuperPascal: un lenguaje de publicación para computación científica paralela
  2. Welsh, Jim (1980). Programación de sistemas estructurados . Upper Saddle River, NJ, EE. UU.: Prentice-Hall. ISBN 0-13-854562-6.
  3. Tennent, RD (1981). Principios de los lenguajes de programación . Upper Saddle River, NJ, EE. UU.: Prentice-Hall. ISBN 0-13-709873-1.
  4. Hansen, Brinch (1977). La arquitectura de los programas concurrentes . Prentice-Hall. ISBN 978-0130446282.
  5. Hansen, Brinch (mayo de 1993), "Programas modelo para la ciencia computacional: una metodología de programación para multicomputadoras", Concurrency : Practice and Experience , págs. 407–423 
  6. 1 2 Hansen, Brinch (1994). "El lenguaje de programación SuperPascal". Software: Practice and Experience . 24, 5 : 399– 406.
  7. ^ Hansen , Brinch (1977). La invención de la programación concurrente . Nueva York: Springer-Verlag. ISBN 0-387-95401-5.
  8. Hoare, CAR (1974). "Sugerencias sobre el diseño de lenguajes de programación". Confiabilidad de sistemas informáticos : 505–534 .
  9. Hayden, CC (11 de junio de 2008). "Archivo Per Brinch Hansen" . Recuperado el 3 de marzo de 2020 .
  • Sitio web oficial , archivo de Brinch Hansen, un conjunto de sus documentos y el software SuperPascal que se puede descargar en un archivo comprimido; contiene la especificación completa del lenguaje y documentación útil.
  • superpascal en GitHub , versión modificada de Christopher Long de la implementación original de SuperPascal; compila y se ejecuta bajo Free Pascal moderno; la ejecución del programa es más rápida que Perl 5 o 6, casi tan rápida como Python 3.