Concurrent Pascal es un lenguaje de programación diseñado por Per Brinch Hansen para escribir programas de computación concurrentes como sistemas operativos y sistemas de monitoreo de computación en tiempo real en computadoras de memoria compartida . [1]
Paradigmas | Imperativo , estructurado , concurrente |
---|---|
Familia | Wirth Pascal |
Diseñada por | Per Brinch Hansen |
Apareció por primera vez | Abril de 1974 |
Disciplina de mecanografía | Estático y dinámico , fuerte , seguro. |
Plataforma | DIC PDP 11 |
Influenciado por | |
ALGOL 60 , Simula 67, Pascal |
Se utiliza un lenguaje separado, Sequential Pascal , como lenguaje para los programas de aplicaciones ejecutados por los sistemas operativos escritos en Concurrent Pascal. Ambas lenguas son extensiones de Niklaus Wirth 's Pascal , y comparten un código común roscado intérprete . [2] A continuación se describe cómo Concurrent Pascal se diferencia del Pascal de Wirth.
Descripción del idioma
Varias construcciones en Pascal se eliminaron de Concurrent Pascal por simplicidad y seguridad: [2]
- Registros variantes
- Goto declaración y etiquetas
- Procedimientos como parámetros
- Matrices empaquetadas
- Tipos de puntero
- Tipos de archivo, y asociados estándar de salida de entrada / procedimientos
Estas omisiones permiten garantizar, mediante una combinación de comprobaciones en tiempo de compilación y comprobaciones mínimas en tiempo de ejecución en el intérprete de código enhebrado, que un programa no puede dañarse a sí mismo ni a otro programa al dirigirse fuera de su espacio asignado.
Pascal concurrente incluye tipos de datos de clase, monitor y proceso. Las instancias de estos tipos se declaran como variables y se inicializan en una init
declaración.
Las clases y los monitores son similares: ambos empaquetan variables privadas y procedimientos con procedimientos públicos (llamados entradas de procedimiento). Una instancia de clase puede ser utilizada por un solo proceso, mientras que una instancia de monitor puede ser compartida por procesos. Los monitores proporcionan el único mecanismo para la comunicación entre procesos en un programa Concurrent Pascal.
Solo se puede ejecutar un proceso dentro de una instancia de monitor determinada a la vez. Un tipo de datos integrado, la cola, junto con las operaciones delay
y continue
, se utilizan para la programación dentro de los monitores. Cada variable de tipo cola puede contener un proceso. Si se van a retrasar muchos procesos en un monitor, se deben proporcionar múltiples variables de cola, generalmente organizadas como una matriz. La variable de cola de proceso único le da al monitor un control total sobre la programación a mediano plazo, pero el programador es responsable de desbloquear el proceso correcto.
Un proceso, como una clase o un monitor, tiene variables locales, procedimientos y una declaración inicial, pero no tiene entradas de procedimiento. La declaración inicial normalmente se ejecuta para siempre, llamando a procedimientos locales, procedimientos de clase y procedimientos de supervisión. Los procesos se comunican a través de procedimientos de monitoreo. Las reglas de idioma evitan el estancamiento imponiendo una jerarquía en los monitores. Pero nada puede evitar que un monitor se olvide erróneamente de desbloquear un proceso retrasado (al no llamar a continue) para que el sistema aún pueda colgar efectivamente debido a errores de programación.
La configuración de procesos, monitores y clases en un programa de Pascal concurrente normalmente se establece al inicio de la ejecución y no se cambia posteriormente. Las rutas de comunicación entre estos componentes se establecen mediante variables pasadas en las init
sentencias, ya que las variables de instancia de clase y monitor no se pueden utilizar como parámetros de procedimiento.
Ejemplo
El siguiente ejemplo muestra la declaración de un monitor simple y su uso por dos procesos de comunicación.
tipo "Monitor de búfer limitado" búfer = Monitor var guardado : Entero ; "el elemento guardado es un entero" fullq , emptyq : Cola ; "utilizado por sólo dos procesos" completo : booleano ; "verdadero si se guarda un elemento:" "Artículo pone en memoria intermedia" procedimiento de entrada put ( elemento : Entero ); comenzar si está lleno, luego retrasar ( fullq ); "bloquear si está lleno" guardado : = elemento ; "guardar el elemento" completo : = verdadero ; "marcar como lleno" continuar ( vacíoq ) "desbloquear consumidor" final ; Entrada del procedimiento "Obtiene el elemento del búfer" get ( var item : Integer ); comenzar si no está lleno, luego retrasar ( vacíoq ); "bloque si está vacío" elemento : = salvado ; "obtener el artículo" completo : = falso ; "marcar como no completo" continuar ( fullq ) "desbloquear productor" fin ; "Inicializar el monitor" comienza completo : = final falso ; "El productor usa un búfer" productor = proceso ( paso : búfer ); var item : Integer ; iniciar ciclo "ejecutar en un bucle para siempre" "producir un elemento" pasar . put ( elemento ) "pasar un elemento al monitor" end end ; "El consumidor usa un búfer" consumidor = proceso ( paso : búfer ); var item : Integer ; comenzar pase de ciclo . obtener ( elemento ); "obtener un artículo del monitor" "consumir el artículo" end end ; "declarar instancias del monitor, productor y consumidor" "dar al productor y consumidor acceso al monitor" var pass : Buffer ; prod : Productor ; contras : consumidor ; comenzar init pasar , "inicializar el monitor" prod ( pasar ), "iniciar el proceso productor" contras ( pasar ) "iniciar el proceso consumidor" finalizar .
Referencias
- ^ Brinch Hansen, Per (junio de 1975). "El lenguaje de programación Concurrent Pascal" (PDF) . Transacciones IEEE sobre ingeniería de software (2): 199–207. doi : 10.1109 / tse.1975.6312840 .
- ^ a b Brinch Hansen, Per (1977). La arquitectura de programas concurrentes . Prentice Hall. ISBN 978-0-13-044628-2.