.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ı sunduğu görülmektedir. Diller birebir benzemese de derlenme süreci çok benzerdir. 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 teknolojiler beraberinde gelmiştir.

CLR İşleyişi

Kabaca bu işleyişten bahsedersek; kaynak kodları .NET ortamına taşınarak derlenir ve ç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şturularak 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; kodalr derlendiğinde doğrudan windows işletim sistemi ü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. .NET'in desteklediği herhangi bir dilde yazılan veri tipleri .NET'in CTS(Common Type System) denilen veri tiplerine dönüşür.

İşin aslı .NET'in sağladığı kolaylıklar için biraz eskilere bakılması gerekir. .NET öncesi 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. Bu durumda kodunuz makineye bağımlı kalırdı ki her makine için ayrı kod yazılması gibi bir külfet getirirdi.

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. 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.

Yine bir örnek olarak ortak ara dil sayesinde farklı dillerle uygulama geliştirme imkanını sağladığı kolaylıklardan biri: C# ve C++ ile uygulama geliştiren iki geliştirici tek bir projeyi ortak geliştirebilirler. C# ile bir dll yazıldığında C++ kullanan bir geliştirici projeye desteğini sürdürebilir veya tam tersi de olabilir.

Assembly

.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 ya da exe dosyalarının bütününe Assembly diyoruz. Yani aslında İngilizce'de toplanma yeri gibi bir karşılığı var. O yüzden Microsoft da gidip bu ismi koymuş. Belki de JavaScript'in Java ile ilgisi olmamasına rağmen; insanların ilgisini daha fazla çekmek için o ismi seçmesi gibi de olabilir. İç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.