MANUAL del LENGUAJE J--

para Zero

J-- y su documentación fueron desarrollados por Pablo López Martínez


J-- es un lenguaje de programación basado fuertemente en Java, y, por tanto, basado en clases pero generando código para una máquina virtual basada en prototipos.

CREAR UN ARCHIVO J--

Lo primero antes de empezar a programar es crear el archivo donde vamos a escribir el código fuente. Este archivo debe ser un fichero de texto y por convenio su extensión debe ser .jmm.

Aunque el compilador j-- acepta cualquier tipo de extensión, es importante utilizar la extensión .jmm para identificar de manera más rápida que ese archivo contiene código j--.

ELEMENTOS DEL LENGUAJE J--

En este apartado veremos los elementos que aporta j-- para escribir un programa. Este apartado es el soporte para el resto de los apartados.

CARACTERES DEL LENGUAJE J—

Los caracteres j-- pueden agruparse en letras, dígitos, espacios en blanco, caracteres especiales, signos de puntuación y secuencias de escape.

Letras, dígitos y carácter de subrayado

Estos caracteres son utilizados para formar los números, los identificadores y las palabras claves de j--. Son los siguientes:

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

a b c d e f g h i j k l m n o p q r s t u v w x y z

0 1 2 3 4 5 6 7 8 9

El compilador j-- trata las letras mayúsculas y minúsculas como caracteres diferentes. Por ejemplo los identificadores Pi y PI son diferentes.

Espacios en blanco

Los caracteres espacio en blanco, tabulador horizontal, tabulador vertical, avance de página y nueva línea, son caracteres denominados espacios en blanco, porque la labor que desempeñan es la misma que la del espacio en blanco: actuar como separadores entre los elementos de un programa, lo cual permite escribir programas más legibles. Por ejemplo, el siguiente código:

class persona {public void doIt () {System.console.write (“hola”) ;}}

puede escribirse de una forma más legible así:

class persona {

public void doIt ()

{

System.console.write (“Hola”);

}

}

Los espacios en blanco en exceso son ignorados por el compilador. Según esto, el código siguiente se comporta exactamente igual que el anterior:

class persona {

void doIt ( ){

System.console.write ( “Hola” );

}

}

Caracteres especiales y signos de puntuación

Este grupo de caracteres se utiliza de diferentes formas; por ejemplo, para especificar una determinada operación aritmética, lógica o de relación. Son los siguientes:

, . ; : “ ( ) { } < ! | / + # % & * - = >

Secuencias de escape

Cualquier carácter de los anteriores puede también ser representado por una sentencia de escape. Una secuencia de escape está formada por el carácter \ seguido de una letra o de una combinación de dígitos. Son utilizadas para acciones como nueva línea y tabulador.

El lenguaje j-- tiene predefinidas las siguientes secuencias de escape:

Secuencia

Nombre

\n

\t

Ir al principio de la siguiente línea.

Tabulador horizontal.

TIPOS DE DATOS

Veamos la siguiente operación aritmética:

dato1 = 20;

dato2 = 10;

resultado = dato1 + dato2;

Para que el compilador j-- reconozca esta operación es necesario especificar previamente el tipo de cada uno de los operandos que intervienen en la misma, así como el tipo del resultado. Para ello, escribiremos una línea como la siguiente:

int dato1, dato2, resultado;

dato1 = 20;

dato2 = 10;

resultado = dato1 + dato2;

La declaración anterior le indica al compilador j-- que dato1, dato2 y resultado son de tipo entero (int). Observe que se puede declarar más de una variable del mismo tipo utilizando una lista separada por comas.

Tipos primitivos

Se les llama primitivos porque están definidos por el compilador. Hay tres tipos primitivos de datos:

Tipo entero: int

Tipo real: float

Tipo booleano: boolean

int

El tipo int se utiliza para declarar datos enteros. El siguiente ejemplo declara e inicia dos variables de tipo int:

int a = 2999;

int b = -439;

float

El tipo float se utiliza para declarar datos de tipo real. El siguiente ejemplo declara e inicia dos variables float:

float a = 3.1516;

float b = -0.317;

boolean

El tipo boolean se utiliza para declarar datos que indican si algo es verdadero o falso. El siguiente ejemplo declara e inicia dos variables boolean:

boolean a = true;

boolean b = false;

LITERALES

Un literal es la expresión de un valor de un tipo primitivo, o bien de una cadena de caracteres (conjunto de caracteres entre comillas dobles). Por ejemplo, son literales: 5, 3.14, true y “hola”. En realidad son valores constantes.

Según lo expuesto, un literal en j-- puede ser: un entero, un real, un booleano y una cadena de caracteres.

Literales enteros

En el lenguaje j-- un literal entero puede llevar signo, en general, el signo + es opcional si el valor es positivo y el signo – estará presente siempre que el valor sea negativo. La sintaxis para especificar un literal entero es:

{[+] | [-]} literal_entero

Literales reales

Un literal real está formado por una parte entera, seguido por un punto decimal, y una parte fraccionaria. El lenguaje j-- no permite utilizar la notación científica.

{[+] | [-]} parte_entera.parte_fraccionaria

Literales de cadenas de caracteres

Un literal de cadena de caracteres es una secuencia de caracteres encerrados entre comillas dobles. Por ejemplo:

Esto es una cadena de caracteres.”

3.1415926”

“” /*Cadena vacía*/

Literales booleanos

Existen dos literales booleanos:

true: indica que algo es verdadero.

false: indica que algo es falso.

IDENTIFICADORES

Los identificadores son nombres dados a clases, atributos, métodos y variables de un programa. La sintaxis para formar un identificador es la siguiente:

{letra} [{letra|digito|_}]…

lo cual indica que un identificador consta de uno o más caracteres y que el primer carácter debe ser un letra. No puede comenzar por un dígito ni por un carácter de subrayado ni puede contener caracteres especiales.

Las letras pueden ser mayúsculas o minúsculas. Para j-- una letra mayúscula es un carácter diferente a esa misma letra minúscula. Por ejemplo, los identificadores Suma, suma y SUMA son diferentes.

Los identificadores pueden tener cualquier número de caracteres pero solamente los 99 caracteres primeros son significativos. Esto quiere decir que un identificador es distinto de otro cuando difieren al menos en uno de los 99 primeros caracteres significativos.

Ejemplos de identificadores:

Suma

Calculo_Numeros_Primos

ordenar

VisualizarDatos

PALABRAS CLAVE

Las palabras claves son identificadores predefinidos que tienen significado especial para el compilador j--. Por lo tanto, un identificador definido por el usuario, no puede tener el mismo nombre que una palabra clave. El lenguaje j-- tiene las siguientes palabras clave:

boolean false public

break float return

catch for throw

class if true

continue import try

do int void

else new while

extends private

Las palabras clave deben escribirse siempre en minúsculas, como están.

COMENTARIOS

Un comentario es un mensaje a cualquiera que lea el código fuente. Añadiendo comentarios se hace más fácil la compresión de un programa. La finalidad de los comentarios es explicar el código fuente. J-- soporta dos tipos de comentarios:

/*

La ejecución de un programa j-- empieza en el método doIt

definido dentro de la clase principal. Para indicar que una clase es principal esta debe tener el mismo nombre que el fichero de

código fuente y derivar de la clase ConsoleApplication.

*/

// Aquí empieza un programa

DECLARACIÓN DE UNA VARIABLE

Una variable representa un espacio de memoria para almacenar un valor de un determinado tipo. El valor de una variable puede cambiar durante la ejecución de un programa. Para utilizar una variable dentro de un método de un programa, primero hay que declararla dentro del mismo. Una variable solo se puede declarar al principio de un método y nunca dentro de un bloque. La declaración de un variable consiste en enunciar el nombre de la misma y asociarle un tipo:

tipo identificador[, identificador]…

En el ejemplo siguiente se declaran e inician tres variables: una de tipo int, otra float y otra boolean.

int i = 0;

float f = 3.56;

boolean d = false;

Una variable puede ser inicializada mediante un literal o mediante una expresión.

EXPRESIONES NÚMERICAS

Una expresión numérica es un conjunto de operandos unidos mediante operadores para especificar una operación determinada. Ejemplo:

a + 1

suma + c

cantidad * precio

OPERADORES

Los operadores son símbolos que indican cómo son manipulados los datos. Se pueden clasificar en los siguientes grupos: aritméticos, relacionales, lógicos, unitarios, de asignación.

Operadores aritméticos

Los operadores aritméticos los utilizamos para realizar operaciones matemáticas y son los siguientes:

Operador

Operación

+

-

*

/

%

Suma. Los operandos pueden ser enteros o reales.

Resta. Los operandos pueden ser enteros o reales.

Multiplicación. Los operandos pueden ser enteros o reales.

División. Los operandos pueden ser enteros o reales. Si ambos operandos son enteros el resultado es entero sino el resultado es real.

Módulo o resto. Los operandos deben ser enteros.

El siguiente ejemplo muestra cómo utilizar estos operadores. Como se ve en le ejemplo primero debemos declarar las variables y después se realizan las operaciones deseadas con ellas.

int a = 10, b = 3, c;

float x = 2.0, y;

y = x + a; //El resultado es 12.0 de tipo float.

c = a / b; //El resultado es 3 de tipo int.

c = a % b; //El resultado es 1 de tipo int.

y = a / b; //El resultado es 3 de tipo int. Se convierte a float

//para asignarlo a y.

Cuando en una operación aritmética los operandos son diferentes uno de tipo int y otro de tipo float, el de tipo int es convertido a tipo float.

En una asignación si el resultado obtenido es float y la variable a la que se le asigna es int se produce un error, solicitando que se realice la conversión adecuada por pérdida de precisión.

Operadores de relación

Los operadores de relación o de comparación permiten evaluar la igualdad y la magnitud. El resultado de una operación de relación es un valor booleano verdadero o falso (true o false). Los operadores de relación son los siguientes:

Operador

Operación

<

>

<=

>=

!=

==

¿Primer operando menor que el segundo? Solo tipos de datos enteros y reales.

¿Primer operando mayor que el segundo? Solo tipos de datos enteros y reales.

¿Primer operando menor o igual que el segundo? Solo tipos de datos enteros y reales.

¿Primer operando mayor o igual que el segundo? Solo tipos de datos enteros y reales.

¿Primer operando distinto que el segundo? Cualquier tipo de datos.

¿Primer operando igual que el segundo? Cualquier tipo de datos.

Los operadores <, >, <=, >= sólo se pueden utilizar con tipos de datos enteros y reales.

Los operadores ==, != se pueden utilizar con cualquier tipo de datos.

A continuación se muestra un ejemplo del uso de los operadores relacionales:

boolean r;

int x = 10, y=0;

r = x == y; //r = false; porque x no es igual a y.

r = x > y; //r = true; porque x es mayor que y.

r = x != y; //r= true; porque x es distinto de y.

Operadores lógicos

El resultado de una operación lógica es un valor booleano verdadero o falso (true o false). Las expresiones que dan como resultado valores booleanos pueden combinarse para formar expresiones booleanas utilizando los operadores lógicos indicados a continuación. Los operandos deben ser expresiones que den un resultado verdadero o falso.

Los operadores lógicos son los siguientes:

Operador

Operación

&&

| |

!

AND. Da como resultado verdadero si al evaluar cada uno de los operandos el resultado es verdadero. Si uno de ellos es falso, el resultado es falso.

OR. El resultado es falso si al evaluar cada uno de los operandos el resultado es falso. Si uno de ellos es verdadero, el resultado es verdadero.

NOT. El resultado de aplicar este operador es falso si al evaluar su operando el resultado es verdadero, y verdadero en caso contrario.

El resultado de una operación lógica es de tipo boolean.

A continuación se muestra un ejemplo del uso de los operadores lógicos.

int p = 10, q = 0;

boolean r;

r = (p != 0) && (q != 0); //r = false;

Los operandos del operador && son: p!=0 y q!=0. El resultado de la expresión p!=0 es verdadero porque p vale 10 y el q!=0 es falso porque q es 0. Por lo tanto, el resultado de verdadero && falso es falso.

Operadores unitarios

Los operadores unitarios se aplican a un solo operando y son los siguientes: !, -, ++, --. El operador ! ya lo hemos visto y los operadores ++ y -- los veremos con los operadores de asignación.

Operador

Operación

-

Cambia de signo al operando. El operando debe ser entero o real.

El siguiente ejemplo muestra cómo utilizar el operador anterior:

int a = 2, b = 0;

b = -a; //resultado b = -2;

Operadores de asignación

El resultado de una operación de asignación es el valor almacenado en el operando izquierdo, lógicamente después de que la asignación se ha realizado. Incluimos aquí los operadores de incremento y decremento porque implícitamente estos operadores realizan una asignación sobre su operando.

Operador

Operación

++

--

=

*=

/=

%=

+=

-=

&=

|=

Incremento. Solo se pueden usar como sufijo de una variable.

Decremento. Solo se puede usar como sufijo de una variable.

Asignación simple.

Multiplicación más asignación.

División más asignación.

Módulo más asignación.

Suma más asignación.

Resta más asignación.

Operación AND más asignación.

Operación OR más asignación.

A continuación se muestran algunos ejemplos con estos operadores:

int x = 0, n = 10, i = 1;

n++; // Incrementa el valor de n en 1.

n--; // Decrementa el valor de n en 1.

x = n++; // Asigna n a x y incrementa n en 1.

x = n--; // Asigna n a x y decrementa n en 1.

i += 2; // Realiza la operación i = i + 2;

x *= n – 3; // Realiza la operación x = x * (n - 3).

El operador de incremento incrementa su operando siempre en una unidad y solamente se puede usar como sufijo. Ídem para el operador de decremento.

Operadores de cadenas

El operador + también se puede usar si los operandos son cadenas de caracteres y lo que hace es concatenarlas.

Otros operadores

Operador Coma

La coma se utiliza para encadenar varias operaciones, las cuales se ejecutarán de izquierda a derecha. Su uso más común es en la sentencia for que veremos más adelante.

Ejemplos:

for (a = 256, b = 1;b < 512; a/=2, b*=2) {

// más cosas ...

}

Operador new

El operador new sirve para crear una copia de un objeto ya existente en el programa o en una librería. En Java no se crean copias sino que se crea una instancia de una clase, en j-- cuando creamos una clase estamos creando un objeto listo para usarse y si necesitamos otro simplemente tenemos que utilizar el operador new para crear una copia.

Ejemplo:

Vector x;

x = new Vector ( );

Con esta sentencia creamos una copia del objeto Vector que se encuentra en la librería estándar de j--.

PRIORIDAD Y ORDEN DE EVALUACIÓN

Cuando escribimos una expresión como la siguiente, f = a + b * c / d, es porque conocemos perfectamente el orden en el que se ejecutan las operaciones. Si este orden no fuera el que esperamos, tendríamos que utilizar paréntesis para modificarlo, ya que una expresión entre paréntesis, siempre se evalúa primero.

Esto quiere decir que el compilador j—atribuye a cada operador un nivel de prioridad; de esta forma puede resolver qué operación se ejecuta antes que otra en una expresión. Esta prioridad puede ser modificada utilizando paréntesis. Los paréntesis tienen mayor prioridad y son evaluados de más internos a más externos.

La tabla que se presenta a continuación, resume las reglas de prioridad y asociatividad de todos los operadores. Las línea se han colocado de mayor a menor prioridad. Los operadores escritos sobre una misma línea tienen la misma prioridad.

Operador

Asociatividad

( )

- ! ++ --

* / %

+ -

== !=

&&

||

= *= /= %= += -= &= |=

izquierda a derecha

derecha a izquierda

izquierda a derecha

izquierda a derecha

izquierda a derecha

izquierda a derecha

izquierda a derecha

derecha a izquierda

CONVERSIÓN ENTRE TIPOS DE DATOS

La única conversión que hace implícitamente el compilador j-- es de int a float. Cuando en una expresión existen operandos de tipo float e int el compilador convierte directamente los operandos de tipo int a tipo float.

En una asignación, si la variable a la que se asigna es de tipo float y el valor asignado es de tipo int, el valor asignado es convertido automáticamente a float.

SENTENCIAS DE CONTROL

Las sentencias de control nos sirven para crear repeticiones y decisiones. Los tipos de sentencias de control son:

SENTENCIA IF

Una sentencia if permite tomar decisiones para ejecutar una acción u otra, basándose en el resultado verdadero o falso de un expresión. Una sentencia if puede ir acompañado de la sentencia else o solo. La sentencia else significa que si no se cumple la condición de la sentencia if se ejecuta la sentencia else. La sentencia if se puede anidar.

A continuación se muestran ejemplos de sentencias if:

    if (condicion1) {

        if (condicion2)

            sentencia1;

        sentencia2;

    }

    else {

        if (condicion3) {

            sentencia2.2;

            sentencia2.3;

        }

        else expresion1;

    }

En el ejemplo anterior condición es una expresión booleana, sentencia1 es una sentencia simple y sentencia2.2, sentencia2.3 representan una sentencia compuesta que debe ir entre { }.

SENTENCIA WHILE

Ejecuta una sentencia, simple o compuesta, cero o más veces, dependiendo del valor de una expresión booleana. Su sintaxis es la siguiente:

while (condición)

    sentencia;

En la sentencia anterior condición es cualquier expresión booleana y sentencia es una sentencia simple o compuesta.

Se permite el anidamiento de bucles while, for o do unos dentro de otros.

SENTENCIA DO…WHILE

Un bucle do…while ejecuta una sentencia simple o compuesta, una o más veces dependiendo del valor de una expresión. Su sintaxis es la siguiente:

do

    sentencia;

while (condición);

En la sentencia anterior condición es cualquier expresión booleana y sentencia es una sentencia simple o compuesta. La estructura do…while finaliza con un punto y coma.

Cuando se utiliza una estructura do…while el bloque de sentencias se ejecuta al menos una vez, porque la condición se evalúa al final, por lo que se suele utilizar para procesar la selección de menús.

SENTENCIA FOR

La sentencia for permite ejecutar una sentencia simple o compuesta, repetidamente un número de veces conocido. Su sintaxis es la siguiente:

for ([v1 = e1 [, v2 = e2]…]; [condición]; [iteración])

En la sentencia anterior:

SENTENCIAS BREAK Y CONTINUE

La sentencia break se utiliza para finalizar la ejecución de un bucle while, do o for. Cuando los bucles están anidados, la sentencia break solamente finaliza la ejecución del bucle donde esté incluida.

int x, i;

for (i = 0; i < 10; i++) {

    int x = 0;

    while (x < 5) {

            System.console.write ( “El valor de x es ”+ x.toString() );

            if (i == 3)

                break;

            x++;

    }

}

La sentencia continue obliga a ejecutar la siguiente iteración del bucle while, do o for.

    int i;

    for (i = 0; i < 10; i++) {

        if (i == 3)

            continue;

        System.console.write(“El valor de i es: “+ i.toString());

    }

SENTENCIAS TRY…CATCH

Si durante la ejecución de un programa ocurre un error que impide su continuación (división por cero,…), la máquina virtual ZERO lanza una excepción que hace que se visualice un mensaje acerca de lo ocurrido y se detenga la ejecución del programa.

Si no deseamos que esto ocurra, el programa debe capturar la excepción y tratarla él mismo. Para ello se encierra el bloque de sentencias que pueden lanzar la excepción en un bloque try, y se proporciona un bloque catch que se encarga de gestionarla.

La sintaxis de este tipo de sentencias es la siguiente:

try{

    //bloque de código

}

catch (TipoExcepcion ex){

    //gestor de excepciones para TipoExcepcion.

}

Sentencia Throw

Utilizando la sentencia throw es posible hacer que un programa lance una excepción de manera explícita. El flujo de la ejecución se detiene inmediatamente después de la sentencia throw y cualquier sentencia posterior no se ejecuta. La forma general de esta sentencia es la siguiente:

        throw TipoExcepcion;

ESTRUCTURA DE UN PROGRAMA

Toda aplicación escrita en j-- contiene al menos una clase y esta clase debe contener al menos un método llamado doIt. Si lo que vamos a construir es una librería no es necesario que exista el método doIt.

Al principio del archivo en código j-- podemos hacer uso de librerías de código j-- utilizando la sentencia import.

LA SENTENCIA IMPORT

La sentencia import se utiliza al principio de un fichero en código j-- y sirve para que un programa pueda hacer uso de una librería externa de objetos j--. Por defecto siempre se importa la librería estándar IntStdLib.def.

La sintaxis de la sentencia import es:

#import <nombre_libreria.def>

CLASES

Una clase es un tipo definido por el usuario que describe los atributos y métodos que contendrá el objeto.

Una clase es principal, cuando su nombre coincide con el nombre del archivo de código j--. Si el archivo es una aplicación está clase deberá derivar obligatoriamente de ConsoleApplication y contener un método doIt que iniciará la ejecución de la aplicación.

Herencia

Una clase por defecto hereda siempre de Object, si además queremos que herede de otra debemos utilizar extends. Como vimos anteriormente la clase principal de la aplicación debe heredar siempre de ConsoleApplication.

Ejemplo:

    class vehiculo{

        int numeroRuedas;

        String tipoCombustible;

    }

    class coche extends vehiculo{

        String color;

    }

    class camion extends vehiculo{

        int cargaMaxima;

    }

Como se observa en el anterior ejemplo la clase más arriba en la herencia siempre debe ser la primera en escribirse.

Atributos

Los atributos definen el estado de un determinado objeto.

Un atributo puede ser inicializado si es del tipo int, float o String, en caso de no inicializarse los atributos con tipos anteriores, el compilador inicializa automáticamente los atributos de tipo int a 0, los de tipo float a 0.0 y los de tipo String a “”(cadena vacía).

Al resto de los atributos se les asigna un enlace al objeto de su tipo, esto se hace porque siempre existe un objeto de cada tipo y no es necesario crear el objeto antes de usarse.

Ejemplo:

    class prueba{

        Vector x;

        void doIt(){

            int num=3;

            x.add(num);

        }

    }

Como se muestra en el ejemplo anterior el atributo de tipo Vector x no seria necesario inicializarlo porque ya contiene una referencia al objeto Vector y por lo tanto ya se podría enviar mensajes sin problema.

Métodos

Los métodos son las operaciones que definen el comportamiento de un objeto.

La sintaxis de declaración de un método es la siguiente:

Tipo_Retorno nombre_Metodo ( Parametros){

    Sentencias;

}

El tipo retorno se refiere al tipo de dato que devolverá el método, este tipo puede ser cualquiera de los existentes y en caso de que no devuelva nada el tipo será void.

Parametros indica los argumentos que se pasaran al método cuando se haga una llamada. Un parametro debe tener la siguiente forma:

Tipo_Parametro nombreParametro,…

Un método puede contener 0 o más parametros, si contiene más de un parametro estos se separan por coma.

La clase principal contiene siempre el método principal doIt, este método debe tener su tipo retorno siempre especificado a void y no recibir parametros.

Un método contiene sentencias, existen dos tipos de sentencias:

Control de acceso a los miembros de una clase

Para controlar el acceso a los miembros de una clase, j-- proporciona las palabras clave private y public, denominados modificadores de acceso, aunque también se pueden omitir.

Los modificadores de acceso se utilizan para indicar el tipo de acceso permitido a cada miembro (atributo o método) de una clase.

Acceso público

Cuando se omite o se usa la palabra clave public, indica que ese miembro es accesible para cualquier otra clase.

Acceso privado

Cuando se utiliza la palabra clave private, indica que ese miembro sólo es accesible por su misma clase.

En java también se acepta protected pero en el lenguaje j-- protected no es aceptado. El lenguaje j-- solo acepta public y private.

LIBRERÍA ESTÁNDAR

A continuación vamos a mostrar algunos objetos y sus miembros contenidos en la librería estándar y que son interesantes para la creación de un programa en j--.

Sus métodos son los siguientes:

Sus atributos son los siguientes:

Sus métodos son los siguientes:

Sus atributos son:

Sus métodos son los siguientes:

Sus métodos son los siguientes:

Sus métodos son los siguientes:

Sus métodos son:

Sus métodos son los siguientes:

Sus métodos son los siguientes:

Sus métodos son:

De exception heredan las siguientes excepciones:

¿CÓMO COMPILAR Y EJECUTAR UN PROGRAMA?

Una vez visto como debemos crear un programa, el siguiente paso es ver como podemos compilarlo y ejecutarlo.

Vamos a tomar como ejemplo e siguiente programa que pide el nombre por pantalla y saluda.

El código estará guardado en un fichero con nombre saludo.jmm.

class saludo extends ConsoleApplication{

    void doIt(){

        String x;

        System.console.write(“Introduce tu nombre:”);

        x = System.console.read();

        System.console.write(“Hola “+ x);

        System.console.lf();

    }

}

Una vez creado el archivo de código fuente procedemos a compilarlo:

Como vemos en la imagen anterior el comando para compilar el programa es j-- saludo.jmm y comprobamos que no se produzca ningún error.

En la siguiente imagen mostramos lo que sucedería si no definimos la variable String x.

Como vemos en la imagen al no declarar la variable String x se producen dos errores de identificador no encontrado, y también se muestra la línea en la que se produce.

Una vez compilado el programa sin errores vamos a ejecutarlo, el primer paso que debemos dar es:

Vemos que el comando za genera un archivo con el nombre saludo.zbj. Este archivo contiene los objetos necesarios para ejecutar la aplicación sobre la máquina virtual ZERO.

Estos tres pasos pueden reducirse a tan solo dos, si se utiliza el lanzador jmc. Este programa llama al compilador de j-- y después ensambla el resultado con za.

Al empezar la ejecución del programa, lo primero que nos pide es que introduzcamos el nombre. Por lo que introducimos el nombre y pulsamos INTRO.