E es un lenguaje de programación orientado a objetos para computación distribuida segura , creado por Mark S. Miller , [ 1 ] Dan Bornstein , Douglas Crockford , [ 2 ] Chip Morningstar [ 3 ] y otros en Electric Communities en 1997. E desciende principalmente del lenguaje concurrente Joule y de Original-E, un conjunto de extensiones de Java para programación distribuida segura. E combina computación basada en mensajes con una sintaxis similar a la de Java . Un modelo de concurrencia basado en bucles de eventos y promesas garantiza que nunca se produzca un interbloqueo . [ 4 ]
Filosofía
El lenguaje E está diseñado para la seguridad informática y la computación segura. Esto se logra principalmente mediante la estricta adhesión al modelo de computación orientada a objetos, que en su forma pura, posee propiedades que respaldan la computación segura. El lenguaje E y su biblioteca estándar emplean una filosofía de diseño basada en capacidades para ayudar a los programadores a crear software seguro y permitir que los componentes de software cooperen incluso si no confían plenamente entre sí. En E, las referencias a objetos funcionan como capacidades, por lo que las capacidades no añaden costos computacionales ni conceptuales adicionales. La sintaxis del lenguaje está diseñada para que sea fácil de auditar en busca de fallos de seguridad. Por ejemplo, el alcance léxico limita la cantidad de código que debe examinarse para determinar sus efectos en una variable dada. Como otro ejemplo, el lenguaje utiliza el ==operador para la comparación y el :=operador para la asignación; para evitar la posibilidad de confusión, no hay =operador.
Modelo computacional
En E, todos los valores son objetos y la computación se realiza enviando mensajes a estos objetos. Cada objeto pertenece a un contenedor (análogo a un proceso ). Cada contenedor tiene un único hilo de ejecución, un marco de pila y una cola de eventos. La programación distribuida consiste simplemente en enviar mensajes a objetos remotos (objetos en otros contenedores). Toda la comunicación con entidades remotas está cifrada por el entorno de ejecución de E. Los mensajes que llegan se colocan en la cola de eventos del contenedor; el bucle de eventos del contenedor procesa los mensajes entrantes uno por uno en orden de llegada.
E tiene dos formas de enviar mensajes: una llamada inmediata y un envío eventual . Una llamada inmediata es como una llamada típica a una función o método en un lenguaje no concurrente: el emisor espera hasta que el receptor finaliza y devuelve un valor. Un envío eventual envía un mensaje mientras genera un marcador de posición para un resultado llamado promesa . El emisor procede inmediatamente con la promesa. Posteriormente, cuando el receptor finaliza y devuelve un resultado, la promesa se resuelve. Dado que solo se permiten envíos eventuales al comunicarse con objetos remotos, no se pueden producir interbloqueos . En sistemas distribuidos, el mecanismo de promesas también minimiza los retrasos causados por la latencia de la red.
Sintaxis y ejemplos
La sintaxis de E es muy similar a la de Java , aunque también guarda cierta semejanza con Python y Pascal . Las variables son de tipo dinámico y con ámbito léxico . Sin embargo, a diferencia de Java o Python, E se compone enteramente de expresiones . Aquí hay un programa en E extremadamente simple:
println ( "Hola, mundo!" )Aquí hay una función recursiva para calcular el factorial de un número, escrita en E. Las funciones se definen usando la defpalabra clave.
def factorial ( n : int ) : int { if ( n == 1 ) { return 1 } else if ( n > 0 ) { return n * factorial ( n - 1 ) } else { throw ( "Argumento inválido para factorial: " + n ) } }En la primera línea, :inthay una condición que restringe el argumento y el resultado de la función. Una condición no es exactamente lo mismo que una declaración de tipo; las condiciones son opcionales y pueden especificar restricciones. La primera :intgarantiza que el cuerpo de la función solo tenga que manejar un argumento entero. Sin la segunda :intcondición, la función no podría devolver ningún valor. Poder ver de antemano que la información se escapa de la función es útil para la auditoría de seguridad.
Dado que E está diseñado para facilitar la cooperación segura, el ejemplo clásico de los programas en E es la casa de la moneda, un sistema de dinero electrónico sencillo que se define en tan solo unas pocas líneas de código E. El siguiente código define una función que crea casas de la moneda, donde cada casa de la moneda tiene su propia moneda. Cada casa de la moneda puede crear monederos que contienen su moneda, y cualquier persona que posea dos monederos de la misma moneda puede transferir dinero de forma segura entre ellos. Mediante un examen rápido del código fuente, un programador de E puede verificar fácilmente que solo las casas de la moneda pueden modificar la cantidad de dinero en circulación, que el dinero solo se puede crear y no destruir, que las casas de la moneda solo pueden crear dinero de su propia moneda y que solo el poseedor de un monedero puede modificar su saldo.
def makeMint ( name ) : any { def [ sellador , dessellador ] := makeBrandPair ( name ) def mint { to makePurse ( var balance : ( int > = 0 ) ) : any { def decr ( amount : ( 0..balance ) ) : void { balance -= amount } def purse { to getBalance () : int { return balance } to sprout ( ) : any { return mint.makePurse ( 0 ) } to getDecr ( ) : any { return sellador.seal ( decr ) } to deposit ( amount : int , src ) : void { dessellador.unseal ( src.getDecr ( ) ) ( amount ) balance + = amount } } return purse } } return mint }Los objetos en E se definen con la defpalabra clave, y dentro de la definición del objeto, la topalabra clave inicia cada método. Las expresiones de guarda en este ejemplo ilustran cómo especificar una restricción de valor (como en :(int >= 0)o :(0..balance)).
El ejemplo de la casa de la moneda utiliza un mecanismo integrado llamado sellador . Esta función makeBrandPaircrea dos objetos asociados, un sellador y un dessellador, de modo que el sellador puede sellar un objeto en una caja y el dessellador es el único objeto que puede extraer el contenido de la caja. Consulte el sitio web de E para obtener una explicación más detallada de este ejemplo de dinero. [ 5 ]
Véase también
Referencias
- ↑ Handy, Alex (14 de noviembre de 2016). "El futuro de la seguridad del software" . SD Times .
- ↑ Seibel, Peter (21 de diciembre de 2009). Coders at Work: Reflections on the Craft of Programming . Apress. pp. 95–96 . ISBN 9781430219491.
- ↑ "Historia de E" . www.erights.org .
- ↑ Miller, Mark S.; Tribble, E. Dean; Shapiro, Jonathan (2005). "Concurrency Among Strangers" (PDF) . Trustworthy Global Computing . Lecture Notes in Computer Science. 3705 : 195–229 . Bibcode : 2005LNCS.3705..195M . doi : 10.1007/11580850_12 . ISBN 978-3-540-30007-6Archivado del original (PDF) el 31-03-2022 . Consultado el 05-03-2021 .
- ↑ Rees, Jonathan; Miller, Mark (2001). "De objetos a capacidades: dinero simple" . erights.org . ERights . Consultado el 8 de julio de 2014.
Antes de presentar el siguiente ejemplo sencillo de dinero basado en capacidades, debemos intentar evitar una confusión que este ejemplo provoca repetidamente. ¡No proponemos implementar el dinero de esta manera! Un sistema monetario deseable también debe contemplar...
Enlaces externos
- Sitio web oficial
- Lenguajes de programación concurrentes
- Lenguajes de programación orientados a objetos
- Lenguajes de programación de la JVM
- Lenguajes de programación seguros
- Lenguajes de programación dinámicos
- Lenguajes de programación de tipado dinámico
- Sistemas de capacidad
- Lenguajes de programación
- Lenguajes de programación de alto nivel
- Lenguajes de programación creados en 1997
- Software de 1997
