Java bayt kodu - Java bytecode
Java bytecode olduğu belirlenen yönerge ve Java sanal makinesinin (JVM).
Java ile İlişkisi
Bir Java programcısının Java bayt kodunu bilmesi veya anlaması gerekmez. Ancak, IBM DeveloperWorks günlüğünde önerildiği gibi , "Bir Java derleyicisi tarafından bayt kodunun ve hangi bayt kodunun üretilebileceğinin anlaşılması , Java programcısına, derleme bilgisinin C veya C++ programcısına yardımcı olduğu şekilde yardımcı olur ."
Komut seti mimarisi
JVM hem küme makinesi ve bir yazmaç makinesi . Bir yöntem çağrısı için her çerçeve bir "işlenen yığını" ve bir dizi "yerel değişkenler" içerir. İşlenen yığını, işlenenlerden hesaplamalara ve çağrılan bir yöntemin dönüş değerini almak için kullanılırken, yerel değişkenler kayıtlarla aynı amaca hizmet eder ve ayrıca yöntem argümanlarını iletmek için kullanılır. Derleyici tarafından hesaplanan işlenen yığınının ve yerel değişken dizisinin maksimum boyutu, her yöntemin özniteliklerinin bir parçasıdır. Her biri, her değerin 32 bit olduğu 0 ila 65535 değer arasında bağımsız olarak boyutlandırılabilir. long
ve double
64 bit olan türler, ardışık iki yerel değişkeni (yerel değişkenler dizisinde 64-bit hizalanması gerekmez) veya işlenen yığında bir değer alır (ancak yığının derinliğinde iki birim olarak sayılır) .
Komut seti
Her bayt kodu , işlenenler için sıfır veya daha fazla bayt ile birlikte opcode'u temsil eden bir bayttan oluşur .
2015 itibariyle , 256 olası bayt uzunluğunda işlem kodundan 202'si kullanımdadır (~%79), 51'i gelecekte kullanım için ayrılmıştır (~%20) ve 3 talimat (~%1) JVM uygulamaları için kalıcı olarak ayrılmıştır. kullanmak. Bunlardan ikisi ( impdep1
ve impdep2
) sırasıyla uygulamaya özel yazılım ve donanım için tuzaklar sağlamaktır. Üçüncüsü, hata ayıklayıcıların kesme noktaları uygulaması için kullanılır.
Talimatlar bir dizi geniş gruba ayrılır:
- Yükleyin ve saklayın (ör.
aload_0
,istore
) - Aritmetik ve mantık (örneğin
ladd
,fcmpl
) - Tür dönüştürme (ör.
i2b
,d2i
) - Nesne oluşturma ve işleme (
new
,putfield
) - İşlenen yığın yönetimi (örneğin
swap
,dup2
) - Kontrol aktarımı (ör.
ifeq
,goto
) - Yöntem çağırma ve döndürme (örneğin
invokespecial
,areturn
)
Ayrıca istisna oluşturma, senkronizasyon vb. gibi daha özel görevler için birkaç talimat vardır.
Birçok komut, üzerinde çalıştıkları işlenen türlerine atıfta bulunan ön eklere ve/veya son eklere sahiptir. Bunlar aşağıdaki gibidir:
Ön ek Son ek | işlenen türü |
---|---|
i |
tam sayı |
l |
uzun |
s |
kısa boylu |
b |
bayt |
c |
karakter |
f |
batmadan yüzmek |
d |
çift |
a |
referans |
Örneğin, iadd
iki tamsayı dadd
ekleyecek, iki çift ekleyecektir. const
, load
Ve store
talimatlar formun bir son ek alabilir , n, 0-3 arasında bir sayı ve . için maksimum n , türe göre değişir.
_n
load
store
const
const
Talimatlar yığına belirtilen türde bir değer itin. Örneğin, iconst_5
5 değerli bir tamsayı (32 bit değeri) yığına dconst_1
iterken, 1 değerinde bir çift (64 bit kayan nokta değeri) yığına itecektir. Ayrıca aconst_null
bir null
referansı iten bir , vardır . N için load
ve store
talimatlara gelen yüke veya mağazaya yerel değişken dizideki endeksi belirtir. aload_0
Kullanıcı yığını üzerine yerel değişken 0 nesneyi (bu genellikle iter this
nesne). istore_1
yığının en üstündeki tamsayıyı yerel değişken 1'de saklar. 3'ün üzerindeki yerel değişkenler için sonek atılır ve işlenenler kullanılmalıdır.
Örnek
Aşağıdaki Java kodunu göz önünde bulundurun:
outer:
for (int i = 2; i < 1000; i++) {
for (int j = 2; j < i; j++) {
if (i % j == 0)
continue outer;
}
System.out.println (i);
}
Bir Java derleyicisi, yukarıdakilerin bir yönteme yerleştirildiğini varsayarak, yukarıdaki Java kodunu aşağıdaki gibi bayt koduna çevirebilir:
0: iconst_2
1: istore_1
2: iload_1
3: sipush 1000
6: if_icmpge 44
9: iconst_2
10: istore_2
11: iload_2
12: iload_1
13: if_icmpge 31
16: iload_1
17: iload_2
18: irem
19: ifne 25
22: goto 38
25: iinc 2, 1
28: goto 11
31: getstatic #84; // Field java/lang/System.out:Ljava/io/PrintStream;
34: iload_1
35: invokevirtual #85; // Method java/io/PrintStream.println:(I)V
38: iinc 1, 1
41: goto 2
44: return
Nesil
Java bayt kodu üreterek Java sanal makinesini hedefleyen en yaygın dil Java'dır. Başlangıçta yalnızca bir derleyici vardı, Java kaynak kodunu Java bayt koduna derleyen Sun Microsystems'in javac derleyicisi ; ancak Java bayt kodunun tüm özellikleri artık mevcut olduğundan, diğer taraflar Java bayt kodu üreten derleyiciler sağlamıştır. Diğer derleyici örnekleri şunları içerir:
- Java için Eclipse derleyicisi (ECJ)
- Jikes , Java'dan Java bayt koduna derler ( IBM tarafından geliştirildi , C++ ile uygulandı )
- Espresso, Java'dan Java bayt koduna derler (yalnızca Java 1.0)
- Java için GNU Derleyicisi (GCJ), Java'dan Java bayt koduna derler; ayrıca yerel makine kodunu derleyebilir ve sürüm 6'ya kadar GNU Derleyici Koleksiyonunun (GCC) bir parçasıydı .
Bazı projeler, Java bayt kodunu elle yazmayı etkinleştirmek için Java toplayıcıları sağlar. Derleme kodu, örneğin bir Java sanal makinesini hedefleyen bir derleyici tarafından, makine tarafından da oluşturulabilir . Önemli Java montajcıları şunları içerir:
- Jasmin , Java sanal makine komut setini kullanarak basit bir derleme benzeri sözdiziminde yazılmış Java sınıfları için metin açıklamalarını alır ve bir Java sınıfı dosyası oluşturur
- Jamaika, Java sanal makinesi için bir makro derleme dili . Java sözdizimi, sınıf veya arayüz tanımı için kullanılır. Yöntem gövdeleri, bayt kodu yönergeleri kullanılarak belirtilir.
- Krakatau Bytecode Tools, şu anda üç araç içerir: Java sınıf dosyaları için bir kod çözücü ve ayrıştırıcı ve sınıf dosyaları oluşturmak için bir derleyici.
- Lilac, Java sanal makinesi için bir montajcı ve sökücü .
Diğerleri, Java sanal makinesini hedeflemek için farklı programlama dilleri için derleyiciler geliştirmiştir, örneğin:
- Soğuk füzyon
- JRuby ve Jython , Ruby ve Python'a dayalı iki betik dili
- Apache Groovy , isteğe bağlı olarak yazılan ve dinamik genel amaçlı dil, statik yazma ve statik derleme yetenekleriyle
- Scala , nesne yönelimli ve işlevsel programlamayı destekleyen, tür güvenli genel amaçlı bir programlama dili
- JGNAT ve AppletMagic, Ada dilinden Java bayt koduna derleme
- C'den Java bayt kodu derleyicilerine
- Clojure , Lisp ailesinde eşzamanlılığa güçlü bir vurgu yapan işlevsel, değişmez, genel amaçlı bir programlama dili
- Scheme programlama dilinin bir uygulaması olan Kawa , aynı zamanda Lisp'in bir lehçesidir .
- MIDletPascal
- JavaFX Komut Dosyası kodu Java bayt koduna derlenir
- Kotlin , tür çıkarımına sahip statik olarak yazılmış genel amaçlı bir programlama dili
- Nesne Pascal kaynak kodu, Free Pascal 3.0+ derleyicisi kullanılarak Java bayt koduna derlenir .
Uygulamak
Bugün hem ücretsiz hem de ticari ürünler olan Java bayt kodunu yürütmek için kullanılabilen birkaç Java sanal makinesi vardır. Bir sanal makinede bayt kodu yürütmek istenmiyorsa, geliştirici ayrıca Java kaynak kodunu veya bayt kodunu Java için GNU Derleyici (GCJ) gibi araçlarla doğrudan yerel makine koduna derleyebilir . Bazı işlemciler Java bayt kodunu yerel olarak çalıştırabilir. Bu tür işlemcilere Java işlemcileri denir .
Dinamik diller için destek
Java sanal makinesi için bazı destek sağlar dinamik Yazılan diller . Mevcut JVM komut setinin çoğu statik olarak yazılmıştır - yöntem çağrılarının imzalarının derleme zamanında tip kontrolüne sahip olması anlamında , bu kararı çalıştırma süresini ertelemek veya alternatif bir yaklaşımla yöntem gönderimini seçmek için bir mekanizma olmadan .
JSR 292 ( Java Platformunda Dinamik Olarak Yazılan Dilleri Destekleme ) invokedynamic
, dinamik tip denetimine dayanan (mevcut statik tip denetimliinvokevirtual
talimat yerine) yöntem çağırmaya izin vermek için JVM düzeyinde yeni bir talimat ekledi . Da Vinci Makinesi barındıran dinamik dilleri desteklemeyi amaçlayan uzantıları JVM bir prototip sanal makine uygulamasıdır. JSE 7'yi destekleyen tüm JVM'ler aynı zamanda invokedynamic
işlem kodunu da içerir .
Ayrıca bakınız
- Java bayt kodu talimat listeleri
- Java sınıfı dosyası
- JVM dillerinin listesi
- Java yedekleme araçları
- C'den Java Sanal Makine derleyicilerine
- JStik
- Ortak Ara Dil (CIL), Microsoft'un Java bayt koduna rakibi
- NesneWeb ASM
- Bayt Kodu Mühendislik Kitaplığı
Referanslar
Dış bağlantılar
- Oracle'ın Java Sanal Makine Belirtimi
- Java Sanal Makinesi için Programlama Dilleri
- Bayt Kodu Görüntüleyici – bayt kodu görüntüleyici ve hata ayıklayıcı (ücretsiz Eclipse eklentisi)
- AdaptJ StackTrace – yığının, yerel değişkenlerin ve yürütme akışının tam denetimiyle bayt kodu düzeyinde hata ayıklama
- Java Class Unpacker – Total Commander eklentisi, sınıf dosyalarını sıkıştırılmış arşivler olarak açmaya ve alanları ve yöntemleri dosyalar olarak görmeye izin verir. Bayt kodu, F3 kullanılarak metin olarak görüntülenebilir