İçeriğe atla

JIT

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

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

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

  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

İ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.

<span class="mw-page-title-main">RAM</span> herhangi bir sırada okunabilen ve değiştirilebilen bir tür geçici veri deposu

Rastgele erişimli hafıza veya rastgele erişimli bellek mikroişlemcili sistemlerde kullanılan, genellikle çalışma verileriyle birlikte makine kodunu depolamak için kullanılan herhangi bir sırada okunabilen ve değiştirilebilen bir tür geçici veri deposudur. Buna karşın diğer hafıza aygıtları saklama ortamındaki verilere önceden belirlenen bir sırada ulaşabilmektedir, çünkü mekanik tasarımları ancak buna izin vermektedir.

Yama, bilgisayar programlarında oluşan bir hatayı ya da programın içeriğindeki hatalı bir fonksiyonu düzelten bir programcıktır. Genelde bilgisayarlardaki en büyük güvenlik sorunlarından olan yazılım açıklarına müdahale amacıyla kullanılır.

<span class="mw-page-title-main">Programlama</span> bilgisayar probleminin orijinal formülasyonundan çalıştırılabilir bilgisayar programlarına yönlendiren süreç

Programlama ya da diğer adı ile yazılımlama, bilgisayarın donanıma nasıl davranacağını anlatan, bilgisayara yön veren komutlar, kelimeler, aritmetik işlemlerdir. Diğer bir tanımla programlama, bilgisayar programlarının yazılması, test edilmesi ve bakımının yapılması sürecine verilen isimdir.

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.

Betik dili, betik yorumlamak için yazılmış özel çalışma-zamanı sistemlerinin yorumlayabileceği programlama dilleridir. Diğer programlama dilleri ile yazılan kodlar makine koduna çevrilip çıkan program doğrudan çalıştırılırken betik kodları interpreter tarafından doğrudan okunur ve yorumlanarak işlemler yorumlayıcının kendisi tarafından yapı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.

<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.

Javac Oracle Corporation tarafından sağlanan Java Geliştirme Kiti'nda (JDK) bulunan Java derleyicisidir.

<span class="mw-page-title-main">Bytecode</span> 2 li sistem

Bytecode, -aynı zamanda taşınabilir kod olarak da bilinir- bir yorumlayıcı tarafından çalıştırılabilir ve aynı zamanda makine diline derlenebilir durumdaki komut setinin isimlendirilmesinde kullanılmaktadır. Komutlar yazılım tarafından işlendiği için, oldukça karmaşık olabilir, ancak alışılagelmiş donanım komutlarına benzemez. Sanal yığıt makineleri genellikle en yaygın şekilde bulunan çeşitleridir, ancak sanal yazmaç makineleri de yapılmıştır. Farklı kısımları genellikle farklı dosyalarda saklanır, ancak çalışma zamanında dinamik olarak belleğe yüklenirler. Okunabilir kaynak kodlarından farklı olarak bytecodelar, tip, geçerlilik alanı ve program nesnelerinin derinliklerinin işlenmesi sonucu ortaya çıkan sayısal kodlar, sabitler ve referanslardan oluşur.

<span class="mw-page-title-main">Yazılım testi</span>

Yazılım testi, test altında hizmetlerin veya ürünlerin kalitesi hakkında paydaşlara bilgi sağlamak için yürütülen bir araştırmadır. Yazılım testi aynı zamanda, yazılım uygulamalarının risklerini anlamak için yazılımı bağımsız ve nesnel olarak incelemektir. Test teknikleri yazılım böceklerini bulma niyetiyle uygulama veya bir programı çalıştırma süreçlerini kapsar.

IL2CPU, C# programlama dili kullanılarak geliştirilmiş bir Ahead-Of-Time (AOT) derleyicisidir. Bu araç, .NET platformunda kullanılan Ortak Ara Dil kodunu makine koduna dönüştürmek için tasarlanmıştır. IL2CPU, özellikle Cosmos Projesi'nin bir parçası olarak öne çıkar ve bu proje tarafından geliştirilmiştir.

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.

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.

TJIT, bir programın çalışma zamanında yürütülmesinin program optimizasyonunu yapmak için sanal makineler tarafından kullanılan bir tekniktir. 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.