JVM yığın tabanlı ve Dalvik sanal makine kaydı neden tabanlı?


99

Merak ediyorum, Sun neden JVM yığın tabanlı yapmaya karar verdi ve Google DalvikVM'yi kayıt tabanlı yapmaya karar verdi?

Sanırım JVM, platformdan bağımsız olması gerektiğinden, hedef platformda belirli sayıda kaydın bulunduğunu gerçekten varsayamaz. Bu nedenle, sadece kayıt-tahsisini vb. JIT derleyicisine erteler. (Yanlışsam düzelt.)

Bu yüzden Android çalışanları "hey, bu verimsiz, hemen kayıt tabanlı bir sanal makine alalım ..." diye düşündüler. Ama bekleyin, birden fazla farklı android cihaz var, Dalvik kaç kayıt hedefledi? Dalvik işlem kodları belirli sayıda kayıt için kodlanmış mı?

Piyasadaki tüm mevcut Android cihazlarda yaklaşık aynı sayıda kayıt var mı? Veya dex yükleme sırasında gerçekleştirilen bir kayıt yeniden tahsisi var mı? Bütün bunlar nasıl birbirine uyuyor?


5
Bu Google'ın DalvikVM'yi kayıt tabanlı yapma kararı mıydı? DalvikVM'nin Google'ın Android Inc.'i satın almadan önce uygulandığını düşünüyorum
RoboAlex

1
Elbette haklısın. (Yine de soruyla pek alakalı değil;)
aioobe

Yanıtlar:


69

Java'nın tasarım hedeflerine uyan yığın tabanlı bir sanal makinenin birkaç özelliği vardır:

  1. Yığın tabanlı bir tasarım, hedef donanım (kayıtlar, CPU özellikleri) hakkında çok az varsayımda bulunur, bu nedenle bir sanal makineyi çok çeşitli donanımlara uygulamak kolaydır.

  2. Talimatlar için işlenenler büyük ölçüde örtük olduğundan, nesne kodu daha küçük olma eğiliminde olacaktır. Kodu yavaş bir ağ bağlantısı üzerinden indirecekseniz bu önemlidir.

Kayıt tabanlı bir şema ile gitmek, muhtemelen Dalvik'in kod oluşturucusunun, performant kod üretmek için çok çalışmak zorunda olmadığı anlamına gelir. Kayıt açısından son derece zengin veya kayıt açısından fakir bir mimari üzerinde çalışmak muhtemelen Dalvik'i engelleyecektir, ancak bu olağan hedef değildir - ARM, yolun ortasındaki bir mimaridir.


Dalvik'in ilk sürümünde hiç JIT bulunmadığını da unutmuştum. Talimatları doğrudan yorumlayacaksanız, kayıt tabanlı bir program muhtemelen yorumlama performansı için bir kazanandır.


1
Tamam, bu ilginç. Peki DalvikVM, hedef cihazda minimum sayıda kayıt olduğunu varsayar mı?
aioobe

1
Ayrıca, bazı kişilerin Android'i dizüstü bilgisayarlarına yüklediklerini okudum, çünkü bu "hafif" bir işletim sistemi ... Dizüstü bilgisayar ARM değilse ve belki de birçok kaydı olan bir mimariye sahipse bu kötü bir fikir gibi görünüyor?
aioobe

2
Tamam, dex bayt kodunun sonsuz yazmaç makinesi olarak tanımlandığını öğrendim ve verimlilik söz konusu olduğunda, çoğunlukla bellek ayak izi ile ilgili görünüyor.
aioobe

1
Dalvik'in sonsuz sicil tabanlı mı yoksa sabit dosya boyutuna mı sahip olduğunu hatırlayamadım. Sonsuzsa, çalıştırdığınız kod için "yeterli" yazmaçlara sahip mimarilerde en iyi şekilde çalışma eğiliminde olacaktır.
Mark Bessey

Daha ayrıntılı açıklama burada bulunabilir: markfaction.wordpress.com/2012/07/15/…
noego

32

Bir referans bulamıyorum, ancak sanırım Sun yığın tabanlı bayt kodu yaklaşımına karar verdi çünkü JVM'yi birkaç yazmaçlı bir mimaride (örn. IA32) çalıştırmayı kolaylaştırıyor.

In Dalvik VM Internals Google I / O 2008, Dalvik yaratıcısı Dan Bornstein ait slayt 35 bir kayıt tabanlı VM seçtiğiniz için aşağıdaki argümanlar verir sunum slaytları :

Kayıt Makinesi

Neden?

  • talimat göndermekten kaçının
  • gereksiz hafıza erişiminden kaçının
  • talimat akışını verimli bir şekilde tüketir (talimat başına daha yüksek anlamsal yoğunluk)

ve 36. slaytta:

Kayıt Makinesi

İstatistikler

  • % 30 daha az talimat
  • % 35 daha az kod birimi
  • Talimat akışında% 35 daha fazla bayt
    • ama aynı anda iki tane tüketiriz

Bornstein'a göre bu, "bir dizi sınıf dosyasını dex dosyalarına dönüştürdüğünüzde bulabileceğiniz genel bir beklentidir".

Tanıtım videosunun ilgili bölümü saat 25: 00'da başlar .

Shi ve diğerleri tarafından "Virtual Machine Showdown: Stack Versus Registers" başlıklı bir aydınlatıcı makale de bulunmaktadır . (2005) , yığın ve kayıt tabanlı sanal makineler arasındaki farkları araştırmaktadır.


13

Sun neden JVM yığınını temel almaya karar verdi bilmiyorum. Erlangs sanal makine, BEAM performans nedenleriyle kayıtlıdır. Ve Dalvik ayrıca performans nedenlerinden dolayı kayıt tabanlı görünüyor.

Gönderen Pro Android 2 :

Dalvik, kayıtları yığın yerine birincil veri depolama birimleri olarak kullanır. Google, sonuç olarak yüzde 30 daha az talimat gerçekleştirmeyi umuyor.

Ve kod boyutuyla ilgili olarak:

Dalvik VM, oluşturulan Java sınıfı dosyalarını alır ve bunları bir veya daha fazla Dalvik Yürütülebilir (.dex) dosyasında birleştirir. Birden çok sınıf dosyasındaki yinelenen bilgileri yeniden kullanarak, alan gereksinimini (sıkıştırılmamış) geleneksel .jar dosyasından yarı yarıya azaltır. Örneğin, Android'deki web tarayıcısı uygulamasının .dex dosyası yaklaşık 200k, eşdeğer sıkıştırılmamış .jar sürümü ise yaklaşık 500k'dir. Çalar saatin .dex dosyası yaklaşık 50k'dir ve .jar sürümünde kabaca iki kat daha büyüktür.

Bilgisayar Mimarisi'ni hatırladığım kadarıyla : Niceliksel Bir Yaklaşım da bir yazmaç makinesinin yığın tabanlı bir makineden daha iyi performans gösterdiğini söylüyor.


2
Tahmin etmem gerekirse, Sun'ın JVM yığınını temel almaya karar verdiğini söyleyebilirim çünkü uygulaması bir kayıt makinesinden daha kolaydır. (Ancak, burada belirtildiği gibi önemsiz olmayan bir performans maliyetiyle.)
Mason Wheeler

Bir referans bulamıyorum, ancak Sun'un yığın tabanlı bayt kodu yaklaşımına karar verdiğini düşünüyorum çünkü JVM'yi düşük yazmaçlı bir mimaride çalıştırmayı kolaylaştırıyor.
Akış

1
Bir donanım ISA'sı için, evet kayıt makineleri kazandı. Temelde her CPU / mikro denetleyici bir kayıt makinesidir, çünkü diğer her şey kıyaslandığında berbattır. Bazılarının çok az yazmaçları vardır, örneğin bir toplayıcı ve belki bir veya iki işaretçi veya indeks yazmacı, ama bu daha çok hesaplama teorisi anlamında bir yazmaç makinesine benzer. Ama biz yorumlanan VM'lerden bahsediyoruz , yani eğer varsa "kayıt dosyası" gerçekten bellekte olacaktır. Yerel makine koduna JIT ile derlemediğiniz sürece. Reg'in yığından daha hızlı olmasının nedenleri çok farklı.
Peter Cordes
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.