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 de el lenguaje concurrente Joule y de Original-E, un conjunto de extensiones de Java para una programación distribuida segura. E combina la computación basada en mensajes con una sintaxis similar a la de Java . Un modelo de simultaneidad basado en bucles de eventos y promesas asegura que nunca se produzca un interbloqueo . [4]
Paradigma | Multi-paradigma : orientado a objetos , paso de mensajes |
---|---|
Diseñada por | Mark S. Miller |
Apareció por primera vez | 1997 |
Disciplina de mecanografía | Fuerte , dinámico |
SO | Multiplataforma |
Licencia | Porciones en diferentes licencias gratuitas |
Sitio web | erights |
Implementaciones importantes | |
E-on-Java, E-on-CL | |
Influenciado por | |
Joule , E original , Java | |
Influenciado | |
Poni |
Filosofía
El lenguaje E está diseñado pensando en la informática segura ; esto se logra principalmente mediante la estricta adherencia al modelo de computación orientada a objetos, que en su forma pura tiene 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 sirven como capacidades, por lo que las capacidades no agregan costos generales computacionales o conceptuales. La sintaxis del lenguaje está diseñada para que las personas puedan auditar fácilmente las fallas de seguridad. Por ejemplo, el alcance léxico limita la cantidad de código que debe examinarse para ver sus efectos sobre una variable dada. Como otro ejemplo, el lenguaje usa 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 el cálculo se realiza enviando mensajes a los objetos. Cada objeto pertenece a una tina (análogo a un proceso ). Cada tina tiene un único hilo de ejecución, un marco de pila y una cola de eventos. La programación distribuida es solo una cuestión de enviar mensajes a objetos remotos (objetos en otras cubas). Toda la comunicación con partes remotas está encriptada por E runtime. Los mensajes que llegan se colocan en la cola de eventos del depósito; El bucle de eventos de la tina procesa los mensajes entrantes uno por uno en orden de llegada.
E tiene dos formas de enviar mensajes: la llamada inmediata y el 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 remitente espera hasta que el receptor finaliza y devuelve un valor. Un envío eventual envía el mensaje mientras produce un marcador de posición para el resultado llamado promesa . El remitente procede inmediatamente con la promesa. Más tarde, cuando el receptor termina y da un resultado, la promesa se resuelve en el resultado. Dado que solo se permiten envíos eventuales cuando se comunica con objetos remotos, no se pueden producir interbloqueos . En los sistemas distribuidos, el mecanismo de promesa 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 tiene cierto parecido con Python y Pascal . Las variables se escriben dinámicamente y tienen un alcance léxico . Sin embargo, a diferencia de Java o Python, E está compuesto enteramente por expresiones . Aquí hay un programa E extremadamente simple:
println ( "¡Hola, mundo!" )
Aquí hay una función recursiva para calcular el factorial de un número, escrito en E. Las funciones se definen usando la palabra clave def .
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 ,: int es una protección que restringe el argumento y el resultado de la función. Una guardia no es exactamente lo mismo que una declaración de tipo; los guardias son opcionales y pueden especificar restricciones. El primero : int asegura que el cuerpo de la función solo tendrá que manejar un argumento entero. Sin el segundo : int anterior, la función no podría devolver un valor. Ser capaz de ver desde el principio que la información se escapa de la función es útil para la auditoría de seguridad.
Dado que E está destinado a respaldar la cooperación segura, el ejemplo canónico de los programas E es la menta, un sistema de dinero electrónico simple en unas pocas líneas de E. El siguiente código define una función que fabrica mentas, donde cada menta tiene su propia divisa. Cada casa de moneda puede fabricar carteras que contengan su moneda, y cualquier poseedor de dos carteras de la misma moneda puede transferir dinero de forma segura entre las carteras. Mediante un examen rápido del código fuente, un programador de E puede verificar fácilmente que solo las casas de moneda pueden cambiar la cantidad de dinero en circulación, que el dinero solo puede crearse y no destruirse, que las casas de moneda solo pueden crear dinero de su propia moneda, y que solo el poseedor de un bolso puede cambiar su saldo.
def makeMint ( nombre ) : any { def [ sellador , unsellador ] : = makeBrandPair ( nombre ) def mint { to makePurse ( var balance :( int > = 0 )) : any { def decr ( monto :( 0 .. balance ) ) : void { saldo - = cantidad } def purse { to getBalance () : int { devolver saldo } to sprout () : any { return mint . makePurse ( 0 ) } a getDecr () : cualquier { sellador de retorno . seal ( decr ) } para depositar ( cantidad : int , src ) : void { unsealer . unseal ( src . getDecr ()) ( amount ) balance + = amount } } return purse } } return mint }
Los objetos en E se definen con la palabra clave def , y dentro de la definición del objeto, la palabra clave to comienza cada método. Las expresiones de protección de este ejemplo ilustran cómo especificar una restricción de valor (como en : (int> = 0) o : (0..balance) ).
El ejemplo de la menta hace uso de un mecanismo incorporado llamado sellador . La función makeBrandPair crea dos objetos asociados, un sellador y un sellador, de modo que el sellador puede sellar un objeto en una caja y el unsellador es el único objeto que puede recuperar 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]
Ver también
- Modelo de capacidad de objeto
Referencias
- ^ Handy, Alex (14 de noviembre de 2016). "El futuro de la seguridad del software" . Tiempos SD .
- ^ Seibel, Peter (21 de diciembre de 2009). "Codificadores en el trabajo: reflexiones sobre el oficio de la programación" . Presione. págs. 95–96.
- ^ "Historia de E" . www.erights.org .
- ^ Miller, Mark S .; Tribble, E. Dean; Shapiro, Jonathan (2005). "Concurrencia entre extraños" (PDF) . Computación global confiable . 3705 : 195-229. doi : 10.1007 / 11580850_12 .
- ^ Rees, Jonathan; Miller, Mark (2001). "De los objetos a las capacidades - dinero simple" . erights.org . ERights . Consultado el 8 de julio de 2014 .
Antes de presentar el siguiente ejemplo simple de dinero basado en capacidades, debemos intentar evitar una confusión que este ejemplo causa repetidamente. ¡No estamos proponiendo hacer dinero de esta manera! Un sistema monetario deseable también debe prever ...
enlaces externos
- Página web oficial