IL kodunun yerel CPU komutlarına derlenmesini aşağıdaki örnekle açıklayacağım.
public class Example
{
static void Main()
{
Console.WriteLine("Hey IL!!!");
}
}
Öncelikle CLR, türle ilgili her ayrıntıyı ve bu türden hangi yöntemin meta verilerden kaynaklandığını bilir.
CLR, IL'yi yerel CPU talimatına yürütmeye başladığında, bu sefer CLR, Main'in kodu tarafından referans verilen her tür için dahili veri yapılarını tahsis eder.
Bizim durumumuzda yalnızca bir tür Konsolumuz var, bu nedenle CLR bir dahili veri yapısı tahsis edecektir. Bu iç yapı aracılığıyla, başvurulan türlere erişimi yöneteceğiz.
Bu veri yapısının içinde CLR, bu tür tarafından tanımlanan tüm yöntemlerle ilgili girişlere sahiptir. Her giriş, yöntemin uygulamasının bulunabileceği adresi tutar.
Bu yapıyı başlatırken, CLR , CLR'nin kendisinde bulunan belgelenmemiş FUNCTION'daki her girişi ayarlar . Ve tahmin edebileceğiniz gibi, bu FONKSİYON JIT Compiler dediğimiz şeydir.
Genel olarak, JIT Compiler'ı, IL'yi yerel CPU komutlarına derleyen bir CLR işlevi olarak düşünebilirsiniz. Size bu sürecin örneğimizde nasıl olacağını ayrıntılı olarak göstereyim.
1. Main, WriteLine'a ilk çağrısını yaptığında, JITCompiler işlevi çağrılır.
2. JIT Derleyici işlevi, hangi yöntemin çağrıldığını ve bu yöntemi hangi türün tanımladığını bilir.
3. Ardından Jit Compiler, bu türün tanımlandığı derlemeyi arar ve WriteLine yönteminin IL kodundaki durumumuzda bu tür tarafından tanımlanan yöntem için IL kodunu alır.
4. JIT derleyicisi DYNAMIC bellek bloğunu ayırır, bundan sonra JIT, IL kodunu doğrular ve yerel CPU koduna derler ve bu CPU kodunu bu bellek bloğuna kaydeder .
5. Daha sonra JIT derleyicisi, dahili veri yapısı girişine geri döner ve adresi (birincil olarak WriteLine'ın IL kodu uygulamasına atıfta bulunur), WriteLine'ın yerel CPU talimatlarını içeren yeni dinamik olarak oluşturulmuş bellek bloğu ile değiştirir.
6. Son olarak, JIT Compiler işlevi bellek bloğundaki koda atlar ve writeline yönteminin yerel kodunu yürütür.
7. WriteLine çalıştırıldıktan sonra kod, normal şekilde çalışmaya devam eden Ana Kod'a geri döner.