Java Sanal Makinesi diğer dillerde yazılmış kodları nasıl yürütür?


12

Java 1.6'dan beri JVM, sadece Java yerine sayısız programlama dili çalıştırabilir. Java'nın Java VM'de nasıl çalıştığını kavramsal olarak anlıyorum, ancak diğer dillerin de nasıl çalışabileceğini anlamıyorum. Bana göre hepsi kara büyü gibi görünüyor. Tüm bunların nasıl bir araya geldiğini daha iyi anlayabilmem için beni işaret edecek makaleleriniz var mı?


2
Intel / AMD / Solaris (??) işlemciniz aynı şekilde, herhangi bir dili yürütebilir (ancak gerçekten dil çalıştırmamanıza rağmen, sadece buradaki akışla devam etmenize rağmen), yerel derleme kodunda derlenebilir.
Apoorv Khurasia

13
Şey, JVM gelmez Java çalıştırın. Daha düşük seviyeli bir dil (belirgin ve Java derleyicilerinin oluşturması için kasıtlı olarak kolay) olsa da çalışır.

Bu doğru. Ancak JVM, sürüm 6'daki diğer dilleri çalıştırmaya başladı; 1.4.2 sürümünde python veya Groovy'yi çalıştıramadınız (veya hiç kimse çalıştırmadı). Neden böyle? Ne değişti?
Pomario

@Delnan Ya da daha doğrusu, "javac programının Java kodunun nasıl oluşturulacağını bildiği daha düşük seviyeli bir yürütme modeli".
Apoorv Khurasia

9
@Pomario Jython bir süredir ortalıkta. Ve bu sayfa, Jython komut dosyalarının 1.4.2'de çalışabileceğini gösteriyor.
Apoorv Khurasia

Yanıtlar:


23

Anahtar JVM'nin ana dilidir: Java bayt kodu. Herhangi bir dil, JVM'nin anladığı bayt kodunda derlenebilir - bunun için tek ihtiyacınız bayt kodu yayan bir derleyici. O andan itibaren JVM'nin bakış açısından hiçbir fark yoktur. Öyle ki derlenmiş bir Scala, Clojure, Jython vb. Sınıf dosyasını alıp (örneğin JAD kullanarak ) normal görünümlü Java kaynak koduna dönüştürebilirsiniz.

Bununla ilgili daha fazla bilgiyi aşağıdaki makalelerde / konularda bulabilirsiniz:

Java 5 veya 6 JVM'lerde diğer diller üzerinde çalışmasını (derlenmiş kod) mümkün veya daha kolay hale getirecek temel değişikliklerin farkında değilim . Anladığım kadarıyla, JVM 1.4 bu açıdan JVM 6 kadar az ya da çok yetenekliydi (ancak farklılıklar olabilir; Ben bir JVM uzmanı değilim). Sadece insanlar on yılın ilk yarısında diğer dilleri ve / veya bayt kodu derleyicilerini geliştirmeye başladılar ve sonuçlar Java 6 yayınlandığında 2006'da ortaya çıkmaya başladı (ve daha geniş hale geldi).

Ancak, tüm bu JVM sürümleri bazı sınırlamaları paylaşır: JVM statik olarak doğa tarafından yazılmıştır ve 7 sürümüne kadar dinamik dilleri desteklememiştir. Bu, invokedynamicdinamik tip kontrolüne dayanan yöntem çağırma işlemine olanak tanıyan yeni bir bayt kodu talimatının sunulmasıyla değişmiştir .


8
JVM'nin dinamik dilleri "desteklemediği" tam olarak doğru değil. Sadece ciddi dezavantajları olan geçici çözümler kullanmak zorunda kaldılar.
Michael Borgwardt

3
@MichaelBorgwardt, JVM pre v7'nin dinamik dilleri (bir dereceye kadar) tolere ettiği konusunda anlaşabilir miyiz ? :-)
Péter Török

1
Bu koymak için iyi bir yoldur :)
Michael Borgwardt

3

JVM gibi bir sanal makine, genellikle dosyalar, bir dizi basit talimat (genellikle gerçek CPU talimatlarına dönüştürmek kolaydır) olarak kabul eden ve bunları yerel CPU talimatları olarak derleyen ve çalıştıran bir programdır (genellikle HotSpot veya JIT gibi isteğe bağlı bir derleyici).

Aslında bir soyutlama katmanı. VM komut seti uygulamalarını, çeşitli benzerlikler (yığın tabanlı olma gibi) nedeniyle farklı işlemci mimarilerine taşımak genellikle daha kolaydır. Modern programlama dillerine ilkel CPU talimatlarından daha fazla yönelik olduğu için farklı programlama dillerini VM talimatlarına taşımak da çok daha kolaydır. JVM ve CLR (.NET) gibi birçok Sanal Makine, sanal yöntemleri çağırmak ve nesne örnekleri oluşturmak için talimatlar içerir.

Örneğin bir dil alalım. Buna MyLanguage deyin. Bir programlama dili olduğundan, sonuçta bazı CPU mimarisi talimatlarını derler. Bu, uyumlu, esnek bir Sanal Makine komut kümesi verildiğinde, MyLanguage'i bu VM'nin talimatlarından oluşan bir sete derlemek de mümkün olduğu anlamına gelir.

Her zaman verimlilik sorusu vardır, çünkü VM komut setlerinde yerel olarak yapmanız gerekmeyecek bazı geçici çözümleri kesmek zorunda kalabilirsiniz, ancak yine de mümkündür.


3

JVM bir Turing-komple hesaplama makinesidir (sınırlı bellek hariç) ve herhangi bir Turing-complete makinesi (fiziksel veya sanal) herhangi bir programlama dilini yürütebilir (bellek, performans ve fiziksel IO sınırlamaları hariç).


Ee ... neden derleyiciye ihtiyacımız var? ;-)
Péter Török

Derleyiciler ve tercümanlar, Turing makinelerinde (belki de yavaşça) çalışabilirler. Belki de bazı ön derleme / çeviri adımları, belirli bir programı belirli bir dilde çalıştırma performansını artırabilir?
hotpaw2

1
Demek istediğim, "herhangi bir Turing-complete makinesinin (fiziksel veya sanal) herhangi bir programlama dilini yürütebilir" ifadesinin tam anlamıyla, dizüstü bilgisayarımın x86 CPU'sunun şu anda üzerinde çalıştığım bu güzel Java kaynak dosyasını doğrudan çalıştırabileceği anlamına geliyordu. Veya PowerPC işlemciler için makine kodu. Derleyici olmadan - CPU'lar derleyici içermiyor değil mi? :-)
Péter Török

"Makineniz" sadece CPU'dan daha fazlasıdır.
hotpaw2

1
@ PéterTörök Demek istediğini anlıyorum. Bizim gibi VM'ler üzerinde durmadı. Ama bence cevabı hala OP'nin sorusuna kısaca cevap veriyor. JVM, diğer programlama dillerini "çalıştırabilir" çünkü herhangi bir programlama dilini "çalıştırabilir", çünkü Turing tamamlandı. Ayrıntılı değil belki de özlü ve geçerli bir nokta. :)
Yam Marcovic

2

Bir an için JVM'yi kendi talimatı belki x86 gibi ayarlanmış bir işlemci olarak düşünün. İşlemci, makine dilinde derlenmiş olan C kodunu yürütebilir. JVM'ye aynı benzetmeyi uygulayarak, diğer diller JVM'de, diğer dillerdeki gibi, bu diller JVM'nin makine talimatlarına göre derlenmişse yürütülebilir. JVM daha sonra X dili için bu talimatları çalıştırabilir.


benzetmeniz güzel
cobi
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.