Sanal olan veya olmayan bir makinede, üzerinde hesaplamanın nasıl yapıldığını açıklayan bir hesaplama modeli gerekir. Tanım olarak, hesaplar tamamlamaz, bazı hesaplama modellerini uygular. O zaman soru şudur: VM için hangi modeli seçmeliyiz? Fiziksel makineler, donanımda etkin ve verimli bir şekilde yapılabilecekler ile sınırlandırılmıştır. Ancak, not ettiğiniz gibi, sanal makinelerin böyle bir kısıtlaması yoktur, bunlar keyfi bir şekilde yüksek seviyeli diller kullanılarak yazılımda tanımlanır.
Aslında, tarif ettiğiniz gibi yüksek seviyeli sanal makineler var. Bunlara programlama dilleri denir . Örneğin, C standardı, sayfalarının büyük bölümünü, C programlarının nasıl davrandığını açıklayan "C abstract machine" adı verilen bir model tanımlamaya, ve (uygun olduğu gibi) C derleyicisinin (veya yorumlayıcısının) nasıl uygun olduğunu açıklamaya yönelik bir model tanımlamaya adamıştır. davranmalı.
Tabii ki, biz genellikle buna sanal makine demiyoruz. Bir VM genellikle, doğrudan programlanması amaçlanmayan, verimli bir şekilde yürütülmesi amaçlanan, donanıma daha yakın, daha düşük seviyeli bir şey anlamına gelir. Bu seçim önyargısı, üst düzey beste edilebilir kodu (tanımladığınız gibi) kabul eden bir şeyin bir VM olarak kabul edilmeyeceği anlamına gelir çünkü yüksek düzeyli kod yürütür.
Ancak bu noktaya gelmek için, burada bir VM (gibi, bir bytecode derleyici tarafından hedeflenen bir şey) kayıt tabanlı veya benzeri bir hale getirmek için bazı nedenler. İstif ve kayıt makineleri son derece basittir. Her komut için bir talimatlar dizisi, bazı durumlar ve anlamlar vardır (bir fonksiyon - Durum -). Karmaşık ağaç azalması yok, operatör önceliği yok. Ayrıştırma, analiz etme ve yürütme çok basittir, çünkü asgari bir dildir (sözdizimsel şeker derlenir) ve insan tarafından okunmak yerine makine tarafından okunacak şekilde tasarlanmıştır.
Buna karşılık, en basit C-benzeri dilleri ayrıştırmak oldukça zordur ve yürütmek, türleri kontrol etmek ve yaymak, aşırı yükleri çözmek, bir sembol tablosunu korumak, dize tanımlayıcılarını çözmek , doğrusal metni öncelikli bir AST'ye dönüştürmek gibi yerel olmayan analizler gerektirir. , ve bunun gibi. İnsanlara doğal gelen, ancak makineler tarafından özenle tersine çevrilmiş olması gereken kavramlar üzerine kuruludur.
Örneğin JVM bayt kodu yayılır javac
. Neredeyse hiç bir zaman insanlar tarafından okunması veya yazılması gerekmez, bu yüzden onu makineler tarafından tüketime yönlendirmek doğaldır. İnsanlar için optimize ettiyseniz, JVM hemen her başlangıçta kodu okur, ayrıştırır, analiz eder ve sonra yine de böyle basitleştirilmiş bir makine modeline benzeyen bir ara gösterime dönüştürürdü . Orta adamı da kesebilir.