Choral es un lenguaje de programación orientado a objetos diseñado para especificar coreografías, es decir, protocolos multiparte que definen cómo varios roles (los clásicos Alice, Bob, Carol…) deben coordinarse para llevar a cabo una tarea conjunta. Su objetivo es simplificar la construcción de sistemas concurrentes y distribuidos, un campo donde la correcta coordinación entre múltiples programas que interactúan mediante efectos secundarios suele ser fuente de errores difíciles de detectar y de costosas pruebas de integración.
El elemento diferenciador de Choral es su sistema de tipos higher-kinded con roles: los objetos llevan anotaciones de la forma T@(R1,…,Rn), donde T es la interfaz habitual y R1,…,Rn son los roles que implementan colaborativamente el objeto. Esto hace que la distribución sea explícita en el propio tipo, de modo que el compilador puede verificar la coherencia entre la coreografía descrita y el código generado.
A partir de una única descripción, el compilador de Choral genera automáticamente una biblioteca Java por cada rol. Cada biblioteca ofrece una API que los desarrolladores invocan desde sus proyectos (clientes, servicios, etc.) para participar correctamente en el protocolo. Si hay inconsistencias, como esperar un dato que nunca se comunica, el compilador lo detecta y lo reporta. Además, la herramienta ChoralUnit permite escribir tests de integración con la sencillez de los tests unitarios.
Choral es interoperable con Java y no impone un middleware concreto: siempre que se respeten los tipos del canal, pueden emplearse implementaciones de comunicación propias o código Java existente. Hoy es un prototipo de investigación, pero ya resulta viable para adopción temprana y uso docente. El artículo incluye ejemplos como una clase Hellos distribuida entre Alice y Bob, y un protocolo MeetingVote en el que Alice propone un tema, Bob consulta a Carol y ambos deciden.
