Yönetilen yürütme işlemi
Yönetilen yürütme işlemi, bu konunun ilerleyen bölümlerinde ayrıntılı olarak ele alınan aşağıdaki adımları içerir:
- Derleyici seçme. Ortak dil çalışma zamanı tarafından sağlanan avantajları elde etmek için çalışma zamanını hedefleyen bir veya daha fazla dil derleyicisi kullanmanız gerekir.
- Kodunuzu ara dile derleme. Derleme, kaynak kodunuzu ortak ara dile (CIL) çevirir ve gerekli meta verileri oluşturur.
- CIL'yi yerel koda derleme. Yürütme zamanında, tam zamanında (JIT) derleyici CIL'yi yerel koda çevirir. Bu derleme sırasında kodun tür güvenli olarak belirlenip belirlenemeyeceğini öğrenmek için CIL ve meta verileri inceleyen bir doğrulama işlemi geçirmesi gerekir.
- Kod çalıştırılıyor. Ortak dil çalışma zamanı, yürütmenin gerçekleşmesini sağlayan altyapıyı ve yürütme sırasında kullanılabilecek hizmetleri sağlar.
Derleyici seçme
Ortak dil çalışma zamanı (CLR) tarafından sağlanan avantajları elde etmek için Visual Basic, C#, Visual C++, F# gibi çalışma zamanını hedefleyen bir veya daha fazla dil derleyicisi ya da Eiffel, Perl veya COBOL derleyicisi gibi birçok üçüncü taraf derleyiciden birini kullanmanız gerekir.
Çok dilli bir yürütme ortamı olduğundan çalışma zamanı çok çeşitli veri türlerini ve dil özelliklerini destekler. Kullandığınız dil derleyicisi hangi çalışma zamanı özelliklerinin kullanılabilir olduğunu belirler ve kodunuzu bu özellikleri kullanarak tasarlarsınız. Çalışma zamanı yerine derleyiciniz kodunuzun kullanması gereken söz dizimini oluşturur. Bileşeninizin başka dillerde yazılmış bileşenler tarafından tamamen kullanılabilir olması gerekiyorsa, bileşeninizin dışarı aktarılan türleri yalnızca Ortak Dil Belirtimine (CLS) dahil edilen dil özelliklerini kullanıma sunmalıdır. Kodunuzun CLSCompliantAttribute CLS uyumlu olduğundan emin olmak için özniteliğini kullanabilirsiniz. Daha fazla bilgi için bkz . Dil bağımsızlığı ve dilden bağımsız bileşenler.
CIL'ye derleme
Yönetilen koda derleme yaparken, derleyici kaynak kodunuzu verimli bir şekilde yerel koda dönüştürülebilen CPU'ya bağımsız bir yönerge kümesi olan ortak ara dile (CIL) çevirir. CIL, nesneler üzerinde yükleme, depolama, başlatma ve çağırma yöntemlerinin yanı sıra aritmetik ve mantıksal işlemler, denetim akışı, doğrudan bellek erişimi, özel durum işleme ve diğer işlemler için yönergeler içerir. Kodun çalıştırılabilmesi için CIL'nin CPU'ya özgü koda dönüştürülmesi gerekir. Bu kod genellikle tam zamanında (JIT) derleyicisi tarafından çalıştırılabilir. Ortak dil çalışma zamanı, desteklediği her bilgisayar mimarisi için bir veya daha fazla JIT derleyicisi sağladığından, aynı CIL kümesi JIT ile derlenebilir ve desteklenen herhangi bir mimaride çalıştırılabilir.
Derleyici CIL ürettiğinde, meta verileri de üretir. Meta veriler, her türün tanımı, her türün üyelerinin imzaları, kodunuzun başvurduğunu üyeler ve çalışma zamanının yürütme zamanında kullandığı diğer veriler de dahil olmak üzere kodunuzdaki türleri açıklar. CIL ve meta veriler, yayımlanmış Microsoft PE'yi ve yürütülebilir içerik için geçmişte kullanılan ortak nesne dosyası biçimini (COFF) genişleten ve temel alan taşınabilir yürütülebilir (PE) dosyasında bulunur. CIL veya yerel kodun yanı sıra meta verileri de kapsayan bu dosya biçimi, işletim sisteminin ortak dil çalışma zamanı görüntülerini tanımasını sağlar. CIL ile birlikte dosyada meta verilerin bulunması kodunuzun kendisini tanımlamasına olanak tanır; bu da tür kitaplıklarına veya Arabirim Tanım Dili'ne (IDL) gerek olmadığı anlamına gelir. Çalışma zamanı, yürütme sırasında gereken meta verileri bulur ve dosyadan ayıklar.
CIL'yi yerel koda derleme
Ortak ara dili (CIL) çalıştırabilmeniz için önce hedef makine mimarisi için yerel koda ortak dil çalışma zamanına göre derlenmelidir. .NET, bu dönüştürmeyi gerçekleştirmek için iki yol sağlar:
- Bir .NET tam zamanında (JIT) derleyicisi.
- Ngen.exe (Yerel Görüntü Oluşturucu).
JIT derleyicisi tarafından derleme
JIT derlemesi, bir derlemenin içeriği yüklendiğinde ve yürütüldüğünde, uygulama çalışma zamanında isteğe bağlı olarak CIL'i yerel koda dönüştürür. Ortak dil çalışma zamanı desteklenen her CPU mimarisi için bir JIT derleyicisi sağladığından, geliştiriciler JIT ile derlenip farklı makine mimarilerine sahip farklı bilgisayarlarda çalıştırılabilen bir dizi CIL derlemesi oluşturabilir. Ancak, yönetilen kodunuz platforma özgü yerel API'leri veya platforma özgü bir sınıf kitaplığını çağırırsa, yalnızca bu işletim sisteminde çalışır.
JIT derlemesi, yürütme sırasında bazı kodların hiçbir zaman çağrılmama olasılığını dikkate alır. Pe dosyasındaki tüm CIL'leri yerel koda dönüştürmek için zaman ve bellek kullanmak yerine, yürütme sırasında gerektiğinde CIL'yi dönüştürür ve sonuçta elde edilen yerel kodu bellekte depolar, böylece bu işlem bağlamında sonraki çağrılar için erişilebilir olur. Yükleyici, tür yüklenip başlatıldığında bir türdeki her yönteme bir saplama oluşturur ve ekler. Bir yöntem ilk kez çağrıldığında, saplama denetimi JIT derleyicisine geçirir ve bu yöntem için CIL'yi yerel koda dönüştürür ve saplamayı doğrudan oluşturulan yerel koda işaret etmek üzere değiştirir. Bu nedenle, JIT ile derlenen yönteme yapılan sonraki çağrılar doğrudan yerel koda gider.
NGen.exe kullanarak yükleme zamanı kodu oluşturma
JIT derleyicisi, derlemede tanımlanan tek tek yöntemler çağrıldığında derlemenin CIL'sini yerel koda dönüştürdüğünden, çalışma zamanında performansı olumsuz etkiler. Çoğu durumda, azalan performans kabul edilebilir. Daha da önemlisi, JIT derleyicisi tarafından oluşturulan kod derlemeyi tetikleyen işleme bağlıdır. Birden çok işlem arasında paylaşılamaz. Oluşturulan kodun bir uygulamanın birden çok çağrısında veya bir derleme kümesini paylaşan birden çok işlemde paylaşılması için ortak dil çalışma zamanı, önceden oluşturulmuş derleme modunu destekler. Bu önceden derleme modu, CIL derlemelerini JIT derleyicisinin yaptığı gibi yerel koda dönüştürmek için Ngen.exe (Yerel Görüntü Oluşturucu) kullanır. Ancak, Ngen.exe işlemi üç şekilde JIT derleyicisinden farklıdır:
- Uygulama çalışırken değil, uygulamayı çalıştırmadan önce CIL'den yerel koda dönüştürme gerçekleştirir.
- Bir kerede tek bir yöntem yerine bütün bir derlemeyi bir kerede derler.
- Oluşturulan kodu Yerel Görüntü Önbelleği'nde diskte bir dosya olarak kalıcı hale gelir.
Kod doğrulama
Yerel koda derlemesinin bir parçası olarak, yönetici kodun doğrulamayı atlamasına izin veren bir güvenlik ilkesi oluşturmadığı sürece CIL kodunun bir doğrulama işlemi geçirmesi gerekir. Doğrulama, kodun tür güvenli olup olmadığını bulmak için CIL ve meta verileri inceler; bu da yalnızca erişim yetkisine sahip olduğu bellek konumlarına eriştiği anlamına gelir. Tür güvenliği, nesneleri birbirinden yalıtmalarına ve yanlışlıkla veya kötü amaçlı bozulmalara karşı korunmalarına yardımcı olur. Ayrıca kod üzerindeki güvenlik kısıtlamalarının güvenilir bir şekilde uygulanabileceği konusunda güvence sağlar.
Çalışma zamanı, doğrulanabilir türdeki güvenli kod için aşağıdaki deyimlerin doğru olması gerçeğine dayanır:
- Bir türe başvuru, başvurulmakta olan türle kesinlikle uyumludur.
- Bir nesnede yalnızca uygun şekilde tanımlanmış işlemler çağrılır.
- Kimlikler iddia ettikleri şey.
Doğrulama işlemi sırasında CIL kodu, kodun bellek konumlarına erişebildiğini ve yöntemleri yalnızca düzgün tanımlanmış türler aracılığıyla çağırabildiğini onaylama girişimiyle incelenmiştir. Örneğin, kod bir nesnenin alanlarına bellek konumlarının taşmasına izin verecek şekilde erişilmesine izin veremez. Ayrıca doğrulama, CIL'nin doğru oluşturulup oluşturulmadığını belirlemek için kodu inceler çünkü yanlış CIL, tür güvenliği kurallarının ihlaline neden olabilir. Doğrulama işlemi iyi tanımlanmış bir tür güvenli kod kümesi geçirir ve yalnızca tür güvenli olan kodu geçirir. Ancak bazı tür güvenli kodlar, doğrulama işleminin bazı sınırlamaları nedeniyle doğrulamayı geçemeyebilir ve bazı diller tasarım gereği doğrulanabilir türde güvenli kod üretmez. Tür güvenli kod güvenlik ilkesi tarafından gerekliyse ancak kod doğrulamayı geçmezse, kod çalıştırıldığında bir özel durum oluşturulur.
Kodu çalıştırma
Ortak dil çalışma zamanı, yönetilen yürütmenin gerçekleşmesini sağlayan altyapıyı ve yürütme sırasında kullanılabilecek hizmetleri sağlar. Bir yöntemin çalıştırılabilmesi için önce işlemciye özgü koda derlenmiş olması gerekir. CIL'nin oluşturulduğu her yöntem, ilk kez çağrıldığında JIT ile derlenip çalıştırılır. Yöntem bir sonraki çalıştırıldığında, mevcut JIT ile derlenmiş yerel kod çalıştırılır. Yürütme tamamlanana kadar JIT derleme ve ardından kodu çalıştırma işlemi yinelenir.
Yürütme sırasında yönetilen kod çöp toplama, güvenlik, yönetilmeyen kodla birlikte çalışabilirlik, diller arası hata ayıklama desteği ve gelişmiş dağıtım ve sürüm oluşturma desteği gibi hizmetleri alır.
Microsoft Windows Vista'da işletim sistemi yükleyicisi, COFF üst bilgisindeki bir biti inceleyerek yönetilen modülleri denetler. Ayarlanan bit, yönetilen modülü belirtir. Yükleyici yönetilen modülleri algılarsa, mscoree.dll yükler ve _CorValidateImage
_CorImageUnloading
yönetilen modül görüntüleri yüklenip kaldırıldığında yükleyiciyi bilgilendirir. _CorValidateImage
aşağıdaki eylemleri gerçekleştirir:
- Kodun geçerli yönetilen kod olduğundan emin olur.
- Görüntüdeki giriş noktasını çalışma zamanındaki bir giriş noktasına değiştirir.
64 bit Windows'ta, _CorValidateImage
pe32'den PE32+ biçimine dönüştürerek bellekteki görüntüyü değiştirir.