Saya penasaran, mengapa Sun memutuskan untuk membuat JVM berbasis tumpukan dan Google memutuskan untuk membuat berbasis register DalvikVM?
Saya kira JVM tidak dapat benar-benar berasumsi bahwa sejumlah register tersedia pada platform target, karena itu seharusnya platform independen. Oleh karena itu hanya menunda alokasi register dll, ke kompilator JIT. (Koreksi saya jika saya salah.)
Jadi orang-orang Android berpikir, "hei, itu tidak efisien, mari kita langsung mendaftar vm berbasis ..."? Tapi tunggu, ada beberapa perangkat Android yang berbeda, berapa register yang ditargetkan Dalvik? Apakah opcode Dalvik di-hardcode untuk sejumlah register tertentu?
Apakah semua perangkat Android yang ada di pasaran memiliki jumlah register yang kurang lebih sama? Atau, apakah ada alokasi ulang register yang dilakukan selama dex-loading? Bagaimana semua ini cocok?
Jawaban:
Ada beberapa atribut VM berbasis tumpukan yang cocok dengan tujuan desain Java:
Desain berbasis tumpukan membuat sangat sedikit asumsi tentang perangkat keras target (register, fitur CPU), sehingga mudah untuk menerapkan VM pada berbagai perangkat keras.
Karena operan untuk instruksi sebagian besar implisit, kode objek akan cenderung lebih kecil. Ini penting jika Anda akan mengunduh kode melalui tautan jaringan yang lambat.
Menggunakan skema berbasis register mungkin berarti generator kode Dalvik tidak harus bekerja keras untuk menghasilkan kode yang berkinerja baik. Berjalan pada arsitektur yang sangat kaya register atau register-miskin mungkin akan melumpuhkan Dalvik, tetapi itu bukan target yang biasa - ARM adalah arsitektur yang sangat menengah.
Saya juga lupa bahwa versi awal Dalvik tidak menyertakan JIT sama sekali. Jika Anda akan menafsirkan instruksi secara langsung, maka skema berbasis register mungkin adalah pemenang untuk kinerja interpretasi.
sumber
Saya tidak dapat menemukan referensi, tetapi saya pikir Sun memutuskan untuk pendekatan bytecode berbasis tumpukan karena membuatnya mudah untuk menjalankan JVM pada arsitektur dengan beberapa register (misalnya IA32).
Dalam Dalvik VM Internal dari Google I / O 2008, pencipta Dalvik Dan Bornstein memberikan argumen berikut untuk memilih VM berbasis register pada slide 35 slide presentasi :
dan pada slide 36:
Menurut Bornstein, ini adalah "ekspektasi umum yang dapat Anda temukan ketika Anda mengonversi sekumpulan file kelas ke file dex".
Bagian yang relevan dari video presentasi dimulai pukul 25.00 .
Ada juga makalah berwawasan berjudul "Virtual Machine Showdown: Stack Versus Registers" oleh Shi et al. (2005) , yang mengeksplorasi perbedaan antara mesin virtual berbasis stack dan register.
sumber
Saya tidak tahu mengapa Sun memutuskan untuk membuat JVM stack based. Erlangs mesin virtual, BEAM mendaftar berdasarkan alasan kinerja. Dan Dalvik juga tampaknya berbasis register karena alasan kinerja.
Dari Pro Android 2 :
Dan mengenai ukuran kode:
Dan seperti yang saya ingat Arsitektur Komputer: Pendekatan Kuantitatif juga menyimpulkan bahwa mesin register berkinerja lebih baik daripada mesin berbasis tumpukan.
sumber