JIT Derleyicisine Giriş – Tam sayı aritmetiği

.NET içerisinde Common Language Runtime‘ın bir parçası olan JIT compiler’ın tam sayı aritmetiği konusunda yaptıklarına değindim.

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 I” çalışmasında belirtilmiş: http://jmc.stanford.edu/articles/recursive/recursive.pdf

Ayrıca şurada da “A Brief History of Just-In-Time” şeklinde güzel bir makale var: http://eecs.ucf.edu/~dcm/Teaching/COT4810-Spring2011/Literature/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 MSIL veya IL (tam özellikli bir dildir bu arada IL 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ığı IL 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 IL 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/dotnet/coreclr/tree/master/src/jit

Kaynaklar:

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/bitwise-and-shift-operators#right-shift-operator-

https://en.wikipedia.org/wiki/Logical_shift

https://en.wikipedia.org/wiki/Arithmetic_shift

https://en.wikipedia.org/wiki/X86_instruction_listings

https://en.wikipedia.org/wiki/Just-in-time_compilation

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.