.NET CLR – čo je Common Language Runtime a ako funguje
CLR (Common Language Runtime) je základná súčasť platformy .NET. Ide o runtime prostredie, ktoré zabezpečuje spúšťanie .NET aplikácií, správu pamäte, bezpečnosť a množstvo ďalších interných mechanizmov. Každá aplikácia napísaná napríklad v jazykoch C#, F# alebo VB.NET beží práve na CLR.
Čo je CLR
CLR môžeme chápať ako „motor“ .NET aplikácií. Keď program spustíme, CLR sa postará o načítanie programu, jeho kontrolu, kompiláciu do natívneho kódu a samotné vykonanie.
Programátor tak nemusí riešiť množstvo nízkoúrovňových problémov, ako napríklad správu pamäte, bezpečnostné kontroly alebo optimalizáciu kódu pre konkrétny procesor.
Ako prebieha spustenie .NET aplikácie
Keď napíšeme aplikáciu napríklad v jazyku C#, kompilátor ju nepreloží priamo do strojového kódu. Namiesto toho vytvorí medzikód nazývaný IL – Intermediate Language.
Tento kód je uložený v súboroch nazývaných assembly (napríklad DLL alebo EXE).
Pri spustení aplikácie CLR použije mechanizmus JIT (Just-In-Time) kompilácie, ktorý IL kód preloží do natívneho strojového kódu pre konkrétny procesor.
Hlavné úlohy CLR
- načítanie a spustenie assembly
- JIT kompilácia kódu
- správa pamäte
- kontrola typovej bezpečnosti
- správa výnimiek
- podpora generických typov
- interoperabilita s natívnym kódom
Garbage Collector a správa pamäte
Jednou z najdôležitejších častí CLR je Garbage Collector (GC). Jeho úlohou je automaticky uvoľňovať pamäť objektov, ktoré už aplikácia nepoužíva.
GC v .NET používa tzv. generácie pamäte:
- Gen 0 – krátkodobé objekty
- Gen 1 – stredne žijúce objekty
- Gen 2 – dlhodobo existujúce objekty
Tento prístup výrazne zlepšuje výkon aplikácií, pretože väčšina objektov existuje len krátko.
JIT kompilácia
JIT kompilátor prekladá IL kód do natívneho kódu až v momente, keď je daná metóda prvýkrát použitá.
Výhodou je, že CLR môže optimalizovať kód pre konkrétny procesor a operačný systém, na ktorom aplikácia beží.
Assembly a načítanie kódu
CLR pracuje s jednotkami nazývanými assembly. Assembly obsahuje:
- IL kód
- metadáta o typoch
- referencie na ďalšie knižnice
- manifest aplikácie
CLR používa mechanizmus assembly loader, ktorý zabezpečuje načítanie a správne prepojenie knižníc počas behu aplikácie.
Generics v CLR
Generické typy (napríklad List<T> alebo Dictionary<TKey,TValue>)
sú implementované priamo v CLR.
To znamená, že runtime rozumie generickým typom a dokáže ich optimalizovať počas JIT kompilácie.
Výhody generics v CLR:
- typová bezpečnosť
- žiadny boxing pre value typy
- lepšia optimalizácia kódu
- znovupoužiteľnosť algoritmov
Bezpečnosť a kontrola typov
CLR vykonáva množstvo bezpečnostných kontrol ešte pred spustením kódu. Overuje napríklad:
- typovú bezpečnosť
- platnosť IL kódu
- správne používanie pamäte
Tieto kontroly výrazne znižujú riziko pádov aplikácií alebo bezpečnostných chýb.
Výhody CLR
- automatická správa pamäte
- bezpečné spúšťanie kódu
- vysoký výkon vďaka JIT kompilácii
- podpora viacerých programovacích jazykov
- pokročilé runtime optimalizácie
Zhrnutie
CLR je runtime prostredie, ktoré tvorí základ celej platformy .NET. Stará sa o spúšťanie aplikácií, správu pamäte, generické typy, bezpečnosť a optimalizáciu kódu.
Vďaka CLR môžu vývojári písať aplikácie v rôznych .NET jazykoch, pričom všetky využívajú rovnaké runtime služby a infraštruktúru.