Java Derlenmiş veya Yorumlanmış bir programlama dili midir?


169

Geçmişte programlama dili olarak C ++ kullandım. C ++ ile yazılmış kod nesne kodu "makine kodu" haline gelene kadar bir derleme işlemi geçer biliyorum.

Java'nın bu açıdan nasıl çalıştığını bilmek istiyorum. Kullanıcı tarafından yazılan Java kodu bilgisayar tarafından nasıl çalıştırılır?


14
C ++ yorumlanabilir. Orada birkaç C tercümanı var.
Tom Hawtin - tackline

Yanıtlar:


220

Java uygulamaları genellikle iki adımlı bir derleme işlemi kullanır. Java kaynak kodu, Java derleyicisi tarafından bayt koduna derlenir . Bayt kodu bir Java Sanal Makinesi (JVM) tarafından yürütülür. Modern JVM'ler , bayt kodunu çalışma zamanında anında donanım CPU'su tarafından anlaşılan yerel talimatlara derlemek için Just-in-Time (JIT) derlemesi adı verilen bir teknik kullanır .

Bazı JVM uygulamaları, JIT yerine bayt kodunu makine koduna derleyip doğrudan çalıştırmayı seçebilir. Bu hala bir "yorumlayıcı" olarak kabul edilirken, üst düzey kaynak kodunu okuyan ve yürüten yorumculardan oldukça farklıdır (yani, bu durumda, Java kaynak kodu doğrudan yorumlanmaz, Java derleyicisinin çıktısı, bayt kodu, çıkışıdır.)

Java'yı vaktinden önce yerel koda derlemek ve elde edilen ikili dosyayı çalıştırmak teknik olarak mümkündür. Java kodunu doğrudan yorumlamak da mümkündür.

Özetlemek gerekirse, yürütme ortamına bağlı olarak bayt kodu şunlar olabilir:

  • önceden derlenmiş ve yerel kod olarak çalıştırılmıştır (çoğu C ++ derleyicisine benzer)
  • tam zamanında derlendi ve idam edildi
  • yorumlanır
  • desteklenen bir işlemci tarafından doğrudan yürütülür (bayt kodu bazı CPU'ların yerel komut kümesidir)

20
Aslında, bazı HotSpot JVM'leri bayt kodlarını yorumlayarak başlar ve bunları yalnızca derlemeye değer olan şeyleri anladıktan ve kodun nasıl çalıştırıldığına dair bazı istatistikler topladıktan sonra yerel koda derler; örneğin, her bir koşullu dalda en yaygın yolu bulmak.
Stephen C

1
Dolayısıyla 'Hotspot' terimi: Bir optimizasyon elde etmek için sık sık çalışmakta olana yapar.
Öğlen İpek

4
Yorumlayıcıyı HotSpot'ta -Xcomp ile kapatabilirsiniz. Ne kadar kötü bir fikir olduğunu görmek için bir uygulama üzerinde denemeye değer.
Tom Hawtin - tackline

1
"Sun HotSpot JVM'nin geçerli sürümü, bayt kodunu çalışma zamanında anında CPU tarafından anlaşılan yerel talimatlara derlemek için Just-in-time (JIT) derlemesi adlı bir teknik kullanır." JVM'nin bir tercüman olduğu izlenimi altındaydım, ancak bayt kodunu daha da derlediğini gösteriyor. Kafam karıştı. Ayrıca çalışma zamanında anında yaptığı yazılmıştır. Birisi bunu da açıklayabilir mi?
Anand

java yorumlanmış bir dil olduğundan, performansı veya herhangi bir java uygulaması yürütmesini nasıl etkileyecektir
NAND

94

resim açıklamasını buraya girin

Java ile yazılmış kod:

  • İlk olarak yukarıdaki görüntünün sol bölümünde gösterildiği gibi javac adı verilen bir program tarafından bayt koduna derlendi ;
  • Daha sonra, yukarıdaki görüntünün sağ bölümünde gösterildiği gibi, java adlı başka bir program Java çalışma zamanı ortamını başlatır ve Java Yorumlayıcı / JIT Derleyicisi'ni kullanarak bayt kodunu derleyebilir ve / veya yorumlayabilir .

Java bayt kodunu ne zaman yorumlar ve ne zaman derler? Uygulama kodu başlangıçta yorumlanır, ancak JVM hangi bayt kod dizilerinin sık sık yürütüldüğünü izler ve bunları donanımda doğrudan yürütmek için makine koduna çevirir. Sadece birkaç kez yürütülen bayt kodu için bu derleme zamanından tasarruf sağlar ve başlangıç ​​gecikmesini azaltır; sık çalıştırılan bayt kodu için JIT derlemesi, yavaş yorumlamanın ilk aşamasından sonra yüksek hızda çalıştırmak için kullanılır. Ayrıca, bir program çoğu zaman kodunun bir azınlığını yürütmek için harcadığından, derleme süresinin azalması önemlidir. Son olarak, ilk kod yorumlaması sırasında, daha iyi optimizasyon yapılmasına yardımcı olan derleme öncesinde yürütme istatistikleri toplanabilir.


Java'nın çok fazla bellek kullandığı önbellek bayt kodundan mı kaynaklanıyor?
Pedro Gordo

3
@sedulam: 'Çok fazla bellek' bulanık bir ifadedir. Java'nın bellek yönetimi oldukça basittir - Üç nesil, JVM'nin nesnelerinin oluşturulması ve bakımı için kullandığı şeydir. Bu başka bir SO yanıtı sizin için yararlı olabilir.
displayName

Yukarıdaki açıklama ile teorik olarak, C ++ derlenmiş kodu her zaman mantıksal olarak benzer java kodundan daha hızlı olacaktır, çünkü .class dosyasının her zaman JIT'in makine koduna dönüştürmemeye karar verdiği bir kısmı olacaktır. Başka bir deyişle, java hiçbir zaman C ++ 'nın gösterdiği çıplak metal yürütme hızını yakalayamaz. Bu doğru bir varsayım mı?
DevdattaK

@DevdattaK: Ben C ++ çok fazla bilmiyorum ama benim tahminim daha küçük ve özel programlar için Java size daha hızlı sonuç verebilir çünkü çok fazla hız bulunmayan kod bölümlerini derlemek için zaman kaybetmezdi.
displayName

1
@DevdattaK varsayımınız bu wiki sayfasında en.m.wikipedia.org/wiki/Java_performance?wprov=sfla1 Kısacası, her zaman doğru değildir.
Sundar Rajan

58

"Yorumlanan dil" veya "derlenen dil" terimleri bir anlam ifade etmez, çünkü herhangi bir programlama dili yorumlanabilir ve / veya derlenebilir.

Java'nın mevcut uygulamalarına gelince, çoğu bayt kodlama için bir derleme adımı içerir, bu yüzden derlemeyi içerir. Çalışma zamanı da bayt kodunu dinamik olarak yükleyebilir, bu nedenle her zaman bir bayt kodu yorumlayıcı biçimi gerekir. Bu yorumlayıcı yerel kod için dahili olarak derleme kullanabilir veya kullanamaz.

Bu günlerde kısmi tam zamanında derleme, bir zamanlar "yorumlanmış" olarak kabul edilen birçok dil için, örneğin JavaScript'te kullanılmaktadır.


5
Ayrıca, Google'ın V8 JavaScript Yürütme Motoru yalnızca kısmi tam zamanında derleme yapmakla kalmaz. O zaman aslında, V8 bile gelmez, yerel kodu derler sahip bir tercüman. Bu sahiptir sadece derleyici (Maxine benzer, ancak Maxine aksine V8 tek derleyicisi vardır). Bu örneklerin üçü de (GCJ, Maxine ve V8) daha güçlü bir şekilde ispatlamaktadır: Yorumlanmış bir dil veya derlenmiş bir dil diye bir şey yoktur. Bir dil yorumlanmaz veya derlenmez. Bir dil sadece bir (Bu aslında Shriram Krishnamurthi tarafından bir alıntı).
Jörg W Mittag

3
Neden bir java sorusundaki javascript hakkında konuşuyorsunuz?
Koray Tugay

1
@KorayTugay Örnek olarak. Java ve Javascript'in adlarının ilk dört harfinden başka ortak bir şeyleri olduğunu ima etmek istemiyorum.
starblue

Yorumlanmış ve derlenmiş dilde en azından bir fark, derlenmiş bir dil ikili dosyasının yürütme akışının herhangi bir zamanda değiştirilemeyeceği anlamına gelmezken, yorumlanmış bir dil, mevcut işlevlerin bazılarına çok itaatkar mı? C'deki kütüphaneler bir seçenektir, diğer dillerde ise C ikili uzantısı olmayan ve güncellenebilen veya başka bir platformda tamamen farklı bir kod olabilecek bir dizi nesneniz olamaz. Komut dosyası dili her ikisinde de çalışabilirken, derlenmiş dilin çalışması için farklı bir ikili dosya gerekir
Eaton Emmerich

53

Java, daha sonra onu yorumlayan Java VM'ye giren bayt koduna derlenir.


33
... ama kesinlikle doğru değil.
Stephen C

2
JVM bayt kodunu "yorumlamamayı" seçebilir. JIT derleyebilir ve doğrudan yürütebilir.
Mehrdad Afshari

1
JIT teknik olarak doğrudan yürütmüyor. Sadece nasıl idam edildiğini hatırlıyor.
cletus

Mehrdad: Katılıyorum, JVM'ye kadar düşündüğüm için muhtemelen JIT operasyonlarını burada tarif etmedim ve yine de cevabımı basit tutuyordum :)
Noon Silk

7
cletus: JIT'den sonra doğrudan yürütülür. JIT bir parça bayt kodu okuyor (örn. Tam bir yöntem) ve makine koduna derliyor ve buna atlıyor.
Mehrdad Afshari

12

Java derlenmiş bir programlama dilidir, ancak doğrudan yürütülebilir makine koduna derlemek yerine, JVM bayt kodu adı verilen bir ara ikili forma derler. Bayt kodu daha sonra programı çalıştırmak için derlenir ve / veya yorumlanır.


11

Her ikisi de. Öncelikle java, bayt koduna derlendi (bazıları "çevrilmiş" demeyi tercih eder), daha sonra JIT'in ruh haline bağlı olarak derlenir veya yorumlanır.


32
Bu, ruh halleri geliştirmek için gelişmiş bir yazılım parçası :)
Thorarin

5
JIT gerçekten de zamanın ilerleyen bir derleyicisinin yapamayacağı çalışma zamanı bilgilerine (profiler gibi) dayalı optimizasyonlar yapabilen çok karmaşık bir yazılım parçasıdır (çünkü çalışma zamanının davranışı hakkında bilgi sahibi değildir. önceden program). Ama muhtemelen gerçekten ruh halleri yok ... :-)
Jesper

5

Java hem derleme hem de yorumlama yapar,

Java'da programlar yürütülebilir dosyalara derlenmez ; onlar olan bayt koduna derlenmiş (daha önce anlatıldığı gibi), hangi JVM (Java Virtual Machine) zamanında yorumlayıp / yürütür. Java derleyicisini kullandığımızda Java kaynak kodu bayt koduna derlenir. Bayt kodu, .class dosya uzantısına sahip diske kaydedilir .

Program çalıştırılacak olduğunda, dönüştürülür bytekod bayt kodu olabilir sadece zamanında (tam zamanında) derleyici kullanılarak dönüştürülebilir. Sonuç, daha sonra belleğe beslenen ve yürütülen makine kodudur.

Javac , Java kodunu Bytecode olarak derleyen Java Derleyicisidir . JVM, Bytecode'u Yerel Makine Koduna dönüştüren / çalıştıran / yorumlayan Java Sanal Makinesi'dir. Java'da yorumlanmış bir dil olarak kabul edilmesine rağmen, bayt kodu JVM'deyken JIT (Tam Zamanında) derlemesini kullanabilir. JIT derleyicisi, birçok bölümdeki (veya tam olarak, nadiren) bayt kodlarını okur ve programın daha hızlı çalışabilmesi için dinamik olarak makine koduna derler ve daha sonra yeniden derlenmeye gerek kalmadan önbelleğe alınır ve yeniden kullanılır. Böylece JIT derlemesi, derlenmiş kodun hızını yorumlama esnekliği ile birleştirir.

Bir yorumlanmış dil önceden makine dili talimatları içine bir program derleme olmadan, kendi uygulamalarının çoğu doğrudan ve özgürce komutlarını yerine hangi dili programlama türüdür. Yorumlayıcı programı doğrudan yürütür ve her bir ifadeyi makine kodunda derlenmiş olan bir veya daha fazla alt rutinin bir sırasına dönüştürür.

Bir Derlenmiş dil (ön-çalışma zamanı için gerçekleşir kaynak kodu adım adım uygulayıcıları) olan uygulamaları, tipik olarak derleyici (kaynak kodundan makine kodu üretmek çevirmen), ve sözlü olan bir programlama dili

Java gibi modern programlama dili uygulamalarında, bir platformun her iki seçeneği de sunması giderek daha popüler hale gelmektedir.


Olmalı “baytkodu olabilir ziyade” den dönüştürülebilir “ olan dönüştürülmüş”. Java özellikleri bayt kodunu tanımlar. Bu bayt kodunun (a) doğrudan donanımda , (b) bir yorumlayıcı aracılığıyla (c) önceden derlenmiş veya (d) çalışma anında kısmen derlenmiş olarak uygulanması tüm ayrıntılar olarak bırakılır. Bu seçeneklerin dördünün de çeşitli gerçek dünya Java uygulamaları tarafından kullanıldığını unutmayın.
Basil Bourque

Bunu işaret ettiğiniz için teşekkürler. Peki bayt kodu makine koduna dönüştürülmezse ne olur? Bayt kodunun bazı işlemciler için ayarlanmış yerel talimat olduğu ve daha sonra dönüştürmeye gerek olmadığı bir senaryo düşünebilirim. Yoksa bir şey mi kaçırıyorum.
prime

Ben verdi bağlantısını tıklayın Jazelle DBX (Doğrudan Bytecode eXecution) JVM bayt bir alt kümesi teknoloji, olduğu CPU (kinda sorta) yerli makine talimatlar. Bu olmadan, bayt kodundan (a) yorumlayıcıdan (anında), (b) derleyiciden önceden veya (c) tam zamanında bir derleyici ( önce yorumlanır ve bazen yürütme sırasında derlenir ve önbelleğe alınır).
Basil Bourque

-2

Java, yığın tabanlı olan ve birçok platformda çok hızlı uygulamaları olan Java Sanal Makinesi adlı bir platformu hedefleyen bayt derlemeli bir dildir .


1
"Byte-compiled" ne anlama geliyor?
Jesper

2
@Jesper: "Bayt-derlendi" genellikle "bayt koduna derlendi" anlamına gelir. "Bayt kodu" herhangi bir metin dışı ara kodu kapsayan (genellikle makinede çalıştırılamaz) genel bir terimdir.
Greg Hewgill

-3

Alıntı: https://blogs.oracle.com/ask-arun/entry/run_your_java_applications_faster

Uygulama geliştiricileri, uygulama kodunu bugün piyasada bulunan çeşitli işletim sistemlerinden herhangi birinde geliştirebilir. Java dili işletim sistemine bu aşamada agnostiktir. Java Uygulaması geliştiricisi tarafından yazılan parlak kaynak kodu, Java terminolojisinde İstemci Tarafı derlemesi olarak adlandırılan Java Byte koduna derlenmektedir. Java Byte koduna yönelik bu derleme, Java geliştiricilerinin 'bir kez yazmasını' sağlayan şeydir. Java Byte kodu herhangi bir uyumlu işletim sistemi ve sunucuda çalışabilir ve bu nedenle kaynak kodunu OS / Server'dan bağımsız hale getirir. Java Byte kodu oluşturma sonrasında, Java uygulaması ile temel OS / Sunucu arasındaki etkileşim daha yakındır. Yolculuk devam ediyor - Kurumsal uygulamalar çerçevesi, Java Sanal Makinesi (JVM) veya Java Çalışma Zamanı Ortamı (JRE) olarak bilinen bir çalışma zamanı ortamında bu Java Byte kodlarını yürütür. JVM, işletim sistemi ve sunucu tarafından sunulan kaynaklardan yararlandığı için, temel OS ve Donanım ile yakın bağlara sahiptir. Java Byte kodu artık platforma özgü bir makine dili yürütülebilir koduna derlenmiştir. Buna Sunucu tarafı derleme denir.

Bu yüzden Java'nın kesinlikle derlenmiş bir dil olduğunu söyleyebilirim.

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.