Occam es un lenguaje de programación concurrente que se basa en el álgebra de procesos de comunicación secuencial (CSP) [1] y comparte muchas de sus características. Recibe su nombre del filósofo Guillermo de Ockham, de quien toma su nombre la navaja de Occam .
Occam es un lenguaje procedimental imperativo (como Pascal ). Fue desarrollado por David May y otros en Inmos (marca registrada INMOS), asesorados por Tony Hoare , como lenguaje de programación nativo para sus microprocesadores transputer , pero existen implementaciones para otras plataformas. La versión más conocida es Occam 2; su manual de programación fue escrito por Steven Ericsson-Zenith y otros en Inmos .
En los siguientes ejemplos, la sangría y el formato son fundamentales para analizar el código: las expresiones terminan al final de la línea y las listas de expresiones deben estar en el mismo nivel de sangría. Esta característica, denominada regla de fuera de línea , también se encuentra en otros lenguajes como Haskell y Python .
La comunicación entre procesos funciona a través de canales con nombre . Un proceso envía datos a un canal a través de !
mientras que otro ingresa datos con ?
. La entrada y la salida no pueden continuar hasta que el otro extremo esté listo para aceptar u ofrecer datos. (En el caso de que no continúe , se suele decir que el proceso se bloquea en el canal. Sin embargo, el programa no girará ni sondeará; por lo tanto, términos como esperar , colgar o ceder también pueden transmitir el comportamiento; también en el contexto de que no bloqueará la ejecución de otros procesos independientes). Ejemplos (c es una variable):
teclado ? c
pantalla !c
SEQ
introduce una lista de expresiones que se evalúan secuencialmente. Esto no es implícito como en la mayoría de los demás lenguajes de programación. Ejemplo:
secuencia x := x + 1 y := x * x
PAR
comienza una lista de expresiones que pueden evaluarse simultáneamente. Ejemplo:
PAR pag() q()
ALT
especifica una lista de comandos protegidos . Los protectores son una combinación de una condición booleana y una expresión de entrada, ambas opcionales. Cada protector para el que la condición es verdadera y el canal de entrada está listo es exitoso. Se selecciona una de las alternativas exitosas para su ejecución. Ejemplo:
ALT count1 < 100 y c1 ? datos secuencia cuenta1 := cuenta1 + 1 ¡datos fusionados! count2 < 100 y c2 ? datos secuencia cuenta2 := cuenta2 + 1 ¡datos fusionados! estado ? solicitud secuencia ¡fuera! cuenta1 ¡fuera! cuenta2
Esto leerá datos de los canales c1 o c2 (el que esté listo) y los pasará a un canal fusionado. Si countN llega a 100, se deshabilitarán las lecturas del canal correspondiente. Una solicitud en el canal de estado se responde enviando los recuentos a out
.
Occam 1 [2] (publicado en 1983) fue una versión preliminar del lenguaje que tomó elementos del trabajo de David May en EPL y del CSP de Tony Hoare. Esta versión solo admitía el tipo de datos VAR, que era un tipo integral que se correspondía con la longitud de palabra nativa de la arquitectura de destino, y matrices de una sola dimensión.
occam 2 [3] es una extensión producida por Inmos Ltd en 1987 que agrega soporte de punto flotante , funciones, matrices multidimensionales y más tipos de datos como tamaños variables de números enteros (INT16, INT32) y bytes.
Con esta revisión, Occam se convirtió en un lenguaje capaz de expresar programas útiles, mientras que Occam 1 era más adecuado para examinar algoritmos y explorar el nuevo lenguaje (sin embargo, el compilador de Occam 1 fue escrito en Occam 1, [4] por lo que hay una prueba de existencia de que se podrían escribir programas útiles y de tamaño razonable en Occam 1, a pesar de sus límites).
occam 2.1 [1] fue el último de la serie de desarrollos del lenguaje occam aportados por Inmos. Definido en 1994, estuvo influenciado por una propuesta anterior para un lenguaje occam 3 (también conocido como "occam91" durante su desarrollo inicial) creado por Geoff Barrett en Inmos a principios de los años 1990. Se distribuyó un Manual de referencia revisado que describe occam 3 para comentarios de la comunidad, [5] pero el lenguaje nunca se implementó por completo en un compilador.
Occam 2.1 introdujo varias características nuevas en Occam 2, entre ellas:
Para obtener una lista completa de los cambios, consulte el Apéndice P del Manual de referencia de Inmos occam 2.1.
occam-π [6] es el nombre común de la variante de occam implementada por versiones posteriores del compilador retargetable de occam de Kent ( KRoC ). La adición del símbolo π (pi) al nombre de occam es una alusión a que KRoC occam incluye varias ideas inspiradas en el cálculo π . Contiene varias extensiones significativas del compilador de occam 2.1, por ejemplo:
{{cite journal}}
: Requiere citar revista |journal=
( ayuda )