Ir al contenido principal

Compilación y ejecución de programas Java

Introducción

Una vez que has escrito tu código Java, necesitas transformarlo en algo que la computadora pueda ejecutar. Este proceso consta de dos pasos fundamentales: la compilación y la ejecución. La compilación convierte tu código fuente (texto legible para humanos) en bytecode (instrucciones comprensibles para la máquina virtual de Java), mientras que la ejecución consiste en interpretar ese bytecode para realizar las operaciones deseadas. En este artículo, exploraremos estos procesos cruciales que dan vida a nuestros programas Java.

El proceso de compilación

¿Qué es la compilación?

La compilación es el proceso mediante el cual el código fuente Java (archivos .java) se traduce a bytecode (archivos .class). Este paso intermedio es una de las características más poderosas de Java, ya que permite la portabilidad del código entre diferentes sistemas operativos.

El compilador de Java (javac)

El JDK incluye una herramienta llamada javac (Java Compiler), que se encarga de realizar la compilación:

// Imaginemos que tenemos este código en un archivo llamado Ejemplo.java
public class Ejemplo {
    public static void main(String[] args) {
        System.out.println("¡Este es un ejemplo de compilación!");
    }
}

Para compilar este archivo, abrimos una terminal o línea de comandos y ejecutamos:

javac Ejemplo.java

Si el código no contiene errores, el compilador generará un archivo llamado Ejemplo.class, que contiene el bytecode correspondiente a nuestro programa. Si hay errores, el compilador mostrará mensajes indicando los problemas encontrados.

Errores de compilación comunes

Durante la compilación pueden surgir diferentes tipos de errores:

  • Errores sintácticos: faltan puntos y coma, llaves mal balanceadas, etc.
  • Errores de tipos: intentar asignar valores incompatibles.
  • Errores de nombres: uso de variables o métodos no declarados.

Ejemplo de error sintáctico:

public class ErrorSintactico {
    public static void main(String[] args) {
        System.out.println("Falta un punto y coma")
    }
}

Al compilar este código, obtendremos un mensaje como:

ErrorSintactico.java:3: error: ';' expected
        System.out.println("Falta un punto y coma")
                                                  ^
1 error

El proceso de ejecución

La Máquina Virtual de Java (JVM)

Una vez compilado el programa, podemos ejecutarlo utilizando la Máquina Virtual de Java (JVM), incluida en el JRE (Java Runtime Environment). La JVM interpreta el bytecode y lo traduce a instrucciones específicas del sistema operativo donde se está ejecutando.

Ejecución con el comando java

Para ejecutar nuestro programa compilado, utilizamos el comando java seguido del nombre de la clase que contiene el método main:

java Ejemplo

Nota importante: no incluimos la extensión .class al ejecutar el programa.

El método main como punto de entrada

Todos los programas Java que se pueden ejecutar directamente deben tener un método main con la siguiente estructura:

public static void main(String[] args)

Este método es el punto de entrada que la JVM buscará para comenzar la ejecución del programa.

Compilación y ejecución en un solo paso

Para programas pequeños o durante el desarrollo, Java ofrece desde su versión 11 una forma de compilar y ejecutar en un solo paso:

java Ejemplo.java

Este comando compila temporalmente el archivo y lo ejecuta inmediatamente, aunque no genera el archivo .class permanente.

Opciones útiles de compilación y ejecución

Opciones del compilador javac

  • -d directorio: especifica dónde guardar los archivos .class generados.
  • -cp o -classpath: establece la ruta de búsqueda para clases ya compiladas.
  • -verbose: muestra información detallada sobre el proceso de compilación.

Ejemplo:

javac -d clases -verbose Ejemplo.java

Opciones del intérprete java

  • -cp o -classpath: establece la ruta de búsqueda para clases compiladas.
  • -Dpropiedad=valor: define propiedades del sistema.
  • -Xmx: define el tamaño máximo de memoria para la JVM.

Ejemplo:

java -cp clases -Dmipropiedad=valor Ejemplo

Estructura de directorios y paquetes

En proyectos más grandes, organizamos nuestras clases en paquetes. La estructura de directorios debe coincidir con la estructura de paquetes:

// Archivo: src/com/miempresa/aplicacion/MiClase.java
package com.miempresa.aplicacion;

public class MiClase {
    public static void main(String[] args) {
        System.out.println("Clase en un paquete");
    }
}

Para compilar:

javac -d clases src/com/miempresa/aplicacion/MiClase.java

Para ejecutar:

java -cp clases com.miempresa.aplicacion.MiClase

Uso de herramientas IDE

Los entornos de desarrollo integrado (IDE) como Eclipse, IntelliJ IDEA o NetBeans simplifican este proceso:

  1. Compilación automática: El IDE compila automáticamente cuando guardas los cambios.
  2. Ejecución con un clic: Basta con pulsar un botón para ejecutar el programa.
  3. Detección de errores en tiempo real: Los errores se marcan mientras escribes.

Sin embargo, comprender el proceso manual es fundamental para entender lo que ocurre tras bambalinas y para trabajar en entornos sin IDE.

Ejemplo práctico completo

Veamos un ejemplo completo, desde la escritura hasta la ejecución:

  1. Creamos un archivo Calculadora.java:
public class Calculadora {
    public static void main(String[] args) {
        // Comprobamos si se han proporcionado argumentos
        if (args.length != 3) {
            System.out.println("Uso: java Calculadora número1 operación número2");
            System.out.println("Operaciones disponibles: suma, resta, multiplica, divide");
            return;
        }
        
        // Convertimos los argumentos a los tipos adecuados
        double num1 = Double.parseDouble(args[0]);
        String operacion = args[1];
        double num2 = Double.parseDouble(args[2]);
        double resultado = 0;
        
        // Realizamos la operación solicitada
        switch (operacion) {
            case "suma":
                resultado = num1 + num2;
                break;
            case "resta":
                resultado = num1 - num2;
                break;
            case "multiplica":
                resultado = num1 * num2;
                break;
            case "divide":
                if (num2 != 0) {
                    resultado = num1 / num2;
                } else {
                    System.out.println("Error: No se puede dividir por cero");
                    return;
                }
                break;
            default:
                System.out.println("Operación no reconocida");
                return;
        }
        
        System.out.println("El resultado de " + num1 + " " + operacion + " " + num2 + " es: " + resultado);
    }
}
  1. Compilamos:
javac Calculadora.java
  1. Ejecutamos (por ejemplo, para sumar 5 y 3):
java Calculadora 5 suma 3

Salida:

El resultado de 5.0 suma 3.0 es: 8.0

Resumen

La compilación y ejecución son procesos fundamentales en el desarrollo con Java. La compilación convierte nuestro código fuente en bytecode mediante el comando javac, mientras que la ejecución interpreta ese bytecode a través de la JVM con el comando java. Este enfoque de dos pasos es la base de la portabilidad y seguridad de Java, permitiendo que el mismo programa funcione en diferentes plataformas. A medida que avancemos en el tutorial, construiremos sobre estos conocimientos para crear aplicaciones Java más complejas y potentes.