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:
- Compilación automática: El IDE compila automáticamente cuando guardas los cambios.
- Ejecución con un clic: Basta con pulsar un botón para ejecutar el programa.
- 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:
- 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);
}
}
- Compilamos:
javac Calculadora.java
- 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.