El lenguaje E es un lenguaje de programación orientado a objetos diseñado específicamente para la computación distribuida segura. Fue creado en 1997 por Mark S. Miller, Dan Bornstein, Douglas Crockford, Chip Morningstar y otros miembros de Electric Communities. E tiene sus raíces principalmente en el lenguaje concurrente Joule y en Original-E, un conjunto de extensiones de Java destinadas a la programación distribuida segura.
Filosofía de Diseño y Seguridad
La filosofía central de E es la seguridad informática. Para lograrlo, el lenguaje se adhiere estrictamente al modelo de computación orientado a objetos en su forma pura, aprovechando propiedades que favorecen la seguridad. E emplea un diseño basado en capacidades (capabilities) en todo su lenguaje y biblioteca estándar.
En E, las referencias a los objetos actúan como capacidades, lo que significa que no hay costos conceptuales ni computacionales adicionales para implementar este sistema. Además, la sintaxis ha sido diseñada para facilitar la auditoría de fallos de seguridad. Por ejemplo:
- El alcance léxico limita la cantidad de código que debe revisarse para entender el efecto sobre una variable.
- Se utiliza el operador
==para comparaciones y:=para asignaciones, eliminando el operador=para evitar confusiones comunes.
Modelo Computacional
En el ecosistema de E, todos los valores son objetos y la computación se realiza mediante el envío de mensajes. La estructura se organiza de la siguiente manera:
- Vats: Cada objeto pertenece a un "vat" (análogo a un proceso). Cada vat posee un único hilo de ejecución, un marco de pila y una cola de eventos.
- Comunicación: La programación distribuida consiste en enviar mensajes a objetos remotos situados en otros vats. Toda la comunicación externa está cifrada por el entorno de ejecución de E.
- Bucle de Eventos: Los mensajes entrantes se colocan en la cola de eventos del vat y se procesan secuencialmente.
Mecanismos de Envío de Mensajes
E implementa dos métodos para la comunicación entre objetos:
- Llamada inmediata: Similar a una función tradicional; el emisor espera a que el receptor termine y devuelva un valor.
- Envío eventual: El emisor envía un mensaje y recibe inmediatamente una promesa (placeholder). Cuando el receptor finaliza, la promesa se resuelve con el resultado.
Dado que la comunicación con objetos remotos solo permite envíos eventuales, el lenguaje garantiza que nunca ocurran interbloqueos (deadlocks) y minimiza los retrasos causados por la latencia de la red.
Sintaxis y Características
La sintaxis de E es similar a la de Java, con influencias de Python y Pascal. A diferencia de estos lenguajes, E está compuesto enteramente por expresiones y utiliza un tipado dinámico con alcance léxico.
Guardias y Seguridad
E utiliza guardias (como :int) para restringir los argumentos y los resultados de las funciones. A diferencia de las declaraciones de tipo tradicionales, los guardias son opcionales y sirven como herramientas de auditoría, permitiendo a los programadores verificar rápidamente qué información entra y sale de una función.
El Ejemplo del Mint (Casa de Moneda)
Para demostrar su capacidad de cooperación segura, E utiliza el ejemplo del "mint". En este sistema, se pueden crear monedas electrónicas donde:
- Solo las casas de moneda pueden cambiar la cantidad de dinero en circulación.
- El dinero solo puede crearse, no destruirse.
- Solo el poseedor de un monedero puede cambiar su saldo.
Este sistema utiliza un mecanismo llamado sealer (sellador), que crea un par de objetos (sellador y desellador) para proteger la información, asegurando que solo el objeto desellador autorizado pueda recuperar el contenido de una "caja" sellada.

