JIT

Vikipedi, özgür ansiklopedi

JIT (just-in-time compilation; dinamik çeviri olarak da bilinir;) bilgisayar kodunu çalıştırmanın bir yoludur.[1] Yürütülmeden önce bir program yürütülürken çalışma zamanında derleyici içerir. Genellikle bu, kaynak kodu ve daha sonradan makine diline bytecode kod çevirisini içerir ve bu kod doğrudan doğruya çalıştırılır.[2] Bir JIT derleyicisi uygulayan bir sistem genellikle yürütülen kodu sürekli olarak analiz eder, daha sonra derleme veya tekrar derlemeden elde edilen hızlanmanın bu kodun derlenmesinin yükünden daha ağır olacağı kod bölümlerini tanımlar.[3]

JIT derlemesi, makine koduna çevirı için iki geleneksel yaklaşımın birleşimidir - zamanında hazırlama derlemesi (AOT derlemesi) ve yorumlayıcı. Her ikisini de bazı avantaj ve dezavantajlarını birleştirir.[4] Kabaca, JIT derlemesi, yorumlayıcı esnekliği ile derlenmiş kodun hızını, bir yorumlayıcının yükü ve derlemenin ilave yükü ile birleştirir. JIT derlemesi dinamik derlemenin bir biçimidir ve dinamik yeniden derleme gibi uyarlanabilir optimizasyona izin verir. Bu nedenle teori olarak JIT derlemesi statik derlemeden daha hızlı yürütülebilir.[5] Yorumlama ve JIT derleme, çalışma zamanı sistemi geç veri türlerini işleyebileceğinden ve güvenlik garantilerini uygulayabildiğinden dinamik programlama dilleri için özellikle uygundur.

Uygulamalar[değiştir | kaynağı değiştir]

JIT derlemesi bazı programlara uygulanabilir veya belirli kapasitelerde, özellikle düzenli ifadeler gibi dinamik kapasitelerde kullanılabilir. Örneğin, bir metin editörü, daha hızlı bir eşlemeye izin vermek için makine koduna çalışma zamanında sağlanan normal bir ifadeyi derleyebilir; bu, yalnızca çalışma zamanında desen sağlandığından vaktinden önce yapılamaz. Birkaç modern çalışma zamanı ortamı, Microsoft'un .NET Framework sistemiy'le birlikte çoğu Java uygulaması da dahil olmak üzere, yüksek hızlı kod çalıştırma için JIT derlemesine güvenmektedir. Benzer şekilde, birçok düzenli ifade kütüphanesi bayt kodu veya makine kodu için düzenli ifadelerin JIT derlemesini içerir. Makine kodunu bir CPU mimarisinden diğerine çevirmek için bazı emülatörlerde JIT derlemesi de kullanılır.[6]

JIT derlemesinin ortak bir uygulaması ilk olarak bayt koduna (sanal makine kodu) AOT derleme, bayt kodu derleme olarak bilinir ve bayt kodunun yorumlanması yerine makinenin koduna (dinamik derleme) JIT derlemesine sahiptir. Bu, derlemeden kaynaklanan gecikme pahasına yorumlama ile karşılaştırıldığında çalışma zamanı performansını artırır.[7] JIT derleyicileri tercümanlarda olduğu gibi kesintisiz olarak tercüme eder, ancak derlenmiş kodun önbelleğe alınması verili bir çalıştırma sırasında aynı kodun gelecekteki yürütülmesinde gecikmeyi en aza indirir. Programın yalnızca bir kısmı derlendiğinden, tüm program çalıştırılmadan önce derlenenden daha az gecikme var.[8]

Genel bakış[değiştir | kaynağı değiştir]

Bir bayt kodu derlenmiş sistemde, kaynak kodu bayt kodu olarak bilinen bir ara gösterime dönüştürülür. Bytecode, herhangi bir bilgisayar için makine kodu değildir ve bilgisayar mimarileri arasında taşınabilir olabilir. Bayt kodu daha sonra bir sanal makineden yorumlanabilir veya sanal makinede çalıştırılabilir.[9] JIT derleyicisi bayt kodlarını birçok bölümde okur ve bunları dinamik olarak makine koduna derler; böylece program daha hızlı çalışabilir.

Bu, dosya başına, işlev başına veya herhangi bir keyfi kod parçası üzerinde yapılabilir; kod yürütüldüğünde (dolayısıyla "tam zamanında" adı alır) derlenebilir, ardından önbelleğe alınır ve daha sonra yeniden derlemeye gerek duymadan yeniden kullanılabilir.[10]

JIT kodu genelde tercümanlardan daha iyi bir performans sunar. Buna ek olarak, bazı durumlarda, statik derlemeden daha iyi bir performans sunabilir; çünkü birçok optimizasyon yalnızca çalıştırma zamanında yapılabilir:

  1. Derleme hedeflenen CPU'ya ve uygulamanın çalıştığı işletim sistemi modeline göre optimize edilebilir. Örneğin, JIT, CPU'nun desteklediğini algıladığında SSE2 vektör işlemci talimatlarını seçebilir. Bununla birlikte, şu anda bunu gerçekleştiren ana akım JIT yoktur. Statik bir derleyici ile bu seviyede optimizasyon özgüllüğünü elde etmek için, her bir amaçlanan platform / mimari için bir ikili derleme veya kodun bir bölümünün birden çok versiyonunu tek bir ikili içine dahil etmesi gerekir.[11]

2. Sistem, programın içinde bulunduğu ortamda gerçekte nasıl çalıştığına ilişkin istatistikleri toplayabilir, optimum performans için yeniden düzenleyebilir ve yeniden derleyebilir. Bununla birlikte, bazı statik derleyiciler, profil bilgilerini girdi olarak da alabilir.[12]

3. Sistem, dinamik bağlantı avantajlarını kaybetmeden ve statik derleyiciler ve bağlayıcılara özgü genel giderler olmadan küresel kod optimizasyonlarını (örn., Kütüphane işlevlerinin dahil edilmesi) yapabilir. Özellikle, genel satır içi ikameleri yaparken, statik bir derleme işlemi, çalışma zamanı kontrollerine ihtiyaç duyabilir.[13] Nesnenin gerçek sınıfı satır içi yöntemi geçersiz kılarsa ve dizi erişimlerine ilişkin sınır koşul kontrollerinin işlenmesi gerekebileceğinde sanal bir çağrı olmasını sağlarlar.[14] Çoğu durumda zamanında derleme ile bu işlemler döngülerin dışına taşınabilir, bu da genellikle yüksek hız artışları sağlar.

4. Bu, statik olarak derlenmiş çöp toplama dilleri ile mümkün olsa da, bir bayt kodu sistemi yürütülen kodu, daha iyi önbellek kullanımı için daha kolay bir şekilde yeniden düzenleyebilir.[15]

Microsoft'un Native Image Generator (Ngen) hizmeti, ilk gecikmeyi azaltmada başka bir yaklaşım yapır. Ngen, Ortak Ara Dil görüntüsünde makine yerel koduna bayt olarak önceden derleme yapar.[16] Sonuç olarak, çalışma zamanı derlemesine gerek yoktur. Microsoft Visual Studio 2005 ile birlikte gelen .NET framework 2.0, kurulumdan hemen sonra tüm Microsoft kitaplık DLL'lerinde Ngen'i çalıştırır. Bununla birlikte, profil destekli statik olarak derlenen kodun aşırı durumlarda JIT tarafından derlenmiş kod kadar iyi olamayacağı aynı sebeplerden ötürü JIT'lenmiş kodun kalitesi kadar iyi olmayabilir.[17]

Bir AOT (zaman öncesi) derleyiciyi bir JIT derleyicisi (Excelsior JET) veya tercüman (GNU Compiler for Java) ile birleştiren Java uygulamaları da mevcuttur.[18]

Kaynakça[değiştir | kaynağı değiştir]

  1. ^ "Arşivlenmiş kopya". 21 Nisan 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Şubat 2018. 
  2. ^ "Arşivlenmiş kopya". 6 Şubat 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Şubat 2018. 
  3. ^ "Arşivlenmiş kopya". 6 Şubat 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Şubat 2018. 
  4. ^ "Arşivlenmiş kopya". 6 Şubat 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Şubat 2018. 
  5. ^ "Arşivlenmiş kopya". 5 Şubat 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Şubat 2018. 
  6. ^ "Arşivlenmiş kopya". 7 Şubat 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Şubat 2018. 
  7. ^ "Arşivlenmiş kopya". 5 Şubat 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Şubat 2018. 
  8. ^ "Arşivlenmiş kopya". 5 Şubat 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Şubat 2018. 
  9. ^ "Arşivlenmiş kopya". 6 Şubat 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Şubat 2018. 
  10. ^ "Arşivlenmiş kopya". 5 Şubat 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Şubat 2018. 
  11. ^ "Arşivlenmiş kopya". 5 Şubat 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Şubat 2018. 
  12. ^ "Arşivlenmiş kopya". 14 Mayıs 2016 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Şubat 2018. 
  13. ^ "Arşivlenmiş kopya". 5 Şubat 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Şubat 2018. 
  14. ^ "Arşivlenmiş kopya". 6 Şubat 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Şubat 2018. 
  15. ^ "Arşivlenmiş kopya". 5 Şubat 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Şubat 2018. 
  16. ^ "Arşivlenmiş kopya". 5 Şubat 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Şubat 2018. 
  17. ^ "Arşivlenmiş kopya". 5 Şubat 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Şubat 2018. 
  18. ^ "Arşivlenmiş kopya" (PDF). 29 Haziran 2016 tarihinde kaynağından (PDF) arşivlendi. Erişim tarihi: 5 Şubat 2018. 

Dış bağlantılar[değiştir | kaynağı değiştir]