2013-10-10 7 views
5

Ho appena effettuato alcune inversioni sulla corrispondenza del modello e il relativo codice byte.Istruzione di carico e di immagazzinamento non necessaria nel codice byte di scala

val a = Array(1,2,3,4) 
a.map { 
    case i => i + 1 
} 

Per codice di cui sopra, io uso javap e ottenuto il codice di byte per la funzione annonymous all'interno mappa:

public int apply$mcII$sp(int); 
Code: 
    0: iload_1  
    1: istore_2  
    2: iload_2  
    3: iconst_1  
    4: iadd   
    5: ireturn  

così sembra a me che in linea 0 spingiamo un int (il parametro) , quindi nella riga 1 carichiamo l'int e nella riga 2 lo spingiamo indietro ... Qual è lo scopo qui?

Grazie!

risposta

2

Amico, prova -optimise.

public int apply$mcII$sp(int); 
    flags: ACC_PUBLIC 
    Code: 
     stack=2, locals=2, args_size=2 
     0: iload_1  
     1: iconst_1  
     2: iadd   
     3: ireturn 

Usa

scala> :javap -prv - 

e poi qualcosa come

scala> :javap -prv $line4/$read$$iw$$iw$$anonfun$1 
+0

sto usando 2.9.3 qui. Sembra che l'output non sia lo stesso ... – darkjh

+0

@darkjh storia antica! Il mio alias 2.9 non esegue nemmeno javap. Ho appena notato la tua errore di battitura: quando indaga su qualcosa e il risultato è l'inverso di quello che ti aspettavi. Grazie per quello. –

1

Questa non è davvero una risposta, dal momento che non ho potuto capire perché questo accade. Spero che queste osservazioni saranno almeno utile :)


sto vedendo il seguente bytecode a Scala 2.10:

public int apply$mcII$sp(int); 
    Code: 
     0: iload_1  ; var1 -> stack 
     1: istore_2  ; var2 <- stack 
     2: iload_2  ; var2 -> stack 
     3: iconst_1  ; 1 -> stack 
     4: iadd  
     5: istore_3  ; var3 <- stack 
     6: iload_3  ; var3 -> stack 
     7: ireturn  ; return <- stack 

Le prime due istruzioni sembrano muoversi semplicemente il valore di var1 a var2, quindi spostare var2 nello stack come parametro. Lo stesso può essere osservato dopo iadd, dove il risultato viene memorizzato in var3 senza alcun motivo apparente, dal momento che ireturn restituisce comunque il valore dallo stack.

Problemi correlati