2010-12-12 37 views
36

C++, birden çok kalıtım var. Montaj seviyesinde çoklu kalıtımın uygulanması oldukça karmaşık olabilir, ancak bunun normal olarak nasıl yapıldığına dair online () vardır (vtables, pointer fixups, thunks, etc.).Java arabirimleri dahili olarak nasıl uygulanır? (vtables?)

Java'nın birden fazla uygulama devralma özelliği yoktur, ancak birden fazla arabirim kalıtımına sahiptir, bu yüzden bunu uygulayabilen, sınıf başına tek bir vtable ile doğrudan bir uygulama düşünemiyorum. Java dahili olarak arayüzleri nasıl uygular?

C++ uygulamasının aksine, Java'nın Jit derlenmiş olduğunu, dolayısıyla farklı kod parçalarının farklı şekilde optimize edilebileceğini ve farklı JVM'lerin farklı şeyler yapabileceğini anlıyorum. Öyleyse, birçok JVM'nin bunu takip ettiği veya belirli bir JVM'de uygulamayı bilen herhangi bir genel strateji var mı?

Ayrıca, JVM'ler genellikle vekil veya eşdeğer bir yöntem bulunmadığı yöntem çağrılarını devirtualize eder ve satır içi satır içi çağrıları gerçekleştirir, bu nedenle sanal/arabirim yöntem çağrılarını gerçekleştiren asıl montaj sıraları hakkında soru sormak mantıklı olmayabilir, ancak en fazla JVM'ler, her şeyi devşiremedikleri takdirde, kullanacakları sınıfların genel bir temsilini hala sürdürürler. Bu varsayım yanlış mı? Bu temsil bir C++ vtable gibi görünüyor mu? Öyleyse arayüzler ayrı veteriner var ve bunlar sınıf vtables ile bağlantılı nasıl? Öyleyse, nesneler C++'daki nesne örnekleri gibi birden fazla vtable işaretçisine (sınıf/arabirim vtables'e) sahip olabilir mi? Aynı nesneye bir sınıf tipi ve bir arabirim türü referansları her zaman aynı ikili değere sahiptir veya bunlar C++'da işaretçinin düzeltmeleri gerektirdiği gibi farklı olabilir mi?

(referans için: this question CLR hakkında benzer bir şey sorar, ve ben Java için benzer bir şey bulmak mümkün olmamıştır artık eski olabilir ama this msdn article iyi bir açıklaması vardır görünür..)

Düzenleme: Ben Java sınıfı ArrayList" anlamında "GCC derleyicisi tamsayı ekleme/fonksiyon çağrıları/vb uyguluyor mu Nasıl" anlamında 'uygular' demek

  • Liste arabirimini uygulayan ".
  • Bunun JVM bayt kodu düzeyinde nasıl çalıştığının farkındayım, bilmek istediğim, sınıf dosyalarını yükledikten ve bayt kodunu derledikten sonra JVM tarafından hangi tür kod ve veri yapılarının oluşturulduğunu açıklıyor.
+2

Arabirim devralma ve uygulama kalıtımından bahsediyorsunuz. Tanımlanmış bir arama düzenine sahip olmanız gerektiğinden uygulama kalıtımını zorlaştırır. Arayüz kalıtımı daha basittir. Uygulanması gereken tüm yöntem imzaları ile bir haritanız var. Hiçbir arama emri gerektirmez (eklenmiş bir uygulama olmadığı için). Orada sipariş yok. – extraneon

cevap

25

HotSpot JVM'nin temel özelliği inline caching'dur. Bu, aslında, hedef yöntemin satır içi olduğu anlamına gelmez, ancak varsayımının, sanal veya arabirim yöntemine yapılan her gelecekteki çağrının, aynı uygulama ( ) hedefleyeceği JIT koduna eklendiği anlamına gelir (örneğin, arama sitesi monomorfik). Bu durumda, kontrolü, varsayımın gerçekte tutulup tutulmadığını (yani, , hedef nesnenin tipi ile son defa aynı olup olmadığının) makine koduna derlenir ve daha sonra kontrolünü doğrudan hedef yönteme aktarın - hiçbir sanal tabloya dahil değildir. Eğer onaylama başarısız olursa, bunu bir megamorfik çağrı sitesine (yani, mümkün olan çok sayıda tipte) dönüştürmek için bir girişimde bulunulabilir; Bu da başarısız olursa (veya ilk çağrıysa), vtables (sanal yöntemler için) ve itables (arabirimler için) kullanarak düzenli olarak uzun soluklu bir arama gerçekleştirilir.

Düzenleme: Hotspot Wiki vtable ve itable koçanları üzerinde daha fazla ayrıntı vardır.Polimorfik durumda, hala arama alanına bir inline önbellek sürümü koyar. Ancak, kod aslında bir vtable veya bir itable bir arama gerçekleştiren bir saplama. Her vtable ofset için bir vtable saplama (0, 1, 2, ...) vardır. Interface calls Verilen ofsette itable'a (bulunmuşsa) bakmadan önce, bir dizi itables üzerinde doğrusal bir arama ekleyin.

+0

VirtualCalls ve InterfaceCalls'daki Hotspot Wiki sayfaları, aradığım şey gibi görünüyor. Yine de hepsini okumak için etrafta dolaşmak zorunda. – JanKanis

+1

Wiki, https://wikis.oracle.com/display/HotSpotInternals/Home –

+0

adresine taşındı. Oracle wiki'si donduruldu, bence https://wiki.openjdk.java.net/display/HotSpot/Main güncellenebilir bilgilerin bittiği yer. – JanKanis

İlgili konular