.NET’lerin Temel Parçaları: CoreCLR/CLR ve CoreFX/BCL
C# evrenine başlarken, özellikle .NET ile .NET Core arasındaki muazzam dönüşümün temelini araştırırsanız ilk olarak bu terminolojiye maruz kalacaksınızdır. Bu yüzden bu konularında bilinmesinin iyi olacağını düşünüyorum.
Daha önce CLR ile adlandırılan yapı kodu çalıştıran ve geliştirme sürecini kolaylaştıran hizmetler sağlayan bir runtime olarak görevlendirilmiştir. CLR, .NET Core’un oluşabilmesi için bir takım değişikliğe uğramıştır. İlk olarak bu sürümlerden kısa bir bahsedelim ve asıl konu olan CLR’a geçelim.
Microsoft .NET’in piyasada 3 çeşidi bulunuyor (.NET Framework, .NET Core ve .NET Standard).
.NET Framework
Microsoft .NET Framework, .NET’in özgün/ilk uygulamasıdır. Uygulamaları yalnızca Windows platformunda çalıştırabilir. .NET’in tam uygulaması .NET Framework içindedir. Bu platform kullanılarak oluşturulan web uygulamaları yalnızca IIS’de barındırılabilir. ASP.NET Web Formları, WinForms, WCF, Silverlight vb. destekler. .NET Framework’ün yapı taşları Common Language Runtime (CLR), Base Class Libraries (BCL) ve Common Intermediate Language (CIL)’dir. C#, F# veya VB ile yazılan Kod, derleyici tarafından Ortak Ara Dil(CIL)’e dönüştürülür. Kod, makineye özel kod için Just-in-time (JIT) kullanılarak CLR tarafından yürütülür.
.NET Core
NET Core, birden çok havuz biçiminde .NET’in platformlar arası ve açık kaynaklı uygulamasıdır. Uygulamaları birden fazla platformda çalıştırabilir. gRPC, Machine Learning için ML.NET, ASP.NET Core Razor Pages, Blazor , UWP vb. gibi modern uygulama çerçevelerini destekler. .NET Core’un yapı taşları CoreCLR ve CoreFX’tir.
.NET Standard
.NET Standard, tüm .NET uygulamalarında kullanılabilen bir belirtimdir. Yalnızca kütüphane projeleri geliştirmek için kullanılır. Bu, .NET Standard’da bir kitaplık oluşturuyorsak, bunları .NET Framework ve .NET Core’da kullanabileceğimiz anlamına gelir. Tekdüzelik oluşturmak, tüm .NET uygulamalarında kullanıma izin vermek anlamına gelir. .NET Standard, Mono platformu, Xamarin, Universal Windows Platform(UWP) ve Unity için desteğe sahiptir.
CoreCLR/CLR Nedir?
CLR, bellek ayırmayı ve yönetimi ele alır. CLR ayrıca uygulamaları yürütmekle birlikte JIT derleyicisi kullanarak kod oluşturan ve derleten bir sanal makinedir.
Derleyiciler ve araçlar, çalışma zamanının fonksiyonelliğini ortaya çıkarır ve bu yönetilen yürütme ortamından yararlanan kod yazmanıza olanak tanır. Runtime için bir dil derleyicisiyle geliştirdiğiniz koda, yönetilen kod denir. Yönetilen kod, cross-language, güvenlik, farklı dillerle yazılmış componentler arası iletişim, versiyon ve dağıtım desteği ve debugging gibi özelliklerden yararlanır.
Çalışma zamanı, kod içerisindeki yapıları(sınıf, metot vs.) anlamak ve native kod çıkartmak için meta dataları kullanır. Metadatalar her kodda beraber bulunur.
CoreCLR, CLR’ın da sağladığı aşağıdaki özellikleri sağlar ama bazılarında geliştirme yapılmıştır:
- Gabrage Collection
Kullanılmayan nesne referanslarının silinmesinden sorumludur. Her ikisi de bu konuda aynı temellere sahipler.
- JIT Compilation
JIT ise kodu derlemekten sorumludur. .NET Frameworkünde bu konuda bağımlılık yaşanırken, .NET Core’de bu kısım sayesinde bir bağımlılığımız kalmadı ve Windows, Linux ve macOS ile çalışabilme özgürlüğü geldi.
- Exception Handling
Bu kısımda artık runtime’ın temeline eklendi.
İlk sürüm olan .NET’de, CLR büyük ve monolitik olarak düşünülmüş gibiydi ve .NET uygulamalarının gerektirdiği temel servisleri sağladı. Zamanla büyüdü ve Windows’a sıkı şekilde bağlılık oluşturmaya başladı. Microsoft bu yüzden CLR’ı ikiye ayırmak zorunda kaldı. Çünkü bazı işler için büyük hacimli olmaya başlamıştı ve pratikliği azaltıyordu.
Sonrasında .NET Core ile CoreCLR artık daha küçük boyutlu hale getirildi. En temel işlerden sorumlu olmaya kısımlar CoreFX’in bir parçası oldu.
.NET Core platformdan bağımsız olduğundan, bu temelde aynı IL kodunun farklı işletim sistemlerinde çalışabileceği anlamına gelir.
IL özel bir “dildir”. Bunun için herhangi bir platformda çalışabilecek bir yorumlayıcı/çalışma zamanı yazabilirsiniz. (JVM’in ürettiği java byte kodu benzeri)
CoreFX
Eski .NET’i bir sunucuya yüklerseniz, bu framework ile gelen her şeyi kullanmayacak olsanız bile kurmuş olmalıydınız. Bu durum sunucuda istemediğimiz bir sürü kısımlarında kaynak israfı yapmasına neden oldu.
Bu durumun önüne geçebilmek için .NET’de ki Base Class Library(BCL)’de iyileştirmeler yapıldı ve artık platformlar arası paylaşılabilen CoreFX (Yrni BCL) ortaya çıktı. Ayrıca bu kısıma bir nevi Library kümesi diyebiliriz. CoreFX collections, file systems, console, JSON, XML, async gibi bir çok şeyi içerir.
Bu sayede CoreFX ile modülerlik sağlamanmış oldu. Böylece artık tüm paketleri ve kütüphaneleri yüklemeden paketler arasında istediğini seçebilir ve projeye entegre edebilirsin. Tabi bunun sağlanması içinde yukarıda belirttiğimiz gibi open source olarak paylaşıldı.
CoreRT
Ayrıca bir not olarak CoreRT’yi de belirtmek isterim. Clr’nin aksine CoreRT sanal bir makine değildir, bu da bir JIT içermediğinden kod oluşturma ve çalıştırma işlemlerini içermez. Ancak, GC ve çalışma zamanı türü tanımlama ve reflection özelliğini içerir. Ancak, tür sistemi reflection için meta verilerin gerekli olmaması için tasarlanmıştır. Yukarıda belirtmiştik CoreCLR için meta veriler gerekliydi. Meta verilerin gerekli olmaması, gereksiz meta verileri bağlayabilen bir AOT araç zinciri olmasını ve (daha önemlisi) uygulamanın kullanmayan kodu belirlemenizi gerektirir. Ayrıca CoreRT daha geliştirme aşamasındadır.
Kısacası CoreCLR, .NET Core için bir çalışma zamanıdır (runtime). JIT, GC ve birkaç düşük seviyeli sınıfı içerir. CoreFX, temel sınıf kitaplıklarından yapılmıştır. Bunlar, .NET Framework’ün CLR ve BCL’sine alternatif olarak gelir. .NET Core CLI ile entegre olarak gelir. Bu evrende, bu gelişmeler sayesinde modülerlik sağlandı ve mikroservis mimarisi için daha uygun hale getirildi.
Ama…
Bütün bunlar tabi .NET Framework’ün artık kullanılmaması anlamına gelmiyor. .NET Framework bazı yapılar için hala temel uygulama platformu. Örneğin Windows Forms ve WCF gibi kavramlar .NET Framework ile geliştirilebilirken, .NET Core’da bu destek sağlanmıyor.