Sobre invokeDynamic en Java 7

Nota Esta es una sobresimplificación, para más detalles ver el link al final.

Una cosa que viene en Java 7 esa si seguro es la instrucción   que si bien no será posible usar desde Java mismo, dará un boost sorprendente para todos los lenguajes dinámicos que corren sobre la JVM ( cuando sean portados claro ).

A manera de resumen y como una sobresimplificación ( que conste ):

Cuando Groovy, JRuby, Jython y otros lenguajes con tipeo dinámico invocan un método sobre la JVM hacen algo como esto:

 

Invocan al método   pues... dinámicamente, al vuelo, siempre y cuando el objeto sea de una clase que tenga ese método. Si no lo tiene pues nomás truenan en runtime y ya.

La forma más fácil de entender como se invoca ese métod dinámicamente es pensar en algo similar a lo siguiente en Java:

 

Obvio, lo hacen de maneras mucho más sofisticadas y que son mucho más rápidas, pero al final deben de apoyarse en la "reflexión" para saber invocar un método de un objeto cuya clase se desconoce.

Pues bien, la razón por la cual se debe de hacer así, es porque la JVM habiendo sido creada para un lenguaje como Java con tipeo estático no consideró una instrucción a nivel de bytecode para llamar métodos al vuelo.

Actualmente ( prior to Java 7 ) se tienen:

invokevirtual - Para llamar un método de algún objeto.
invokeinterface - Para llamar el método de una interfaz ( el objeto debe de implementar la interfaz )
invokestatic - Para llamar un método de clase
invokespecial - Para llamar constructores, super, y cosas así.

Con Java 7 se agrega una nueva instrucción invokeDynamic que permitirá precisamente llamar un método al vuelo.

Entonces en vez que de el bytecode contenga las instrucciones necesarias para obtener el método e invocarlo por reflexión se utiliza esta nueva instrucción en vez de eso y se mejora tremendamente el desempeño.

Los lenguajes con tipeo estático como Java o Scala no necesitan esto ( bueno Scala si,pero solo donde utiliza tipeo estructurado) pues saben desde la compilación si el objeto puede o no responder al mensaje, si no puede el programa no compila.

El trabajo para portar los varios lenguajes de programación para que utilicen esta instrucción en vez de reflexión empezó ya hace varios meses.

Esto es solo una breve nota sobre invokeDynamic, para más información:

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

prefiero performance en reflexion

Seria mejor que hiciera optimizaciones sobre Reflect para Java7. Suena interesante esto del InvokeDynamic pero sin lugar a dudas le veo mas PODER a utilizar directamente la reflexion. Por lo que entiendo esta seria la forma mas "eficiente" de invocar un metodo dinamicamente y sin embargo lo que mas poder le veo es que puedas enviar un metodo como parametro directamente sin usar la costosa reflexion

Pues justamente para eso es.

Pues justamente para eso es.

De la reflexión le bajaron tremendamente desde Java 1.2 hasta Java 6 pero llega un punto donde ya no le pueden exprimir más.

Cuando se pone una instrucción a nivel de bytecode se incrementa el desempeño tremendamente ( en vez de llamar 8 o 10 instrucciones ahora harán 2 - 3 )

Eventualmente esto será usado para los closures ;) pero desde hoy los lenguajes dinámicos que corren sobre la JVM se benefician.

Ejemplo Surinx, el primo dinámico de Mirha que a su vez es el nuevo nombre de Duby que a su vez es la versión de tipeo estatico de JRuby que a su vez es el port de Ruby para la JVM. Sigh y pensar que hay quienes se complican la vida con un solo lenguaje y estos hacen cuantos se les antoja.

Puede ser incluso que eventualmente el reflection utilice esta instrucción en una optimización del compilador pero por lo que entiendo su objetivo es otro.