Compilación e Interpretación del código en Java

Buenas tardes, aqui el siguiente apartado sobre Java, en el que estudiaremos 2 de las herramientas que trae consigo el kit de desarrollo de java, el Compiler y el Interpreter junto a algunas de sus opciones usados en la linea de comandos.

El kit de desarrollo de Java incluye muchas utilidades para la compilación, depuración y ejecución de aplicaciones java. En esta sección detallaremos 2 utilidades del kit: El compiler y el interpreter.

-Java Compiler

Necesitaremos una aplicación de ejemplo para nuestra guía del java compiler y el interpreter.

//Inclusión en el package
package scjaexam;

public class GreetingUniverse {
    public static void main (String[] args){
        
        //Imprimimos en pantalla una frase
        System.out.println("Greetings, Universe!");
    }
}

Compilando el código fuente

El compilador de java es sólo una de las muchas herramientas del JDK. Aunque son muchas, veremos y pondremos el foco solo en los detalles del compiler y el interpreter.
La función del compiler simplemente es convertir archivos de java en bytecode para que luego el ordenador pueda interpretarlo (Interpreter).
Su uso es el siguiente:

javac [options] 

La forma más rapida para compilar una clase de Java es poner el nombre de la utilidad seguido del archivo Java que queremos compilar.
Por tanto, para compilar nuestro ejemplo anterior por linea de comandos usaríamos:

javac GreetingsUniverse.java

Esto producirá un archivo de bytecode producido con el mismo que se llamará GreetingsUniverse.class. Este archivo bytecode será movido al mismo directorio donde se encontraba el código fuente.

Compilando el código fuente con la opción -d

Puede que se desee especificar explícitamente donde se colocarán los archivos bytecode compilados. Para esto, usaremos la opción -d

javac -d classes GreetingsUniverse.java

Este comando pondrá el archivo de la clase en el directorio classes, y si el código fuente está en un package, colocará el bytecode en sus directorios relativos (Como dijimos en otra entrada, si el package se llamaba com.scjaexam, la clase se colocaría en la carpeta com, y dentro de esta, en la carpeta scjaexam)
[directorio de trabajo]classescomscjaexamtutorialGreetingsUniverse.java

Compilando el código fuente con la opción -classpath

Si deseas compilar tus aplicaciones con clases y packages definidos por tí mismo, puede que necesites decirle al JVM (Java Virtual Machine o Máquina Virtual de Java) donde mirar especificando el directorio con classpath. Esto se logra introduciendo en el compiladordonde están los packages o las clases deseadas con la opción -cp o -classpath seguido por la invocación del compilador.

javac -d classes -cp 3rdPartyCodeclasses|M. GreetingsUniverse.java

Java Interpreter

Interpretar los archivos de java es la base para la creación de aplicaciones Java. Vamos a examinar como invocar al interpreter y sus opciones en linea de comandos.

java [-options] class [args...]

GreetingsUniverse.java -> Compiler(javac) -> GreetingsUniverse.class -> Interpreter (java) -> Application GreetingsUniverse

Interpretando el bytecode

El interpreter de java es invocado con el comando java[.exe]. Es usado para interpretar el bytecode y ejecutar la aplicación.
Para invocar al interpreter en una clase que no esté contenida en un package usaríamos:

java MainClass

Interpretando el código con la opción -classpath

Cuando se interpreta el código, puedes necesitar definir donde están localizadas las clases y los package. Puedes buscar tus clases en tiempo de ejecución cuando incluyes las opciones -cp o -classpath junto al interpreter.
Si tus clases están empaquetadas, entonces puedes ejecutar tu aplicación poneindo el directorio completo, como la siguiente invocación:

java -cp classes com.scjaexam.tutorial.Mainclass

La sintaxis es la misma para -cp y -classpath, como definimos antes en el compilador.

Interpretando el bytecode con la opción -D

La opción -D en la linea de comandos te permite dar opciones a los valores de las propiedades.

java -D<name>=<value> class

El siguiente archivo de aplicación compuesto por la clase PropertiesManager muestra todas las propiedades del sistema.

package scjaexam;
import java.util.Properties;

public class PropertiesManager {
    public static void main (String[] args){
        Properties props= System.getProperties();
        // Nueva propiedad de ejemplo
        props.setProperty("new_property2", "new_value2");
        if (args[0].equals("-list_all")){
            props.list(System.out); // Lista todas las propiedades
        }else if (args[0].equals("-list_prop")){
            //Lista de valores
            System.out.println(props.getProperty(args[1]));
        } else {
            System.out.println("Usado: java PropertiesManager [-list_all]");
            System.out.println("       java PropertiesManager[-list_prop [property]]");
        }
    }
}

Vamos a ejecutar esta aplicación poniendo una nueva propiedad llamada “new_property1” con el valor “new_value1”.

java -Dnew_property1=new_value1 PropertiesManager -list_all

En la salida estandar veremos una lista de las propiedades del sistema incluyendo la nueva propiedad que hemos establecido.


new_property1=new_value1
java.specification.name=Java Platform API Specification
Opcionalmente puedes poner un valor instanciando la clase Properties y añadir una propiedad y su valor con el método setProperty

Recuperando la versión del Interpreter con la opción -version

La opción de linea de comando -version es usada con el interpreter de java para devolver la versión del JVM y salir.

Por ejemplo:

java -version

Esto retornará la versión de Java usada

java -version INVALID_ARGUMENT

Esto también retornará la versión de Java usada

java Helloworld -version

Esto ejecutará la aplicación Helloworld, pero no mostrará la versión de Java usada.

Hasta aquí la sección de hoy, donde hemos visto un ligero resumen sobre 2 comandos importantes del JDK, el compiler e interpreter. Deciros también, que la compilación y la ejecución la hacen los diferentes IDEs como netbeans o Eclipse, aunque perdemos la opción de poder pasar parametros mediante args.

Como digo siempre, cualquier colaboración sobre corrección de errores son bienvenidos.

Saludos!!