jit derleyici *
-
ks. just in time derleyici.. java gibi interpreted cali$masi gereken kodlari cali$tirmadan hemen once native code'a cevirip oyle cali$tirmaya verilen isimdir..
performansi super arttirir.. clr'da da vardir bundan.. -
.net'te jit compilation konsepti bir adim oteye goturulup koddaki pek cok memory allocation stratejisini heuristic olarak tespit etmeye ve dolayisiyla garbage collection'i optimize etmeye kadar varan geli$tirme ve eklentiler yapilmi$..
ayni zamanda ngen sayesinde jit'e gerek kalmayacak ve disassemble edilemeyecek $ekilde kafadan bir cpu'ya ozel native kod uretmek de mumkundur.. (bkz: vs.net) bu sayede cok buyuk uygulamalarda jit'in initial performansi du$urmesi de tercihen engellenebilir.. -
java için sun microsystemsin yazdığı jit olan hotspot yanlış hatırlamıyorsam 1.3 versiyonu ile birlikte default olarak gelmektedir.
-
şipşak derleyici
-
(bkz: aot derleyici)
-
.net içerisinde clr'ın* bir parçası olan jit compiler'ın tam sayı aritmetiği konusunda yaptıklarına değinmeye çalıştım.
https://youtu.be/m_qqd9o_qp8
jit derleme, interpreted* programların performansını iyileştirmeye yönelik bir yöntem. runtime sırasında, performansını artırmak için program assembly kod'ta derlenebilir. buna sürece "dinamik derleme" de deniliyor.
bu kavram ilk olarak john mccarthy'nin 1960 yılında yayınladığı "recursive functions of symbolic expressions and their computation by machine, part ı" çalışmasında belirtilmiş: http://jmc.stanford.edu/…es/recursive/recursive.pdf
ayrıca şurada da "a brief history of just-ın-time" şeklinde güzel bir makale var: http://eecs.ucf.edu/…ture/justintimecompilation.pdf
jit derlemenin statik derlemeye göre bazı avantajları vardır. c# uygulamalarını çalıştırırken, "runtime" uygulama çalıştırılırken uygulamanın profilini (profiling) çıkarabilir. bu, daha optimize edilmiş kodun oluşturulmasına izin verir. uygulama çalışırken davranışı değişirse, runtime bu kodu yeniden derleyebilir.
dezavantajlardan bazıları, startup gecikmeleri ve runtime sırasında derleme ek yükünü barındırmak. ek yükü sınırlamak için birçok jit derleyicisi yalnızca sık kullanılan kod kısımlarını derler mesela.
c# içerisinde bir kodun derlenme süreci şu şekilde;
1. derleme, sırasında kaynak kodunuzu msıl veya intermediate language (tam özellikli bir dildir bu arada ıl fakat c#'a göre biraz daha düşük seviyede) çevirir ve gerekli meta verileri oluşturur.
2. runtime sırasında, jit derleyicisi, aldığı ıl kodunu assembly koduna çevirir. (kullandığı runtime ve architecture'a göre üretilen assembly kodu da değişir. örneğin; x86, x64 veya arm gibi). bu nedenle .net runtime assembly dosyalarınızın içerisindeki ıl kodunu yorumlamaz.
3. clr, kodun çalıştırılmasını sağlayan altyapıyı ve runtime sırasında kullanılabilecek hizmetleri sağlar. derlenmiş makine kodu, kod bölümünün bir sonraki çalıştırılışında yeniden kullanılabilecek şekilde bellekte tutulur. bir işlevi ikinci kez çağırdığınızda, onu ilk çağırdığınızdan daha hızlı çalışacaktır çünkü ikinci kez herhangi bir jit adımı gerekli değildir.
bunların hepsine genel olarak managed execution adı verilir.
bu arada assembly kodları içerisinde sıklıkla görebileceğiniz bazı temel cpu register'ları şu şekilde;
eax -- değerleri toplamak için kullanılan özel bir register
ecx -- counter (döngülerde ve string'lerde kullanılır)
edx -- eax ile birlikte kullanılan, kısa süreli değişkenleri tutan register
ebx -- data depolamak için genel bir register. dizilerde kullanılır.
son olarak, jit compiler açık kaynaktır. şu github sayfasından inceleme yapabilirsiniz: https://github.com/…net/coreclr/tree/master/src/jit
kaynaklar:
https://docs.microsoft.com/…s#right-shift-operator-
https://en.wikipedia.org/wiki/logical_shift
https://en.wikipedia.org/wiki/arithmetic_shift
https://en.wikipedia.org/…/x86_instruction_listings
https://en.wikipedia.org/…/just-in-time_compilation -
jit compiler'ın 2. kısmında loop cloning ve loop hoisting* kavramlarına göz attık.
https://youtu.be/y0nm-_ucidm
loop cloning genel olarak dizilerin boyutları belli olmayan döngülerde jit compiler bir yavaş, bir de hızlı versiyonunu oluşturur bu döngülerin, eğer dizinin index'ine ulaşmak istediğiniz döngü değeri dizinin sınırları içerisindeyse yavaş versiyonuna, değilse hızlı versiyonuna yönlendirilir. tabi cloning her döngüde oluşmaz, örneğin döngü tipi int olmalı, basit bir artış olmalı (++ gibi) vs..
loop hoisting, veya sadece hoisting kavramı, döngüler içerisinde döngü index'lerine bağlı olmayan hesaplamaları döngünün dışına alarak bir defa hesaplamasını ve o değerin döngüde kullanılmasını sağlar.
en basitinden;
var a = 50;
var b = 100;
for(var i = 0; i < 100; i++)
{
(a + b).dump();
}
burada a + b toplamı i değişkenine bağlı olmadığı için bunun yerine;
var a = 50;
var b = 100;
var hoist = a + b;
for(var i = 0; i < 100; i++)
{
hoist .dump();
} -
jit compiler'ın 3. kısmında dizi index'lerinin sınırları konusunda yaptığı optimizasyondan bahsettim.
https://youtu.be/mdifzosr7ym
jit compiler'ı bir dizi içerisinde eğer aynı branch'te (yani farklı bir kod akışına dallanma olmadan) büyük index'li kontrolü yaptıktan sonra kendisinden küçük index'ler için ayrı bir kontrol yapmasına gerek olmayacak şekilde optimizasyon yapıyor.
yani
arr[2] = 3;
için 2 index'i için bir karşılaştırma yaptığında, bu satırdan daha sonra aynı branch'te;
arr[1] = 3;
şeklinde bir kodunuz varsa, ben zaten 2 için kontrol ettim, 2 index'li bir elemanı olan bir dizinin 1 index'li bir elemanı her zaman vardır şeklinde düşünüp burada bir karşılaştırma yapmayarak optimizasyona gidiyor.
tabi bu optimizasyon farklı branch'lerde mevcut değil.
kaynaklar:
https://sharplab.io/
https://github.com/…b/master/src/jit/rangecheck.cpp
https://en.wikipedia.org/wiki/branch_predictor -
jit compiler'ın 4. kısmında constant folding ve function folding kavramlarına baktık.
https://youtu.be/tdzlm2es4va
constant folding kısaca sabit ifadeleri runtime'da hesaplamak yerine compile time'da tanıma ve değerlendirme sürecidir.
örneğin; i * 2 * 2 ifadesini compiler i * 4 şeklinde fold edebilir. veya bazı compiler'lar string folding dahi yapabiliyor. "abc" + "def" expression'ı "abcdef" şeklinde fold edebiliyorlar.
function folding ise, bir fonksiyonun içerisinde başka bir fonksiyon çağırıldığında, çağıran fonksiyonun assembly kodunda çağırılan fonksiyon görünmemesi, bunun yerine onun sonucunun gösterilmesi durumudur.
https://en.wikipedia.org/wiki/constant_folding
ekşi sözlük kullanıcılarıyla mesajlaşmak ve yazdıkları entry'leri
takip etmek için giriş yapmalısın.
hesabın var mı? giriş yap