TJIT

Vikipedi, özgür ansiklopedi

TJIT, (tracing just-in-time compilation veya "izlenen JİT derlemesi") bir programın çalışma zamanında yürütülmesinin program optimizasyonunu yapmak için sanal makineler tarafından kullanılan bir tekniktir.[1] Bu, sık yürütülen işlemlerin doğrusal bir sırasını kaydetmek, bunları yerel makine dili koduna derlemek ve yürütmek suretiyle yapılır. Bu yöntem bazında çalışan geleneksel just-in-time (JIT) derleyicilere karşıdır.

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

Just-in-time derleme, bir programın parçalarını çalışma zamanında makine koduna derleyerek programların yürütme hızını artırmak için kullanılan bir tekniktir.[2] Farklı JIT derleyicileri kategorize etmenin bir yolu derleme kapsamı gereğidir. Yöntem tabanlı JIT derleyicileri bir seferde tek bir yöntemi çevirmeyle makine koduna çevirirken, JIT'leri izleme sıklıkla yürütülen döngüleri derleme birimi olarak kullanır. İzleme JIT'leri, programların zamanlarının çoğunu programın bazı döngülerinde ("sıcak döngüler") geçirdiği (kontrol akışı) ve sonraki döngü yinelemelerinin benzer yolları genellikle kullandığı varsayımlarına dayanır.[3] JIT izleme özelliğine sahip sanal makineler çoğunlukla karma mod yürütme ortamlarıdır, yani izleme JIT'ine ek olarak bir yorumlayıcıya veya yöntem derleyicisine sahip oldukları anlamına gelir.

Teknik detaylar[değiştir | kaynağı değiştir]

Bir izleme JIT derleyicisi, çalışma zamanında çeşitli aşamalardan geçmektedir. İlk olarak, döngüler için profil bilgileri toplanır. Sıcak bir döngü tanımlandıktan sonra, o döngünün yürütülen tüm işlemleri kaydeden özel bir izleme modu girilir.[4] Bu işlem dizisine bir iz denir. İz daha sonra optimize edilmekte ve makine koduna derlenmektedir. Bu döngü tekrar çalıştırıldığında, derlenmiş iz, program karşılığı yerine çağrılır.

Bu adımlar aşağıda ayrıntılı olarak açıklanmıştır:

1) Profillemenin amacı, "sıcak döngü"leri tanımlamaktır. Bu genellikle her döngü için yineleme sayısını sayarak yapılır. Bir döngü sayımı belirli bir eşiği aştıktan sonra döngü "sıcak" kabul edilir ve izleme modu girilir.

2) İzleme aşamasında, döngü normalde yürütülü, ancak ek olarak her yürütülen işlem iz içine kaydedilir. Kaydedilen işlemler çoğu zaman bir ara temsilci formunda saklanır.[5] İzleme, işlev çağrılarını izler ve izlemeye yönlendirilirler. İzleme, döngü sona erene kadar devam eder ve başlangıca geri döner.

İz aşağıdaki döngüden bir somut yürütme yolu ile kaydedildiğinden, o iz daha sonra o yoldan ayrılabilir. Bunun olabileceği yerleri belirlemek için ize özel koruma talimatları eklenir.[6] Muhafız, orijinal durumun hala geçerli olup olmadığını belirlemek için hızlı bir kontroldur. Bir muhafız başarısız olursa, iz yürütülmesi durdurulur.

3) Optimizasyon ve kod üretme aşaması - İzleme yürütme sırasında yapıldığından, çalışma zamanı bilgilerini (örneğin, çalışma zamanı tür bilgileri) içerecek şekilde yapılabilir. Bu bilgi daha sonra kod verimliliğini artırmak için optimizasyon aşamasında kullanılabilir.[7]

İzlerin optimize edilmesi kolaydır, çünkü bunlar yalnızca bir yürütme yolunu temsil eder, bu da hiçbir kontrol akışı mevcut olmadığı ve hiçbir işleme ihtiyacı olmadığı anlamına gelir. Tipik optimizasyonlar, sabit alt ifade kaldırma, ölü kod eleme, kayıt tahsisi, değişmez kod hareketi, sabit katlama ve kaçış analizi içerir.[8]

Optimizasyon sonrasında, iz makine koduna dönüştürülür. Optimizasyona benzer şekilde, izlerin doğrusal doğası nedeniyle bu kolaydır.

İz, makine koduna derlendikten sonra, döngünün sonraki iterasyonlarında yürütülebilir. Izleme işlemi, başarısız oluncaya kadar devam eder.[9]

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

JIT fikirleri 1960'lı yıllaradek uzanırken, JIT'lerin izlenmesi daha yeni kullanılmaya başlamıştır. Günümüzün JIT'leri izleme fikrine benzer bir fikir 1970 yıllarda çıktı. Derlenmiş kodun, yorumlama sırasında gerçekleştirilen eylemleri basitçe depolayarak çalışma zamanında bir yorumlayıcıdan türetilebileceği gözlemlendi.[10]

İzlemenin ilk uygulaması Dynamo, "işlemci üzerinde yürütülen yerel talimat akışının performansını şeffaf bir şekilde geliştiren bir yazılım dinamik optimizasyon sistemi" dir. Bunu yapmak için, yerel yönerge akışı "sıcak" bir yönerge sırası bulunana kadar yorumlanır. Bu sıralama için optimize edilmiş bir sürüm oluşturulur, önbelleğe alınır ve yürütülür.

Dinamo daha sonra DinamoRIO'ya aktarıldı. Bir DinamoRIO tabanlı proje, izleme ve kısmi değerlendirmeyi birleştiren bir tercüman yapısı için bir çerçeve idi.[11] "Dil uygulamalardan tercüman yükünü dinamik olarak kaldırmak" için kullanıldı.

2006'da, üst düzey bir dil için ilk izleme JIT derleyicisi olan HotpathVM geliştirildi. HotpathVM'nin motivasyonu, kaynak kısıtlı mobil cihazlar için verimli bir JVM'ye sahip olmaktı.

Bir izleme JIT örneği Mozilla Firefox için JavaScript uygulamalardan biri olan TraceMonkey'dir (SpiderMonkey).[12] TraceMonkey sıklıkla yürütülen döngü izlerini çalışma zamanında dinamik dil JavaScript'inde derler ve oluşturulan kodu her bir yolda gerçekleşen gerçek dinamik türler için uzmanlaştıracaktır.

JIT'leri takip eden bir diğer proje PyPy'dir. PyPy'nin çeviri araç zinciri ile yazılmış olan dil uygulamaları JIT'lerin izlenmesini kullanmayı mümkün kılar ve böylece o tercüman kullanılarak yürütülen herhangi bir programın performansını arttırır.[13] Bu, tercüman tarafından yürütülen program yerine, tercümanın kendisini izleyerek mümkündür.

JIT'leri izleme, Ortak Ara Dil (CIL) için SPUR projesinde Microsoft tarafından keşfedildi.[14] SPUR, bir JavaScript uygulaması izlemek için de kullanılabilen CIL için genel bir izleyici idi.

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

  1. ^ "Arşivlenmiş kopya" (PDF). 19 Mayıs 2017 tarihinde kaynağından (PDF) arşivlendi. Erişim tarihi: 18 Şubat 2018. 
  2. ^ "Arşivlenmiş kopya" (PDF). 8 Ağustos 2017 tarihinde kaynağından (PDF) arşivlendi. Erişim tarihi: 18 Şubat 2018. 
  3. ^ "Arşivlenmiş kopya". 18 Şubat 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 18 Şubat 2018. 
  4. ^ "Arşivlenmiş kopya" (PDF). 18 Şubat 2018 tarihinde kaynağından (PDF) arşivlendi. Erişim tarihi: 18 Şubat 2018. 
  5. ^ "Arşivlenmiş kopya". 18 Şubat 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 18 Şubat 2018. 
  6. ^ "Arşivlenmiş kopya". 19 Şubat 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 18 Şubat 2018. 
  7. ^ "Arşivlenmiş kopya" (PDF). 19 Şubat 2018 tarihinde kaynağından (PDF) arşivlendi. Erişim tarihi: 18 Şubat 2018. 
  8. ^ "Arşivlenmiş kopya" (PDF). 18 Şubat 2018 tarihinde kaynağından arşivlendi (PDF). Erişim tarihi: 18 Şubat 2018. 
  9. ^ "Arşivlenmiş kopya". 18 Şubat 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 18 Şubat 2018. 
  10. ^ "Arşivlenmiş kopya" (PDF). 9 Ağustos 2020 tarihinde kaynağından (PDF) arşivlendi. Erişim tarihi: 18 Şubat 2018. 
  11. ^ "Arşivlenmiş kopya". 18 Şubat 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 8 Ekim 2020. 
  12. ^ "Arşivlenmiş kopya". 19 Şubat 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 18 Şubat 2018. 
  13. ^ "Arşivlenmiş kopya" (PDF). 18 Şubat 2018 tarihinde kaynağından (PDF) arşivlendi. Erişim tarihi: 18 Şubat 2018. 
  14. ^ "Arşivlenmiş kopya" (PDF). 19 Şubat 2018 tarihinde kaynağından arşivlendi (PDF). Erişim tarihi: 18 Şubat 2018.