Common Language Runtime(CLR)

ismail kaşan
4 min readApr 11, 2023

--

.NET, Microsoft tarafından geliştirilen bir yazılım geliştirme platformudur. Bu platform, uygulamaların farklı işletim sistemleri ve cihazlar arasında taşınabilir olmasını sağlayarak yazılım geliştirme sürecini kolaylaştırır.

CLR (Common Language Runtime), .NET Framework ve .NET Core gibi Microsoft’un .NET platformlarında çalışan bir sanal makinedir. CLR, .NET programlama dillerinde yazılmış kodları derler ve derlenen kodları yönetir, işletim sistemiyle ve donanımla iletişim kurar, bellek yönetimini sağlar ve güvenliği korur. CLR, kodun güvenli bir şekilde çalışmasını sağlar, bellek yönetimi yapar, derleme işlemlerini gerçekleştirir ve diğer birçok görevi üstlenir.

CLR, .NET uygulamalarının platform bağımsız olmasını sağlar. Yani, .NET kullanan bir uygulama, herhangi bir platformda çalışabilir. CLR, C#, Visual Basic ve F# gibi dillerin yanı sıra, diğer .NET uyumlu dillerini de destekler. Microsoft, bir sürü dili CLR’in çalıştırabileceği forma derleyen derleyiciler (compiler’lar) geliştirmiştir.

Bu dilleri sıralarsak; C++/CLI, C#, Visual Basic, F#, IronPython, IronRuby ve Intermediate Language (IL) assembler olarak sayılabilir. Ayrıca, Microsoft birçok üniversite, kurum, kuruluş ve firmaya CLR destekli derleyiciler geliştirme desteği vermiştir. Bunlar arasında Ada, APL, Caml, COBOL, Eiffel, Forth, Fortran, Haskell, Lexico, LISP, LOGO, Lua, Mercury, ML, Mondrian, Oberon, Pascal, Perl, PHP, Prolog, RPG, Scheme, Smalltalk ve Tcl/Tk dilleri yer almaktadır.

Bu kadar farklı dille yazılan kodlar nasıl olur da tek bir makinede çalışabiliyor? Veya bu kodlar nasıl olur da farklı dillerde yazılmış kütüphaneleri kullanabiliyor? Örneğin, Visual Basic ile yazılmış bir .dll, C# kodu içinde kullanılabiliyor. İşte burada .NET’in bize sunduğu geniş kullanım alanıdır.

Unmanaged Code

Unmanaged module, bir .NET uygulamasının yönetilmeyen bir bileşenidir ve IL (Intermediate Language) ara diline derlenmemiştir. Bir unmanaged module, derlenmiş makine kodu, kaynak dosyaları, derleme zamanı bağımlılıkları ve diğer kaynak dosyaları içerir. Unmanaged module’ler, .NET tarafından yönetilmeyen ortamlarda çalışan kod parçalarıdır. Bu tür kod parçaları, doğrudan bellek ve işletim sistemi kaynaklarına erişebilirler ve .NET’in sağladığı yönetim olanaklarından yararlanamazlar. Unmanaged module’ler genellikle, daha önce yazılmış ve .NET ile uyumlu olmayan eski kodlar veya üçüncü taraf kütüphaneleri gibi .NET ortamı dışında geliştirilen kodlar için kullanılır.

Managed Code

Managed module, bir .NET uygulamasının en küçük bileşenidir ve IL (Intermediate Language) olarak bilinen ara dile derlenmiş halidir. Bir managed module, derlenmiş kod, kaynak dosyaları, Metadata ve bazı ek bilgiler içerir. Bu managed module, CLR tarafından yönetilir ve çalışma zamanında yönetilen bir ortamda çalışır. Bu ortam, kodun daha güvenli, daha hızlı ve daha güvenilir bir şekilde çalışmasını sağlar.

Managed module, .dll (dynamic link library) veya .exe(executable) dosyaları olarak çıktı alınabilir. Managed modullerin bir diğer özelliği, .NET tarafından sağlanan birçok özelliğin kullanılabilmesidir. Bu özellikler arasında bellek yönetimi, hata ayıklama ve güvenlik gibi birçok unsuru sayabiliriz. Bu özellikler, yönetilen modüllerin performansını artırır ve daha güvenli bir ortamda çalışmalarını sağlar.

Aşağıdaki örnekte 3 farklı dil ile yazılan kaynak kodun derleyiciler tarafından nasıl CLR’in çalıştırabildiği managed modulelere dönüşümünü gösterir.

Bir managed modulün içerisinde standart çıktı olarak CLR’ın çalıştırabildiği 32-bit portable executable file (PE32, yani taşınabilir ve çalıştırılabilir dosya) ve 64-bit portable executable file (PE32+ yani taşınabilir ve çalıştırılabilir dosya) çıktısı vardır. Ayrıca managed modülün içerisinde şu bilgilerde tutulur.

  • PE32 veya PE32+ Header: Standart Windows PE başlığıdır. Eğer bu header PE32 ise bu dosya 32-bit veya 64-bit makinede çalışabilir demektir. Eğer bu header PE32+ ise bu dosya 64-bit makinede çalışabilir. Aynı zamanda bu header dosyanın türünü de GUI (graphic user interface ), CUI (console user interface) veya .dll(dynamic link library) mi olduğunu gösterir. Ayrıca bu header dosyanın oluşturulduğu tarihi de tutuyor.
  • CLR Header: CLR’ın ve bileşenleri tarafından yorumlanan bilgileri içerir. Bir modulün hangi CLR versiyonu ile çalışabildiği bilgisi, bazı flaglar, modulün giriş metodu(main metod), modulün Metadata dosyasının yeri ve boyutu, modulde kullanılan kaynak dosyaları (resim, dosya vs.) ve modulün adını içerir.
  • Metadata: Her managed modul bir Metadata içerir. Matadata dosyasında 2 tane tablo vardır. Biri kaynak kodta var olan tipler( class, struct vs.) ve tipin elemanlarını( property, method, field, constructor, event vs.) içerir. Diğer tablo ise tiplerin ve tipin elemanlarının referanslarını tutar.
  • IL Code: Intermediate Language diye geçer fakat bazen MSIL(Microsoft Intermediate Language) veya CIL(Common Intermediate Language) olarakta geçer. Kaynak kodun derleyici tarafından derlenen halidir. İşte burası CLR’ın desteklediği dillerin kaynak kodlarının derleme sonrası oluşturulan halidir. CLR bu IL kodunu alır ve Native-CPU komutlarına çevirir. Bu compiler’a JIT(Just-In-Time) denir. JIT compiler, managed modul ilk çağrıldığı anda çalışır ve native kodu oluşturur. Bu sayede, JIT derleyicisi, native kodun optimize edilmesine imkan tanır ve daha iyi performans sağlar. JIT compiler, .NET’te varsayılan derleyici olarak kullanılır. Ancak, aynı zamanda .NET Native gibi alternatif derleyiciler de mevcuttur. Bu derleyiciler, uygulamaları daha hızlı çalıştırmak için önceden derlenmiş native kod kullanır.

Birde, managed modulün içindeki Metadata dosyası ile IL(Intermediate Language) ilişkilidir. Ve managed modulün içinde ayrılmaz bir ikilidirler. Çünkü IL kodunun JIT tarafından derlendiğinde, hangi objenin hangi referansı alacağı, hangi metodu çağıracağı gibi bilgiler Metadata tablolarında mevcuttur. Ayrıca, Metadata dosyasının biri sürü kullanımıda şöyledir.

  • JIT compiler direkt Metadata’yı managed modülden okur.
  • CLR kod doğrulama mekanizması Metadata’yı kullanarak tipleri kontrol eder.
  • Visual Studio Intellisense özelliği Metadata’yı parse ederek bize metodları, property’leri event ve fieldleri önerir. Bir metodun hangi tipte parametre alacağını söyler.
  • Metadata, bir nesnenin alanlarının bir bellek bloğunda seriliaze edilmesine, başka bir makineye gönderilmesine ve ardından deseriliaze edilmesine olanak vererek, uzak makinede nesnenin durumunu yeniden oluşturur.
  • Metadata, Garbage Collector’un objelerin yaşam süreçlerini takip etmesini sağlar. Herhangi bir obje için, Garbage collector objenin tipini ve içerisindek bir field’in hangi objenin referansını tuttuğu bilgisini Metadata’dan alır.

C#, Visual Basic, F# ve IL assembler her zaman içinde managed code(IL) ve managed data (garbage-collected data types) içeren modüller oluşturur. Ve son kullanıcılar bu dillerle yazılmış uygulamları çalıştırabilmek için makinelerinde CLR bulunması gerekir. Geliştirme ortamlarında CLR direk SDK’ların içinde geliyor.

Sonuç olarak, CLR (Common Language Runtime), .NET’in temel bileşenlerinden biridir ve .NET uygulamalarının çalıştırılması ve yönetimi için kritik bir rol oynar. CLR, uygulamaların hızlı, güvenli ve yönetilen bir ortamda çalışmasını sağlar ve ayrıca farklı programlama dillerinin birbiriyle uyumlu çalışmasına olanak tanır. CLR, modern yazılım geliştirme süreçlerinde büyük bir önem taşımaktadır ve yazılım geliştiricilerin, uygulamalarının performansını ve güvenliğini artırmak için doğru kullanımını öğrenmeleri gerekmektedir.

Yararlanılan kaynaklar

Microsoft CLR via C# Fourth Edition kitabı.

--

--

ismail kaşan
ismail kaşan

Written by ismail kaşan

I am a full stack developer since 2016.

No responses yet