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. longve double64 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 ( impdep1ve 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, iaddiki tamsayı daddekleyecek, iki çift ekleyecektir. const, loadVe storetalimatlar formun bir son ek alabilir , n, 0-3 arasında bir sayı ve . için maksimum n , türe göre değişir. _nloadstoreconst

constTalimatlar yığına belirtilen türde bir değer itin. Örneğin, iconst_55 değerli bir tamsayı (32 bit değeri) yığına dconst_1iterken, 1 değerinde bir çift (64 bit kayan nokta değeri) yığına itecektir. Ayrıca aconst_nullbir nullreferansı iten bir , vardır . N için loadve storetalimatlara gelen yüke veya mağazaya yerel değişken dizideki endeksi belirtir. aload_0Kullanıcı yığını üzerine yerel değişken 0 nesneyi (bu genellikle iter thisnesne). istore_1yığı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:

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:

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 invokedynamicişlem kodunu da içerir .

Ayrıca bakınız

Referanslar

Dış bağlantılar