Tam zamanında (JIT) derleyici ne yapar?


Yanıtlar:


518

Bir JIT derleyicisi , program başladıktan sonra çalışır ve kodu (genellikle bayt kodu veya bir çeşit VM talimatı) anında (veya tam zamanında çağrıldığında) genellikle daha hızlı olan bir forma derler. komut seti. JIT, dinamik çalışma zamanı bilgilerine erişirken, standart bir derleyici sık kullanılan satır içi işlevler gibi daha iyi optimizasyonlar yapmaz ve daha iyi optimizasyonlar yapabilir.

Bu, program ilk çalıştırmadan önce tüm kodu makine diline derleyen geleneksel bir derleyicinin aksine .

Paraphrase için, geleneksel derleyiciler tüm programı ilk çalıştırmadan ÖNCE bir EXE dosyası olarak oluşturur. Daha yeni stil programları için sözde kod (p-kodu) ile bir derleme oluşturulur. Programı yalnızca işletim sisteminde yürüttüğünüz SONRA (örn., Simgesine çift tıklayarak) (JIT) derleyici devreye girecek ve Intel tabanlı işlemcinin veya anlayacağı her şeyin makine kodunu (m kodu) oluşturacaktır.


16
Ve yorumlanmış kodun aksine, bayt kodu veya VM talimatlarını hemen gecikmeden çalıştırmaya başlar, ancak talimatları makine dilinden daha yavaş çalıştırır.
Aaron

3
Bir JIT genellikle yorumlanmış kod ile makine diline dönüştürmek için kullanılır, ancak evet, tamamen yorumlanmış kod (herhangi bir JITting olmadan) yavaştır. JITter olmadan Java bayt kodu bile gerçekten yavaştır.
Mark Cidade

48
Hedefin makine kodu olması gerekmez. JRuby, birkaç çağrının ardından Ruby kaynak kodunu Java bayt koduna derleyecek bir JIT derleyicisine sahiptir. Ardından, başka bir kaç çağrının ardından JVM JIT derleyicisi devreye girer ve bayt kodunu yerel koda derler.
Jörg W Mittag

4
Jörg tarafından belirtildiği gibi, JIT'in hemen çağrılması gerekmediğini belirtmek gerekir. Genellikle kod, JITting değerine değeceği belirlenene kadar yorumlanır. JITting gecikmelerine yol açabilir beri, daha hızlı olabilir DEĞİL nadiren kullanılır ve böylece hızlı yanıt genel çalışma zamanı daha önemli ise JIT bazı kodu.
Adam Jaskiewicz

3
@ErikReppen: Yeni bir makine çıkarsa, geleneksel bir derleyici kullanarak yeni bir makine için bir program derlemek ve optimize etmek, muhtemelen bir JIT'den daha hızlı sonuç verecektir. Öte yandan, bu yeni makine için optimize edilmiş bir JIT , yeni makine icat edilmeden önce yayınlanan kodun performansını optimize edebilecektir .
supercat

255

Başlangıçta, bir derleyici, üst düzey bir dili (montajcıdan daha yüksek seviye olarak tanımlanır) nesne koduna (makine talimatları) dönüştürmekten sorumluydu; bu daha sonra (bir bağlayıcı tarafından) yürütülebilir bir dosyaya bağlanacaktı.

Dillerin evriminin bir noktasında, derleyiciler, daha sonra programınızı çalıştırmak için yorumlanacak (bir tercüman tarafından) sözde koda yüksek seviyeli bir dil derleyecektir. Bu, nesne kodunu ve yürütülebilir dosyaları ortadan kaldırdı ve bu dillerin birden fazla işletim sistemine ve donanım platformuna taşınabilir olmasını sağladı. Pascal (P-Code'a derlenen) ilklerden biriydi; Java ve C # daha yeni örneklerdir. Sonuç olarak, sözde işlemlerin çoğu bayt uzunluğunda olduğu için P-Code terimi bayt kodu ile değiştirildi.

Just-In-Time (JIT) derleyicisi, çalışma zamanı yorumlayıcısının, bir yöntem her çağrıldığında bayt kodunu yorumlamak yerine, bayt kodunu çalışan makinenin makine kodu yönergelerinde derleyeceği ve bunu çağıracağı bir özelliktir. bunun yerine nesne kodu. İdeal olarak, nesne kodunun çalıştırılmasının etkinliği, programı her çalıştığında yeniden derlemenin verimsizliğinin üstesinden gelecektir.


5
Ancak bu "Just-In-Time (JIT) derleyicisi çalışma zamanı yorumlayıcısının bir özelliğidir" ifadesi karışıklığa neden olur; ör. - stackoverflow.com/questions/16439512/…
Stephen C

11
Aslında, JIT bir eklentiydi ve Java'ya -Xint parametresini kullanarak yine de devre dışı bırakabilirsiniz, bu sadece bir özelliktir.
Craig Trader

3
Tamamen katılmıyorum. JIT evrim değildir - klasik derleyicilere alternatiftir.
i486

1
JIT, akıllı kablo tesisatına mekanik anahtarlardan akıllı telefona "OK Google" diyerek arama kriterleri belirlemeye kadar uzanan bir adımdır. Java 7/8'in bir parçası olarak mevcut olan JIT, Java 2'nin bir parçası olarak mevcut olanın ötesine sıçradı ve sınırlar - bu da evrim.
Craig Trader

1
@ i486 - Sun / Oracle, (AFAIK) hiçbir zaman yerel kod üreten Java için klasik ("vaktinden önce") bir derleyici göndermemiştir. JIT'in bir alternatif olduğunu iddia etmek bir gerginlik ... şey olduğunda, bunun için bir alternatif olduğu iddia edilmedi. (GCJ AOT derleyicisini indiriyorum çünkü Sun / Oracle ile ilgisi yoktu ve tam bir çözüm de değildi. Şimdi kesinlikle geçerli değil.)
Stephen C

69

JIT-Tam zamanında kelimenin kendisi ne zaman gerekli olduğunu söyler (istek üzerine)

Tipik senaryo:

Kaynak kodu tamamen makine koduna dönüştürülür

JIT senaryosu:

Kaynak kodu, yapı [örneğin C # için IL (ara dil için), java için ByteCode] gibi montaj diline dönüştürülecektir.

Ara kod, yalnızca uygulama için gereken kodlar yalnızca makine koduna dönüştürüldüğünde makine diline dönüştürülür.

JIT vs JIT olmayan karşılaştırma:

  • JIT'de tüm kod makine koduna dönüştürülmez, ilk önce gerekli olan kodun bir kısmı makine koduna dönüştürülecektir, daha sonra çağrılan bir yöntem veya işlevsellik makinede değilse, makine koduna dönüştürülecektir ... CPU yükü.

  • Makine kodu çalışma zamanında üretileceğinden ... JIT derleyicisi, makinenin CPU mimarisini çalıştırmak için optimize edilmiş makine kodu üretir.

JIT Örnekleri:

  1. Java'da JIT JVM'de (Java Sanal Makinesi)
  2. C # 'da CLR (Ortak Dil Çalışma Zamanı)
  3. Android'de DVM (Dalvik Sanal Makine) veya ART (Android RunTime) daha yeni sürümlerde.

7
JIT, gerçek jenerik türleri destekleyen çerçevelerde bazı özel avantajlar sunar; her biri farklı makine kodu gerektirecek, ancak gerçekten üretilen türler için sadece JIT kodu üretecek olan, sınırsız bir tür aralığı üretebilecek genel bir yöntem tanımlamak mümkündür. Buna karşılık, C ++ 'da derleyicinin bir programın kullanacağı tüm tipler için kod üretmesi gerekir.
supercat

6
JVM, kodu ilk kez çalıştırdığında JIT kodunu vermez. İlk birkaç kez bayt kodunu yorumlar. Daha sonra, bu kod yeterince sık çalışırsa, JITting'i rahatsız etmeye karar verebilir.
ninjalj

1
Java'daki JIT'in JVM olduğunu söylüyorsunuz. Ancak derlenmiş kodu zaten JVM'ye veriyoruz, değil mi? Sonra tekrar derler mi demek istediniz?
Koray Tugay

@KorayTugay - JVM'ye Bytecodes sağlıyoruz ve JVM bunun bir kısmını talep üzerine makine koduna dönüştürecek. Böylece kaynaklar kaydedilecek.
Durai Amuthan.H

1
Java'da JIT JVM değildir. Sadece bir parçası.
01

25

Diğerlerinin de belirttiği gibi

JIT, Tam Zamanında anlamına gelir; bu, kodun çalışma zamanından önce değil gerektiğinde derlendiği anlamına gelir.

Sadece yukarıdaki tartışmaya bir nokta eklemek için JVM bir fonksiyonun kaç kez yürütüldüğünü saymaktadır. Bu sayı önceden tanımlanmış bir sınırı aşarsa, JIT kodu doğrudan işlemci tarafından çalıştırılabilen makine diline derler (javac'ın kodu bayt koduna ve sonra java'ya derlediği normal durumun aksine - yorumlayıcı bu bayt kod satır satır çevirir makine kodu ve yürütür).

Ayrıca bu fonksiyon bir daha hesaplandığında, kodun tekrar satır satır yorumlandığı normal yorumlamanın aksine aynı derlenmiş kod tekrar yürütülür. Bu, yürütmeyi daha hızlı hale getirir.


14

JIT derleyicisi, bayt kodunu yalnızca ilk yürütme sırasında eşdeğer yerel koda derler. Art arda yapılan her yürütmede JVM, performansı optimize etmek için yalnızca önceden derlenmiş yerel kodu kullanır.

resim açıklamasını buraya girin

JIT derleyicisi olmadan, JVM yorumlayıcısı bayt kodunu satır satır çevirerek yerel bir uygulamanın yürütülüyormuş gibi görünmesini sağlar.

resim açıklamasını buraya girin

Kaynak


1
JIT yorumum, sık kullanılan işlevlerin 'saklandığı' ve java bayt kodundan yerel ISA'ya bağımlı koda derleme masrafının atlandığı notlama gibi davranmasıdır. Bu doğruysa, java neden baştan yerel kodla tamamen derlenmiyor? Bu, herhangi bir çalışma zamanı derlemesini azaltır ve makineyi java 'yerli' yapar mı?
Michael Choi

12

JIT, Tam Zamanında anlamına gelir; bu, kodun çalışma zamanından önce değil gerektiğinde derlendiği anlamına gelir.

Bu yararlıdır, çünkü derleyici makineniz için optimize edilmiş kod üretebilir. Statik bir derleyici, ortalama C derleyiciniz gibi, tüm kodları geliştiricinin makinesindeki yürütülebilir koda derler. Böylece derleyici bazı varsayımlara dayalı optimizasyonlar yapacaktır. Daha yavaş derlenebilir ve daha fazla optimizasyon yapabilir, çünkü programın kullanıcı için yürütülmesini yavaşlatmaz.


Neden derlenmiş kodlar kullanıcının bilgisayarında bir yerde saklanmıyor, bu yüzden uygulama bir daha çalıştırıldığında JIT bunları yeniden derlemek zorunda kalmıyor?
omerfarukdogan

İyi gözlemler. Bunu yapmak mümkündür, ancak gerçekten yararlı olup olmadığı, uygulamanın platformuna ve kullanımına bağlıdır. JIT optimizasyonu mutlaka çevrimdışı veya zaman optimizasyonuyla aynı değildir, bu nedenle fayda sadece 'JITting' olmayabilir ve bu çok yardımcı olabilir veya olmayabilir.
Brian Lyttle

9

Java derleyicisi tarafından (mimari nötr olan) bayt kodu oluşturulduktan sonra, yürütme JVM (Java'da) tarafından işlenir. Bayt kodu yükleyici tarafından JVM'ye yüklenecek ve daha sonra her bayt talimatı yorumlanacaktır.

Bir yöntemi birden çok kez çağırmamız gerektiğinde, aynı kodu birçok kez yorumlamamız gerekir ve bu işlem gerektiğinden daha fazla zaman alabilir. Yani JIT (tam zamanında) derleyicileri var. Bayt JVM'ye (çalışma süresi) yüklendiğinde, kodun tamamı yorumlanmak yerine derlenecek ve böylece zamandan tasarruf edilecektir.

JIT derleyicileri sadece çalışma zamanında çalışır, bu nedenle herhangi bir ikili çıkışımız yoktur.


2
JVM'ye yüklendiğinde kodun tamamı derlenmez, çünkü derleme hakkında nasıl gideceğiniz hakkında çok az bilgi (okuma: kılavuz) vardır. Performansın nihai hedef olduğunu unutmayın. JIT oldukça seçicidir: optimizasyon için en popüler yöntemleri izlemek ve seçmek. Ve bireysel yöntemler için maksimum optimizasyon seviyesine ulaşılana kadar bunu yapmaya devam eder.
Yaw Boakye

7

Tam Zamanında Derleyici (JIT):
Java bayt kodlarını ilgili CPU'nun makine talimatlarında derler.

Örneğin, java kodumuzda bir döngü ifadesi varsa:

while(i<10){
    // ...
    a=a+i;
    // ...
 }

İ'nin değeri 0 ise yukarıdaki döngü kodu 10 kez çalışır.

Bayt kodunu tekrar tekrar 10 kez derlemeye gerek yoktur, çünkü aynı talimat 10 kez yürütülür. Bu durumda, bu kodu yalnızca bir kez derlemek gerekir ve değer gerekli sayıda değiştirilebilir. Bu nedenle, Tam Zamanında (JIT) Derleyici bu tür ifadeleri ve yöntemleri (daha önce yukarıda belirtildiği gibi) izler ve daha iyi performans için bu bayt kodu parçalarını makine kodunda derler.

Bir başka benzer örnek, dizeler / cümleler listesindeki "Normal İfade" kullanarak bir model aramasıdır.

JIT Derleyicisi tüm kodu makine koduna derlemez. Çalışma zamanında benzer bir desene sahip olan kodu derler.

Daha fazla bilgi için JIT'i Anlama hakkındaki bu Oracle belgelerine bakın .


"Aynı komut 10 kez çalıştırılacağı için bayt kodunu tekrar tekrar 10 kez derlemeye gerek yoktur" - normal derleyici ne olacak? Bu parçayı birkaç kez derliyor mu?
TT_

4

Bazı IL (ara dil) içine derlenmiş kodunuz var. Programınızı çalıştırdığınızda, bilgisayar bu kodu anlamıyor. Yalnızca yerel kodu anlar. Böylece JIT derleyicisi IL'nizi anında yerel koda derler. Bunu yöntem düzeyinde yapar.


2
Ne demek "yöntem seviyesi"?
Koray Tugay

4

Bu eski bir iş parçacığı olduğunu biliyorum, ama çalışma zamanı optimizasyonu burada tartışılan görünmüyordu JIT derleme başka önemli bir parçasıdır. Temel olarak, JIT derleyicisi yürütme geliştirmek için yollar belirlemek için çalışırken programı izleyebilirsiniz. Ardından, çalışma sırasında bu değişiklikleri anında yapabilir. Google JIT optimizasyonu (javaworld'ün bu konuda oldukça iyi bir makalesi var. )


3

Tam zamanında derleyici (JIT), çalıştırılamayan bir girdi alan ve yürütülecek uygun makine kodunu döndüren bir yazılım parçasıdır. Örneğin:

Intermediate representation    JIT    Native machine code for the current CPU architecture

     Java bytecode            --->        machine code
     Javascript (run with V8) --->        machine code

Bunun sonucu, belirli bir CPU mimarisi için uygun JIT derleyicisinin kurulması gerektiğidir.

Fark derleyici, yorumlayıcı ve JIT

Kaynak kodunu makine koduna dönüştürmek istediğimizde genel olarak istisnalar olabilir, ancak şunları kullanabiliriz:

  1. Derleyici : Kaynak kodu alır ve yürütülebilir bir dosya döndürür
  2. Tercüman : Program talimatını talimatla yürütür. Kaynak kodun yürütülebilir bir bölümünü alır ve bu bölümü makine yönergelerine dönüştürür. Tüm kaynak kodu makine talimatlarına dönüştürülüp yürütülene kadar bu işlem tekrarlanır.
  3. JIT : Bir JIT'in birçok farklı uygulaması mümkündür, ancak JIT genellikle bir compliler ve bir tercümanın birleşimidir. JIT ilk olarak aldığı aracı verileri (örn. Java bayt kodu) yorumlama yoluyla makine diline çevirir. JIT genellikle kodun belirli bir bölümünün sık sık yürütüldüğünü algılar ve daha hızlı yürütmek için bu bölümü derler.

2

Jit tam zamanında derleyicidir jit, java bayt kodunu doğrudan işlemciye gönderilebilen talimatlara dönüştüren bir programdır.

Java'yı tam zamanında derleyici (gerçekten ikinci bir derleyici) kullanarak belirli bir sistem platformunda bayt kodunu belirli sistem koduna uyarlar, kod jit karşılaştırıcısı tarafından yeniden derlendikten sonra, genellikle bilgisayarda daha hızlı çalışır.

Tam zamanında derleyici sanal makine ile birlikte gelir ve isteğe bağlı olarak kullanılır. Bayt kodunu, derhal yürütülen platforma özgü yürütülebilir kodda derler.


2

Sadece-zamanında (tam zamanında) derleme, (dinamik için veya çalışma zamanı derleme), a, bilgisayar programı yürütme şekli yürütülmesi sırasında derleme içeren çalışma zamanında - - bir programın yerine yürütülmesinden önce .

BT derlemesi, makine koduna çeviriye yönelik iki geleneksel yaklaşımın - vaktinden önce derleme (AOT) ve yorumlama - birleşimidir ve her ikisinin de bazı avantajlarını ve dezavantajlarını birleştirir. JIT derlemesi derlenmiş kodun hızını yorumlama esnekliği ile birleştirir .

JVM'de kullanılan JIT'i ele alalım,

Örneğin, HotSpot JVM JIT derleyicileri dinamik optimizasyonlar üretir. Başka bir deyişle, Java uygulaması çalışırken optimizasyon kararları verir ve yüksek performanslı yerel makine talimatları oluşturur verir ve temel sistem mimarisini hedefleyen .

Derleme için bir yöntem seçildiğinde, JVM bayt kodunu Just-In-Time derleyicisine (JIT) besler. JIT, yöntemi doğru bir şekilde derlemeden önce bayt kodunun anlambilimini ve sözdizimini anlamalıdır. JIT derleyicisinin yöntemi analiz etmesine yardımcı olmak için, bayt kodu ilk olarak izleme kodları adı verilen ve makine kodunu bayt kodundan daha yakından benzeyen dahili bir sunumda yeniden formüle edilir. Analiz ve optimizasyonlar daha sonra yöntemin ağaçları üzerinde gerçekleştirilir. Sonunda, ağaçlar yerel koda çevrilir.

İzleme ağacı, programlama kodunun çalışma zamanı derlemesinde kullanılan bir veri yapısıdır. İzleme ağaçları, sıcak noktalar sırasında kod yürütülmesini izleyen ve derleyen bir tür 'tam zamanında derleyicide' kullanılır. Bakın bu .

Bakınız:


1

JIT olmayan bir derleyici kaynak kodunu alır ve derleme sırasında makineye özel bayt koduna dönüştürür. Bir JIT derleyicisi, derleme zamanında oluşturulan makine agnostik bayt kodunu alır ve çalışma zamanında makineye özgü bayt koduna dönüştürür. Java'nın kullandığı JIT derleyicisi, tek bir ikilinin çok sayıda platformda değişiklik yapmadan çalışmasına izin veren şeydir.


0

Bayt kodunun% 20'si zamanın% 80'ini kullanır. JIT derleyicisi bu istatistikleri alır ve satır içi yöntemleri ekleyerek, kullanılmayan kilitleri kaldırarak vb. Ve bu makineye özgü bayt kodunu oluşturarak bayt kodunun bu% 20'sini daha hızlı çalışacak şekilde optimize eder. Bu makaleden alıntı yapıyorum, kullanışlı olduğunu buldum. http://java.dzone.com/articles/just-time-compiler-jit-hotspot


Bunun neden -1 olarak işaretlendiğinden emin değilim. Buradaki nokta, çalışma zamanı istatistiklerinin optimizasyona yardımcı olması olduğunu düşünüyorum.
eze

Evet, ama cevap böyle ifade etmedi. Kelimenin tam anlamıyla, JIT kodun en sıcak% 20'sini optimize etmez.
mabraham

0

JIT, birkaç JVM uygulamasında, daha hızlı ancak daha fazla bellek gerektiren bir yürütme motorunu tam zamanında kullanan bir derleyicidir. Bu şemada, bir yöntemin bayt kodları, yöntemin ilk çağrılmasında yerel makine koduna derlenir. Daha sonra yöntemin yerel makine kodu önbelleğe alınır, böylece aynı yöntem bir sonraki çağrıldığında tekrar kullanılabilir.


2
Yeni / daha iyi bir şey sağlamazsanız böyle bir soruya cevap vermekten kaçınırım. Herhangi bir tepki alırsanız, bu muhtemelen bir aşağılık veya eleştiridir: Cevabınız kesin değildir. "JIT" bir Java Sanal Makinesi ile sınırlı değildir , "daha hızlıdır ancak daha fazla bellek kullanır" olası bir etkidir, ancak JIT kavramının doğasında bulunmaz ve yöntemler genellikle ilk çağrışımda derlenmez; JIT'ing için harcanan zaman genel olarak avantajlıdır.
zapl

0

JVM aslında performans nedenleriyle çalışma zamanı sırasında derleme adımları gerçekleştirir. Bu, Java'nın temiz bir derleme yürütme ayrımına sahip olmadığı anlamına gelir. İlk olarak Java kaynak kodundan bayt koduna statik derleme yapar. Sonra bu bayt kodu yürütme için JVM'ye geçirilir. Ancak bayt kodunun yürütülmesi yavaştır, bu nedenle JVM, bayt kodunun ne sıklıkta çalıştırıldığını ölçer ve çok sık çalışan bir "hotspot" kodu algıladığında, bayt koddan "hotspot" kodunun (hotspot profiler) makine koduna kadar dinamik derleme gerçekleştirir. Bu nedenle, günümüzde Java programları makine kodu yürütme ile çalıştırılmaktadır.


0

JIT derleyicisi olarak da bilinen Just In Time derleyicisi Java'da performans iyileştirmesi için kullanılır. Varsayılan olarak etkindir. Derleme, daha erken yürütme zamanında yapılır. Java, JIT derleyicisinin kullanımını JVM'ye dahil ederek popüler hale getirdi.

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.