İçeriğe atla

TJIT

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ış

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

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

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

  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. 

İlgili Araştırma Makaleleri

<span class="mw-page-title-main">C (programlama dili)</span> programlama dili

C, yapısal bir programlama dilidir. Bell Laboratuvarları'nda, Ken Thompson ve Dennis Ritchie tarafından UNIX işletim sistemini geliştirebilmek amacıyla B dilinden türetilmiştir. Geliştirilme tarihi 1972 olmasına rağmen yaygınlaşması Brian Kernighan ve Dennis M. Ritchie tarafından yayımlanan "C Programlama Dili" kitabından sonra hızlanmıştır. Günümüzde neredeyse tüm işletim sistemlerinin yapımında %95'lere varan oranda kullanılmış, hâlen daha sistem, sürücü yazılımı, işletim sistemi modülleri ve hız gereken her yerde kullanılan oldukça yaygın ve sınırları belirsiz oldukça keskin bir dildir. Keskinliği, programcıya sonsuz özgürlüğün yanında çok büyük hatalar yapabilme olanağı sağlamasıdır. Programlamanın gelişim süreciyle beraber programlamanın karmaşıklaşması, gereksinimlerin artması ile uygulama programlarında nesne yönelimliliğin ortaya çıkmasından sonra C programcıları büyük ölçüde nesne yönelimliliği destekleyen C++ diline geçmişlerdir.

<span class="mw-page-title-main">Pascal (programlama dili)</span> yüksek seviyeli programlama dili

Pascal bilgisayar programlama dili pek çok öğrenciye bilgisayar programlamayı öğreten ve çeşitli versiyonları bugün hâlâ yaygın olarak kullanılmaya devam eden en önemli programlama dillerinden biridir. İlk Macintosh işletim sisteminin çoğu ve TeX Pascal ile yazılmıştır.

<span class="mw-page-title-main">Java</span> açık kaynak kodlu, nesneye yönelik, zeminden bağımsız, yüksek verimli, çok işlevli, yüksek seviye, adım adım işletilen bir programlama dili

Java, Sun Microsystems mühendislerinden James Gosling tarafından geliştirilmeye başlanmış açık kaynak kodlu, nesneye yönelik, platform bağımsız, yüksek verimli, çok işlevli, yüksek seviye, hem yorumlanan hem de derlenen bir dildir.

<span class="mw-page-title-main">Derleyici</span> kaynak kodunu bilgisayarın işleyebileceği koda dönüştüren program

Derleyici, kaynak kodu makine koduna dönüştüren yazılımdır. Bir programlama dilinin derleyicisi, o programlama dili kullanılarak yazılmış olan kodu hedef işlemci mimarisine göre uygun şekilde makine koduna derler ve genellikle çıktı olarak yürütülebilir dosyanın oluşturulmasını sağlar. Bu eyleme derleme denir. Bir başka ifadeyle derleyici, bir tür yazı işleyicidir; girdi olarak yazı alır ve çıktı olarak yazı verir.

Çapraz Derleyici üzerinde çalıştığı platformdan farklı olan platformlar için çalıştırılabilen kodlar üreten derleyicidir. Böyle bir araç, erişiminizde olmayan bir platform için kod derlenmesi gerektiğinde ya da böyle bir platform üzerinde kod derleme işleminin yapılmasının imkânsız olduğu durumlarda faydalı olabilir.

<span class="mw-page-title-main">Assembly</span> uygulanan işlemlerle programlama dilinin birbirine çok yakın olduğu düşük seviye programlama dilleri

Assembly dili, bir işlemcinin komut kümesi üzerine tanımlanmış alt seviye bir dildir. Assembly dili kolay hatırlanabilir semboller tanımlar ve böylece işlemcinin makina koduna karşılık gelen sayı dizilerinin bilinmesine gerek kalmaz. Assembly dili, platformdan bağımsız yüksek seviyeli programlama dillerinin aksine, işlemci mimarisine bağımlıdır. Tipik uygulamaları; cihaz sürücüleri, alt seviyeli dahili (embedded) ve gerçek zamanlı sistemlerdir. Bır assembly programı assembler kullanılarak makine koduna çevrilir.

Yorumlayıcı, yazılımı kısım kısım ele alarak doğrudan çalıştırır. Yorumlayıcılar standart bir çalıştırılabilir kod üretmezler. Yorumlama işlemi aşama aşama yapılmadığı için genellikle ilk hatanın bulunduğu yerde programın çalışması kesilir.

<span class="mw-page-title-main">Çekirdek (bilgisayar bilimi)</span>

İşletim sistemi çekirdeği, kısaca çekirdek (kernel), işletim sistemindeki her şeyin üzerinde denetimi olan merkezi bileşenidir. Uygulamalar ve donanım seviyesindeki bilgi işlemleri arasında bir köprü görevi görür. Çekirdeğin görevleri sistemin kaynaklarını yönetmeyi de kapsamaktadır. Genellikle çekirdek, işletim sisteminin temel bir elemanı olarak, yazılımın fonksiyonunu yerine getirebilmesi için kontrol etmesi gereken kaynaklar için düşük seviye soyutlama katmanı sağlayabilir. İşletim sistemi görevleri, tasarımları ve uygulanmalarına göre farklı çekirdekler tarafından farklı şekillerde yapılır. Sistem açılırken belleğe yüklenir ve sistem kapatılıncaya kadar ana bellekte kalır.

Microsoft Visual Studio, Microsoft tarafından geliştirilen bir tümleşik geliştirme ortamıdır (IDE). Microsoft Windows, Windows Mobile, Windows CE, .NET Framework, .NET Compact Framework ve Microsoft Silverlight tarafından desteklenen tüm platformlar için yönetilen kod ile birlikte yerel kod ve Windows Forms uygulamaları, web siteleri, web uygulamaları ve web servisleri ile birlikte konsol ve grafiksel kullanıcı arayüzü uygulamaları geliştirmek için kullanılır.

Döngü açma, programın çalışmasını hızlandıran döngü dönüştürme yöntemlerinden biridir. Bu yöntem yazılan programın kod satır sayısını artırmaktadır. Döngülerdeki dönüşüm manuel olarak programcı tarafından yapılabileceği gibi kodlar derleyiciler tarafından da düzenlenebilmektedir.

Çok uzun buyruk kelimesi, buyruk düzeyindeki paralelliğin avantajından yararlanmak için geliştirilmiş bir işlemci tasarımıdır. Her buyruğu arka arkaya çalıştıran işlemciler, işlemci kaynaklarını verimsiz bir şekilde kullanabilmekte ve bu durum da başarımın düşmesine neden olmaktadır. Başarım, sıralı çalışan buyrukların çalıştırılma basamaklarında farklı aşamalarda olmasıyla veya aynı anda birden fazla buyruğun birbirinden bağımsız olarak çalıştırılmasıyla arttırılabilir. Bu yöntemlerin daha da iyileştirilmesi, buyrukların programdaki sırasından farklı bir sırada çalıştırılması ile sağlanabilir; bu yönteme de Sırasız yürütüm denir.

Programlama paradigmaları, programlama dillerini özelliklerine göre sınıflandırmanın bir yoludur. Diller birden fazla paradigma içinde sınıflandırılabilir.

<span class="mw-page-title-main">Java sanal makinesi</span>

Java Sanal Makinesi (JSM), Java platformunun nesne modülü formatı olan class uzantılı sınıf dosyalarının belleğe yüklenip çalıştırılması için gereken hizmetleri sunan bir sistem programıdır ve temel görevinin sınıf dosyalarını yorumlamak olduğu söylenebilir. Ancak, JSM'ni salt bir yorumlayıcı olarak görmek büyük haksızlık olur. Zira, yorumlama ile birlikte JSM'nin şu görevleri de vardır.

<span class="mw-page-title-main">OpenMP</span>

OpenMP; Solaris, IBM AIX, HP-UX, GNU/Linux, MAC OS X ve Windows işletim sistemleri üzerinde çoğu işlemci mimarisi üzerinde Fortran, C++, C programlama dillerinde çoklu platform paylaşımlı bellek çoklu işlemeyi destekleyen bir uygulama geliştirme arayüzüdür, yani bir API'dir. OpenMP derleyici yönergelerinin kütüphane rutinlerini ve ortam değişkenlerinin çalışma zamanı davranışını etkileyen bir kümesini içerir.

Dart, ilk kez Google tarafından geliştirilen ve daha sonraları ECMA tarafından standart (ECMA-408) haline getirilen açık kaynaklı ve genel-amaçlı bir programlama dilidir. Dart dili kullanılarak web, sunucu, mobil uygulamalar ve IoT cihazları geliştirilebilir.

<span class="mw-page-title-main">Android Runtime</span>

Android Runtime veya ART, Google tarafından geliştirilen, Android işletim sistemi tarafından kullanılan Bir uygulama çalıştırma ortamıdır. Android tarafından kullanılan işlem sanal makine, Dalvik-in yerini almıştır. ART yerli talimatlar içine uygulamanın bayt çevirisini (Bytecode) gerçekleştirir, daha sonra cihazın çalışma ortamını yürütür.

<span class="mw-page-title-main">Dalvik (yazılım)</span> Google tarafından yazılmış android için programlama dili

Dalvik yazılımı Google tarafından geliştirilmiş, Android için yazılmış uygulamaları yürüten ve şu an durdurulan sanal makine (VM) 'dir. Dalvik, Android 4.4 "KitKat" ve önceki Android sürümlerinin yazılım yığınının ayrılmaz bir parçasıdır; tipik olarak cep telefonları ve tablet bilgisayarlar gibi mobil cihazlarda ve daha yakınlarda Smart TV'ler ve giyilebilir bilgisayar gibi cihazlarda kullanılırdı. Dalvik, açık kaynaklı yazılım, Dan Bornstein tarafından yazılmıştır ve ismini Eyjafjörður, İzlanda da yerleşen Dalvik balıkçı köyünden almıştır. Android için programlar yaygın olarak Java ile yazılmış ve Java sanal makinesi için baytkodu derlemiştir. Daha sonra Dalvik bytecodeye çevrilmiş ve .dex ve .odex dosyalarında saklanır. Kompakt Dalvik yürütülebilir biçimi sistemleri için tasarlanmış, bellek ve işlemci hızı açısından sınırlandırılmıştır.

<span class="mw-page-title-main">Ayrıştırıcı (yazılım)</span>

Ayrıştırıcı, girdi verilerini alır ve girdinin yapısal bir temsilini vererek, süreçte doğru sözdizimini kontrol eden bir veri yapısı oluşturan bir yazılım bileşenidir. Ayrıştırma öncesinde veya sonrasında başka adımlar izlenebilir veya bunlar tek bir adımda birleştirilebilir. Ayrıştırıcı, genelde girilen karakter dizisinden belirteçler oluşturan ayrı bir sözcük tabanlı analiz motorunu takip eder. Ayrıştırıcılar elle programlanabilir veya bir ayrıştırıcı üreteci tarafından otomatik olarak veya yarı otomatik olarak oluşturulabilir. Ayrıştırma, biçimlendirilmiş çıktı üretimlerini tek bir şablonda tamamlama görevi görür. Bunlar, farklı etki alanlarına uygulanabilir, ancak bir derleyicinin girdi ve çıktı aşamaları gibi genellikle bir arada sunulur.

JIT ; bilgisayar kodunu çalıştırmanın bir yoludur. 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. 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.

AOT derlemesi C veya C++ gibi daha üst düzey bir programlama dili, Java bytecode veya .NET Framework Ortak Ara Dil kodu gibi bir ara temsilciliğin yerli bir makine diline derleme eylemidir. Sonuçta ortaya çıkan ikili dosya yerel olarak çalıştırılabilir.