Versión 1.0pre1 - Ideas de Base
Mayo 1, 2002
Carlos A. Rueda
Este
documento borrador describe algunas de las ideas de base para el futuro
desarrollo del modelo de objetos del lenguaje Loro. Se utiliza Java
como lenguaje de contraste. Todo comentario será muy bienvenido y
puede canalizarse a través de la lista de correo loro-spec.
Síntesis:
- Loro es un lenguaje basado en objetos (no basado en clases).
- Los tipos para los objetos se establecen explícitamente mediante interfaces. Una interface establece las operaciones que ciertos objetos deben proveer.
- Un objeto puede implementar directamente las operaciones de una interface (sin necesidad de una clase mediadora). En particular, un objeto puede definirse desde tiempo de compilación.
- Una clase no establece un tipo, pero es la implementación (posiblemente parcial) de una o más interfaces (tipos) y actúa como una plantilla que permite crear objetos que satisfacen dichas interfaces en tiempo de ejecución.
- No se maneja el concepto de miembros de clase. Más bien, se insiste en el comportamiento como objeto que en efecto se presenta para tal caso en otros lenguajes. Esto evita introducir términos adicionales.
Algunos comentarios
El mecanismo static de Java hace que una clase tome algunos comportamientos objetuales, pero no todos. Por ejemplo, Math.random() es la invocación del método random() del objeto (clase) Math. Sin embargo, Math no es una instancia de Object. Lo siguiente es inválido en Java:
Object obj = java.lang.Math;
Una clase en Java establece de manera implícita un tipo a nivel
de miembros tanto de instancia como de clase. Por simple consistencia, se
hace necesario que el tipo se indique de manera explícita particularmente
en el caso de los miembros de clase: ¿cuál es el tipo de Math
visto como objeto? Por esta razón, en Loro se evita este esquema poco
claro para fines didácticos.
Un ejemplo ilustrativo
Veamos más concretamente cómo se refleja este modelo en la estructura del lenguaje. Hagamos una interface para objetos que pueden realizar ciertas operaciones matemáticas (al estilo de java.lang.Math, aunque no hay un objeto para esto).
interface IMat
''Algunas operaciones matemáticas.''
operación pot(base: real, n: entero) -> res: real
''Eleva un número real a una potencia entera
no negativa.''
entrada
base: ''La base.''
n: ''La potencia.''
salida res: ''El resultado.''
pre { n >= 0 }
pos { res = pot' }
fin operación
operación obtRealAleatorio() -> res: real
''Obtiene un número real aleatorio mayor o igual
a 0.0 y menor que 1.0.''
salida
res: ''El valor aleatorio.''
pos { res = res' }
fin operación
... otras operaciones
fin interface // IMat
En Loro se puede crear un objeto para la interface IMat mediante la siguiente definición.
objeto mat para IMat
''Implementación básica de IMat.''
método para pot(base: real, n: entero) -> res: real
...
fin método
método para obtRealAleatorio() -> res: real
...
fin método
... otros métodos
fin objeto // mat
Basta compilar este código para que el objeto mat comience su existencia. Esto sucede también en Java pero, en Loro, mat es un verdadero objeto. De esta manera se permiten nuevas implementaciones para IMat. Una posibilidad es definir un nuevo objeto que opera como mat salvo porque ofrece una implementación diferente de una o algunas de las operaciones.
objeto mat2 extiende mat
''Implementación mejorada para IMat.''
método para pot(base: real, n: entero) -> res: real
''Estrategia dividir-y-conquistar ...''
...
fin método
fin objeto // mat2
Situación similar sucede a nivel de clases. Sin embargo, en Loro se busca hacer inicialmente un énfasis en objetos más que en clases. El Entorno integrado permitiría, por una parte, la definición directa de los objetos deseados, y por la otra, la interacción de tales objetos tanto con el usuario, como entre sí (quizá desde el Intérprete Interactivo). En un momento posterior, el profesor haría manifiesta la necesidad de lidiar con multiplicidades.