.Net Framework, genel amaçlı bir yazılım geliştirme platformudur. İşleyiş adımları Java'nın JVM(Java Virtual Machine) işleyişine benzemektedir. Şahsen projelerimi C# ile geliştiriyor olsam da yapılarındaki benzerlik ve çıkış tarihleri göz önüne alındığında Java'nın C#'dan önce .NET benzeri bir yapıyı yazılımcılara sunduğu görülmektedir. Diller birebir benzemese de derlenme süreci çok benzerdir. Bu sebeple Sun Microsytems'in de hakkını teslim etmek gerekir diye düşünüyorum.

.NET Frameworke dönersek, Microsoft'un yazılım geliştirme teknolojilerini tek bir çatı altında toplayarak belirli standartlar getirme amacıyla oluşturduğu platformdur. Bu yapı ile farklılık gösteren programlama dillerinin birlikte çalışması mümkün kılınmış; yanı sıra güvenlik, program taşınabilirliği ve platformdan bağmısız ortak bir programlama modeli gibi işlerimizi kolaylaştıracak birçok teknoloji beraberinde gelmiştir.

CLR İşleyişi

Kabaca bu işleyişten bahsedersek; C# kaynak kodları kendiliğinden .NET ortamına taşınarak, orada derlenir ve orada çalışırlar. .NET'in desteklediği birçok dil ile yazılan kaynak kodlar derlendiğinde IL(Intermediate Language) -sonraları Microsoft tarafından MSIL(Microsoft Intermediate Language) olarak anılmıştır, yine farklı kaynaklarda CIL(Common Intermediate Language) olarak da rastlayabilirsiniz - koduna dönüşürler. Program çalıştığı zaman bu ara kodu, çalıştırılabilir koda dönüştürmek CLR(Common Language Runtime)'ın görevidir. Daha sonra JIT(Just-In-Time) derleyici koşturulacak MSIL kodunu makine diline dönüştürür. Böylece MSIL elde edilecek şekilde derlenen her program CLR'ın uygulandığı her ortamda çalıştırılabilir. Kısaca CLR, MSIL koduna dönüşen programların koştuğu ana yerdir.

NET-Framework-Compilation

Başka bir deyişle; yazılan kodlar derlendiğinde doğrudan windows işletim sistemleri üzerinde çalışmaz; üzerinde kurulan sanal CLR üzerinde çalışır. Çünkü kodlar derlendiğinde çalışabilir(executable) kodlara değil, önce MSIL kodlarına dönüşmektedir. CLR programımızın çalışmasını idare eden sistemdir. Örneğin C# dilinde int tipi bir değişken tanımlandığında, derleyici onu .NET Framewrok karşılığı olan Int32 tipine dönüştürür. Kaynak kodu hangi dilde yazarsanız yazın, deklare edilen herşey .NET'deki karşılıklarına dönüşür. Yani .NET'in desteklediği herhangi bir dilde yazılan veri tipleri .NET'in CTS(Common Type System) denilen veri tiplerine dönüşür. Böylece bu diller için ortak bir platform yaratılmış olmaktadır. Bu veri tipleri, temel veri tipleri ve değişkenler konularında ele alınacaktır.

İşin aslı .NET'in bize sağladığı kolaylıkları anlayabilmek için biraz eskilere bakılması gerekir. .NET öncesi dillerle yazılan kodlar derlendiğinde, direk fiziksel makinede çalışacak makine kodları üretilir ve gerekli kütüphaneler bağlanarak çalıştırılabilir bir çıktı üretilir. .NET derleyicisi ise fiziksel makinede değil CLR üzerinde çalışabilecek sabit bir kod üretir. Derleme yapıldıktan sonra kütüphaneler direk eklenmez. Bu ekleme işlemleri CLR tarafından program koşarken dinamik olarak yapılır ki bu da C#'a platformdan bağımsız performanslı bir şekilde çalışması açısından büyük bir esneklik kazandırmaktadır.

Küçük bir örnek olması açısından; uygulamanızın kurulacak makinede sorunsuz çalışabilmesi için o makinede de .NET Framework yüklü olması gerekir. Neyse ki uzun zamandır zaten windows ile yüklenmektedir. Yalnız kurulan windows versiyonuna göre .NET versiyonları da değişiklik gösterir. Geliştirdiğiniz uygulama .NET 4 üzeri ise mesela sıfır kurulum yapılan bir windows 7 için .NET 4 ihtiyacı doğmaktadır. .NET öncesi üçüncü parti bir kütüphanenin 1.1 versiyonu ile uygulamayı geliştirdiniz, başka bir programcı da 1.0 versiyonunu kullanarak başka bir uygulama geliştirdi diyelim. Bu 2 uygulama aynı bilgisayara kurulduğunda bir dll(dynamic link library) dosyası diğerinin üzerine yazılmaktaydı. Üst versiyonun eski versiyon üzerine yazılması sorun yaratmayabilirdi ama eski versiyon üst versiyonun üzerine kurulduğunda programınızda sorunlar baş gösterirdi. Yani sizin özellikle 1.1 versiyonunda yenilenen sınıflar ile uygulamayı yazdığınızı düşünelim. Ama kurulan diğer uygulama, sizin programınızın ihtiyaç duyduğu sınıfların üzerine yazacağı için kodların ihtiyaç duyduğu sınıflar yok oldu gitti. İşte bu duruma dll cehennemi denmekteydi. .NET sayesinde bir kütüphane dosyasının aynı isimli farklı versiyonları bile aynı anda bilgisayara kurulabiliyor.

Yine bir örnek olarak ortak ara dil sayesinde farklı dillerle uygulama geliştirme imkanının bize sağladığı kolaylıklardan biri: C# ve VB.NET ile uygulama geliştiren iki geliştirici tek bir projeyi ortak geliştirebilirler. C# ile bir dll yazıldığında VB.NET kullanan bir geliştirici bu dll dosyasını kullanıp kalıtım yolu ile projeye desteğini sürdürebilir.

NET-derleme-sureci

Assembly nedir?

Bu kavram pek çok programcı tarafından, çok eski bir dil olan assembly ile karıştırılmaktadır. Fakat .NET Framework Assembly ile bir mikroişlemciye ait sembolik makine dili olan assembly'nin bir ilgisi yoktur. Derlenen sınıf kütüphanelerinden çıktı olarak alınan dll yada exe dosyalarının bütününe Assembly diyoruz. İçerisinde CIL, metadata, manifesto ve kaynaklar bulunur. CIL'den yukarıda bahsetmiştim. Metadata uygulamamız içinde kullanılan bileşenler ile ilgili bilgileri barındırır. Örneğin Ogrenci adında bir sınıfınız ve içinde NotOrtalamasi adında bir metodumuz olsun. Bu sınıf ve metot ile ilgili bilgiler metadata içinde barınır. Manifesto alanı assemblynin kendisi ile ilgili adı, versiyonu, kültür bilgileri gibi bilgileri tutar. Kaynak dosyaları ise projeye dışardan eklenebilecek görseller, ses dosyaları, txt dosyaları veya benzer binary dosyalardır.