Java Bayt Kodu
Java bayt kodu , .class uzantılı dosyanın içinde bulunur ve Java sanal makinesinin (JVM) daha sonra bir JIT derleyicisi aracılığıyla makine diline derlenmek üzere almayı beklediği komut türüdür . uygulamak. Genellikle bir Java programlama dili derleyicisinin (javac gibi) kullanılmasının sonucudur, ancak diğer derleyicilerden oluşturulabilir.
Yapı
Her komutun işlem kodu bir bayt uzunluğundadır, ancak bazıları çok baytlı komutlarla sonuçlanan parametreler gerektirir. 256 olası işlem kodunun tümü kullanılmaz. Aslında Java platformunun orijinal yaratıcısı olan Sun Microsystems , kalıcı olarak uygulanmadan kalması için üç değeri böldü. [ 1 ]
Talimatlar aşağıdaki kategorilere ayrılır:
- Bellekten kayıtlara veya tam tersine geçiş yapın (örn. aload_0, istore)
- Aritmetik ve mantık (örneğin ladd, fcmpl)
- Tür dönüştürme (örn. i2b, d2i)
- Nesne oluşturma ve işleme (örn. yeni, putfield)
- İşlenen yığınının manipülasyonu (örneğin takas, dup2)
- Akış kontrolü (örneğin ifeq, goto)
- Yöntemlerin çağrılması ve geri dönüşü (örn. invokespecial, areturn)
İstisna işleme , senkronizasyon vb. gibi daha özel işlemler için de birkaç talimat vardır .
Java bayt kodu stili, yığın yönelimli programlama diline benzer . Örneğin, bir x86 ailesi CPU için iki kayıt eklemek ve sonucu üçte birine taşımak için derleme kodu şöyle görünür:
eax , edx
mov ecx , eax ekle
Java derleme dilinde karşılaştırılabilir kod şöyle görünürken :
iload_1
iload_2
iadd
istore_3
Eklenecek iki değer, toplama talimatı ile alınacakları bir yığına yerleştirilir. Eklemenin sonucu yığına geri itilir ve onu register'a taşıyan son talimat tarafından alınır.
Dinamik dillerin işlenmesi
Java sanal makinesi, dinamik olarak yazılan dilleri işlemek için bir miktar destek sağlar. JVM komutlarının çoğu, çalışma zamanında bu kararı geciktirmek veya yürütme yöntemini seçmek için bir mekanizma olmaksızın , yöntem çağrılarının derleme zamanında "imzalarını" kontrol etmesi anlamında statik olarak yazılır.Alternatif bir yaklaşıma göre "gönderme". [ 2 ]
JSR 292 ( Java™ Platformunda Dinamik Olarak Yazılan Dilleri Destekleme ) [ 3 ]invokedynamic dinamik olarak yazılan tabanlı yöntem çağırmaya izin veren yeni bir ifade içerir . "Da Vinci makinesi", bu dilleri işlemek için JVM uzantılarını barındıran bir prototip sanal makine uygulamasıdır. Aynı şekilde, resmi Java sanal makinesi, sürüm 7'den bu yana opcode'u da içerir invokedynamic.
Referanslar
- ↑ VM Özelliği - Ayrılmış İşlem Kodları
- ^ Nutter, Charles (3 Ocak 2007). "InvokeDynamic: Aslında Faydalı mı?" . 2008-01-25 alındı .
- ↑ bkz. JSR 292