Zero es una máquina virtual orientada a objetos y basada en prototipos. Por ahora, no se dispone de un lenguaje, si bien es programable mediante un macrosensamblador, que proporciona casi todos los elementos necesarios presentes en un lenguaje. Necesariamente, el tipo de programación no se corresponde con la de C++, que es un lenguaje de programación híbrido, que permite tanto programación tradicional, dividida en rutinas, como programación orientada a objetos. La orientación a objetos ofrecida en Zero no es como la de C++, sino la de otros lenguajes como Self. Se crean directamente objetos (prototipos), los cuales se copian, para crear las objetos-instancia que realmente se emplearán. El macroensamblador, así como otros muchos lenguajes basados en prototipos, es débilmente tipado. Esto quiere decir que no se hacen comprobaciones de tipos, como en C++ o Java.
Hay disponible un lenguaje de alto nivel llamado Prowl, un macroensamblador y un ensamblador (en orden de mayor nivel de abstracción a un menor nivel) que generan código a ser consumido por la máquina virtual.
Los programas para Prowl, para macroensamblador y la propia máquina virtual Zero, necesarios para compilar y ejecutar los objetos creados, más la documentación. Hay binarios para Linux y para Windows.
El programa/objeto "¡Hola, Mundo!" en Prowl
(guardado como HolaMundo.pwl
):
// Programa Hola, Mundo
object HolaMundo : ConsoleApplication
method + doIt()
{
System.console.write(
"¡Hola, Mundo!" );
System.console.lf();
return;
}
endObject
$ prowl HolaMundo.pwl
$ za HolaMundo
El archivo debe llamarse de la misma forma que el objeto principal que
será ejecutado (en este ejemplo sólo hay un objeto, pero el
objeto principal será el que contiene el método doIt()
).
La primera orden, con el programa prowl
, se encarga de
traducir el código fuente a código ensamblador válido de la
máquina virtual Zero, listo para ser consumido por za
,
estando ya preparado el código objeto o bytecode
preparado para la ejecución.
$ zvm HolaMundo
En este caso se trata de un objeto que deriva de ConsoleApplication,
por lo que la máquina virtual buscará automáticamente el
método doIt()
. Si no deriva de ese objeto, entonces
deberá especificarse el método correcto. También es
posible, de ser necesario, especificar referencias a objetos como
argumentos.
object Punto
attribute + x = 0;
attribute + y = 0;
method + ponCoordenadas(a, b)
{
x = a;
y = b;
return;
}
endObject
object PruebaPunto : ConsoleApplication
method + doIt()
{
reference miPunto = Punto.copy( ""
);
miPunto.ponCoordenadas( 100, 150 );
return;
}
endObject
Punto
, y no la información de la del objeto
que se busca. Cambia el parámetro de copy()
para que
el identificador sea más amigable.toString()
de Object
. Este método debe ser sobreescrito en Punto
,
para que visualice las coordenadas.Punto
como TraitsPunto
,
y crea un nuevo objeto Punto
con sólo los atributos x
e y
. Observarás que el código funciona
igualmente ... ¿qué es lo que ha variado?
// Implementa un ejemplo de polimorfismo
// "Mamifero" deriva de "Object", pero eso ya se
asume por defecto
object Mamifero
attribute + numPatas = 4;
attribute + color = "negro";
method + esOmnivoro()
{
return False;
}
method + esSoloCarnivoro()
{
return False;
}
method + esSoloVegetariano()
{
return False;
}
method + devColor()
{
return color;
}
method + devNumPatas()
{
return numPatas;
}
endObject // Mamifero
object Vaca : Mamifero
attribute + color =
"marrón";
method + esSoloVegetariano()
{
return True;
}
endObject // Vaca
object Ornitorrinco : Mamifero
method + esOmnivoro()
{
return True;
}
endObject // Ornitorrinco
object PruebaMamiferos : ConsoleApplication
method + alimentacion(x)
{
if ( x isInstanceOf
Mamifero ) {
if (
x.esOmnivoro() ) {
System.console.write(
x
);
System.console.write(
" es omnivoro" );
}
else {
System.console.write( x );
System.console.write(",
no es omnivoro");
}
} else {
System.console.write( x );
System.console.write( ", no es mamifero" );
}
System.console.lf();
return;
}
method + doIt()
{
this.alimentacion( Vaca );
this.alimentacion(
Ornitorrinco );
this.alimentacion( 7789 );
this.alimentacion(
"¡Hola!" );
return;
}
endObject // PruebaMamiferos