====== CLR (Common Language Runtime) ====== **CLR (Common Language Runtime)** je běhové prostředí a virtuální stroj, který tvoří základ [[.NET Framework|.NET Frameworku]]. Jedná se o klíčovou komponentu, která zajišťuje provádění kódu napsaného v libovolném [[.NET Framework#podporovane_jazyky|.NET jazyce]]. ===== Základní funkce ===== CLR je zodpovědný za několik zásadních funkcí během běhu aplikace: * **Správa paměti** – automatické přidělování a uvolňování paměti prostřednictvím Garbage Collectoru * **Kompilace kódu** – převod MSIL (Microsoft Intermediate Language) na nativní strojový kód pomocí JIT kompilátoru * **Správa vláken** – řízení multithreadingu a synchronizace * **Zabezpečení** – kontrola oprávnění a bezpečnostní politiky (Code Access Security) * **Zpracování výjimek** – jednotný systém pro ošetření chyb napříč různými jazyky * **Type safety** – kontrola typové bezpečnosti kódu ===== Jak CLR funguje ===== Proces provádění .NET aplikace probíhá v těchto krocích: - Zdrojový kód v [[CSharp|C#]], VB.NET nebo jiném jazyce se zkompiluje do **MSIL** (Intermediate Language) - MSIL je uložen v assemblies (soubory .exe nebo .dll) spolu s metadaty - Při spuštění aplikace CLR načte assembly - **JIT kompilátor** (Just-In-Time) převádí MSIL na nativní strojový kód pro konkrétní procesor - Nativní kód je vykonán procesorem ===== Garbage Collection ===== Jednou z nejvýznamnějších funkcí CLR je **automatická správa paměti**: * Vývojář nemusí ručně uvolňovat paměť (jako v C/C++) * Garbage Collector automaticky detekuje a odstraňuje nepoužívané objekty * Používá **generační přístup** (Generation 0, 1, 2) pro optimalizaci výkonu * Zabraňuje běžným chybám jako memory leaks nebo dangling pointers ===== JIT kompilátor ===== **Just-In-Time (JIT) kompilátor** převádí MSIL na nativní kód: * **Normal JIT** – kompiluje metody při prvním zavolání * **Econo JIT** – rychlejší kompilace s menší optimalizací * **Pre-JIT** – kompilace celého assembly při instalaci (ngen.exe) Kompilovaný kód je uložen v cache, taktakže každá metoda se kompiluje pouze jednou během běhu aplikace. ===== Výhody CLR ===== Použití CLR přináší několik významných výhod: * **Přenositelnost** – stejný MSIL kód běží na různých architekturách * **Jazyková interoperabilita** – různé .NET jazyky mohou snadno spolupracovat * **Bezpečnost** – kontrola kódu před spuštěním, izolace aplikací * **Výkon** – JIT optimalizace pro konkrétní hardware * **Spolehlivost** – automatická správa paměti snižuje počet chyb ===== CTS a CLS ===== CLR definuje dva důležité standardy: * **CTS (Common Type System)** – jednotný typový systém pro všechny .NET jazyky, definuje jak se typy chovají a jak spolu komunikují * **CLS (Common Language Specification)** – pravidla, která musí jazyky dodržovat pro zajištění interoperability ===== Managed vs Unmanaged Code ===== * **Managed Code** – kód spuštěný pod kontrolou CLR, má přístup ke všem službám CLR * **Unmanaged Code** – kód běžící mimo CLR (např. COM komponenty, nativní DLL), nemá automatickou správu paměti CLR umožňuje **interoperabilitu** mezi managed a unmanaged kódem pomocí: * P/Invoke – volání nativních Windows API * COM Interop – práce s COM komponentami ===== Assemblies ===== CLR pracuje s jednotkami nazývanými **assemblies**: * Základní stavební bloky .NET aplikací * Obsahují MSIL kód a metadata * Mohou být soubory .exe nebo .dll * **Private assemblies** – dostupné pouze pro jednu aplikaci * **Shared assemblies** – sdílené mezi aplikacemi v [[GAC]] (Global Assembly Cache) ===== Application Domains ===== CLR podporuje **izolaci aplikací** pomocí Application Domains (AppDomains): * Lehčí než procesy operačního systému * Umožňují běh více aplikací v jednom procesu * Poskytují izolaci a bezpečnostní hranice * Aplikace lze načítat a uvolňovat bez ukončení procesu ===== Verze CLR ===== CLR měl několik hlavních verzí odpovídajících verzím .NET Frameworku: ^ Verze CLR ^ Verze .NET Framework ^ | CLR 1.0 | .NET Framework 1.0 | | CLR 1.1 | .NET Framework 1.1 | | CLR 2.0 | .NET Framework 2.0, 3.0, 3.5 | | CLR 4 | .NET Framework 4.x | ===== CoreCLR ===== Pro [[.NET Core]] byl vyvinut **CoreCLR** – open-source verze CLR: * Multiplatformní (Windows, Linux, macOS) * Modulárnější a lehčí * Optimalizovaný pro cloud a kontejnery * Aktivně vyvíjen na [[https://github.com/dotnet/runtime|GitHubu]] ===== Příklad ===== // Jednoduchý C# program using System; class Program { static void Main() { Console.WriteLine("Hello from CLR!"); } } Tento kód: - Se zkompiluje do MSIL - CLR ho načte při spuštění - JIT kompilátor ho převede na nativní kód - CLR zajistí garbage collection pro objekty - CLR zpracuje případné výjimky ===== Související pojmy ===== * [[.NET Framework]] – celková platforma * [[MSIL]] – Microsoft Intermediate Language * [[JIT]] – Just-In-Time kompilátor * [[Garbage Collection]] – automatická správa paměti * [[GAC]] – Global Assembly Cache * [[CSharp]] – programovací jazyk C# * [[.NET Core]] – multiplatformní verze ===== Externí odkazy ===== * [[https://learn.microsoft.com/cs-cz/dotnet/standard/clr|Microsoft dokumentace ke CLR]] * [[https://github.com/dotnet/runtime|CoreCLR na GitHubu]]