Los casos de uso de la instrucción DUP JVM

saga:

Conjunto de instrucciones de código de bytes de Java proporciona varias formas de instrucción DUP . Estoy teniendo problemas para entender cómo estas instrucciones y la swapinstrucción pueden ser útiles. ¿Qué código java produciría código de bytes con estas instrucciones cuando se compila?

Holger:

Las variantes de duppueden aparecer en código Java ordinaria.

Por ejemplo, como se explica en esta respuesta , objeto de instancias utiliza normalmente dup, como new Object()se compila a

new #n              // n referencing Class java.lang.Object in the pool
dup
invokespecial #m    // m referencing Method java.lang.Object.<init>()V

Además, intArray[expression]++se compila a

… (code pushing the results of intArray and expression)
dup2
iaload
iconst_1
iadd
iastore

y, un poco más de lujo

public static long example3(Long[] array, int i, long l) {
    return array[i]=l;
}

compila a

   0: aload_0
   1: iload_1
   2: lload_2
   3: invokestatic  #3  // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
   6: dup_x2
   7: aastore
   8: invokevirtual #4  // Method java/lang/Long.longValue:()J
  11: lreturn

Cambiar el tipo de matriz para long[]produce un ejemplo dedup2_x2

Como se discutió en este Q & A , javacno nunca utilice swapo nop(en la implementación actual). Pero el hecho de javacno utilizar una instrucción particular, no se puede asumir que ningún compilador utiliza.

Por ejemplo, existen otros compiladores Java, como ECJ, pero no puede haber archivos de clase creados por otros lenguajes de programación o siendo ya el resultado de una herramienta de instrumentación, que se vuelve relevante cuando se desea código del instrumento en tiempo de ejecución. Y las versiones futuras de javactambién puede utilizar las instrucciones que no habían usado antes, al igual que antes de Java 8, código Java no utilizaron invokedynamic.

Esta discusión apunta a un escenario, donde swapsería apropiado. Cuando se utiliza try-con-recursos, se generará el código, el manejo de una excepción capturada mientras que ya hay una excepción capturada. Actuales javaccompila (básicamente) a

astore        n
aload         o
aload         n
invokevirtual #x // Method java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V

donde oestá el viejo variable que contiene la excepción ya capturado y nserá una variable totalmente nueva, lo que no sería necesaria al redactar estas a

aload         o
swap
invokevirtual #x // Method java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V

en lugar. Así no es como se necesitaron nunca estas instrucciones construcciones exóticas. Es sólo un detalle de implementación cuando un generador de código particular no los usa.

Hablando de Instrumentación, también es importante tener en cuenta que una ClassFileTransformerno está garantizado para recibir exactamente el mismo código de bytes como el producido por el compilador. Puede ser que sea un código de bytes equivalente.

Así que la conclusión es que, si se desea implementar una ClassFileTransformer, usted debe estar preparado para manejar cada código de bytes legal.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=204859&siteId=1
Recomendado
Clasificación