2012-03-15 14 views
7

Amatör bir JVM uygulaması üzerinde çalışıyorum ve spesifikasyondaki tüm opcodes için test kapsamına sahip olduğumdan emin olmaya çalışıyorum. Son birkaç saniyeye kadar aldım, ama nop ve swap beni aldattı. Örneğin, aşağıda swap kullanabilir basit işlevi var:Java kodu javac 1.6'yı 'swap' ve 'nop' opcodes kullanmak için zorlar mı?

static int do_swap() { 
    int a = 56; 
    int b = 32; 
    return b%a; 
} 

Ama javac 1.6 tarafından üretilen bayt kodu yerel depolama yerine takas önler:

static int do_swap(); 
    Code: 
    0: bipush 56 
    2: istore_0 
    3: bipush 32 
    5: istore_1 
    6: iload_1 
    7: iload_0 
    8: irem 
    9: ireturn 

bir fikir?

cevap

6

Hiçbiri. Java Dili Spesifikasyonu bu garantileri sağlamamaktadır. Jasmin (bytecode assembler) kullanarak kendi Java bayt kodunuzu yazabilirsiniz.

+1

Krakatau assembler'ın JVM test senaryoları oluşturmak için daha faydalı olacağını düşünüyorum, çünkü Jasmin'in yaptığı classfile formatının daha karanlık özelliklerini destekliyor. (Bunu açıkladım). Ama böyle basit bir şey için, Jasmin yeterince iyidir. – Antimony

İlgili konular