2013-10-10 28 views
5

パターンマッチとそれに対応するバイトコードでいくつかの反転処理を行いました。上記のコードの場合スカラのバイトコードで不要なロード命令とストア命令

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

、私はてjavapを使用して、マップ内のAnnonymousの機能のためのバイトコードを得た:

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

だから、ライン0に我々はint型(パラメータ)を押すように私には思えます1行目でintをロードし、2行目でそれを元に戻します...目的は何ですか?

ありがとうございます!

答えて

2

Dude、try -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 

使用

scala> :javap -prv - 

、その後、私はここに2.9.3を使用してい

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

のようなもの。出力が同じではないと思われる... – darkjh

+0

@darkjh古代の歴史!私の2.9エイリアスはjavapを実行しません。私はちょうどあなたの誤植を気づいた:あなたが何かを調査し、その結果はあなたが期待したものの逆です。その1つをありがとう。 –

1

なぜこれが起こるのかわからないので、これは実際の答えではありません。

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 

最初の2つの命令は、単にの値を移動するように見える:私は、これらの観察は、私がScalaの2.10で、次のバイトコードを見ている


:)少なくとも参考になることを願っていますvar1からvar2に移動し、var2をパラメータとしてスタックに移動します。同じことがiaddの後に観測されます。ireturnはスタックからの値をとにかく戻すので、結果は明らかな理由なしにvar3に格納されます。