¿Cómo funciona el concepto de javac optimization? . Recordemos que javac es el compilador de Java y se encarga de compilar nuestro código “Java” en código para la maquina virtual.
Javac Optimization
En principio solemos pensar que se trata de una transformación del código directa , sin embargo no es exactamente así ya que el compilador es capaz de analizar el código y realizar optimizaciones en él. Vamos a ver un ejemplo sencillo de que cosas hace el compilador para mejorar nuestro código. El siguiente bloque de código esta lleno de constantes.
package com.arquitecturajava; public class MiClase { public static final int asistentes=10; public static final int gasto=5; public static final int gastoTotal= asistentes*gasto; public void imprimir () { if (gastoTotal>=50) { System.out.println("hemos gastado mas " +"de 50 euros"); } } }
El código compila correctamente y nos generará un fichero .class . Si revisamos el código nos podemos dar cuenta de que realmente hay mucho código sobrante que con un análisis sencillo se eliminaría. Es momento de usar un decompilador de Java y ver cual es contenido real de nuestro fichero compilado. En este caso he usado uno online JavaDecompiler que nos muestra el código que realmente contiene nuestro fichero.
/* * Decompiled with CFR 0_114. */ package com.arquitecturajava; import java.io.PrintStream; public class MiClase { public static final int asistentes = 10; public static final int gasto = 5; public static final int gastoTotal = 50; public void imprimir() { System.out.println("hemos gastado mas de 50 euros"); } }
El código para nuestra sorpresa será bastante diferente al que nosotros habíamos construido.
Es aquí donde el compilador de Java realiza sus optimizaciones y es capaz de entender que el gasto total es un valor fijo y que el if sobraba porque siempre el número será mayor de 50.
Otros artículos relacionados:
“el if sobraba porque siempre el número será mayor de 50”
50 > 50?
Acaso eso no retorna false, o me estoy perdiendo de algo que no veo.
Gracias por el aporte tenía que ser >= 🙂
Buenas Cecilio,
Modifica el ejemplo porque esta equivocado, ese “if” es un Dead Code por lo que el compilador no lo transformara en el .class.
La función imprimir quedará:
public void imprimir() {}
Saludos.
muchas gracias , ya lo he corregido
Muy buen artículo.
Para tirar ideas, estaría bueno hablar un poco sobre errores frecuentes que los desarrolladores cometemos (algunos no los corrige javac), y cómo evitarlos. Ejemplo: retornar dentro de un bloque “catch” o “finally”
Entonces, ¿crees que es mejor no complicarnos la vida y escribir más clarito el código? Yo ya llegue a esa conclusión con las operaciones ternarias que el javac optimization genera a partir de if sencillos y emborronan en muchos casos la lectura del código.
Yo prefiero la claridad ante todo , salgo casos excepcionales
Buenas Cecilio,
Buen artículo explicando de forma muy concisa que el compilador no es un interprete, sino un compilador y por tanto tiene inteligencia. No sé por qué es algo bastante extendido el creer que el compilador simplemente traduce.
Por otra parte estaría muy bien por seguir en este sentido que hablases un poco de JIT y optimizaciones “al vuelo” 🙂
Un saludo y gracias!
gracias por el aporte 🙂 , voy recogiendo ideas
Nunca imagine que el compilador de java hiciera cosas como esa xD
En Java hay mil trucos 🙂