Che cos'è "codice gestito"?
Quando si usa .NET, spesso si incontra il termine "codice gestito". Questo articolo illustra il significato di codice gestito e fornisce ulteriori informazioni a riguardo.
In poche parole, il codice gestito è solo questo: il codice la cui esecuzione è gestita da un runtime. In questo caso, il runtime in questione viene chiamato Common Language Runtime o CLR, indipendentemente dall'implementazione ( ad esempio, Mono, .NET Framework o .NET Core/.NET 5+). Il CLR è responsabile dell'acquisizione del codice gestito, della compilazione in codice macchina e quindi della sua esecuzione. Oltre a questo, il runtime fornisce diversi servizi importanti, ad esempio la gestione automatica della memoria, i limiti di sicurezza e la sicurezza dei tipi.
A differenza del modo in cui si esegue un programma C/C++, detto anche "codice non gestito". Nel mondo non gestito, il programmatore è responsabile di praticamente tutto. Il programma effettivo è essenzialmente un file binario caricato dal sistema operativo in memoria e avviato. Tutto il resto, dalla gestione della memoria alle considerazioni sulla sicurezza è un carico di lavoro del programmatore.
Il codice gestito viene scritto in uno dei linguaggi di alto livello che possono essere eseguiti su .NET, ad esempio C#, Visual Basic, F# e altri. Quando si compila il codice scritto in tali linguaggi con il rispettivo compilatore, non si ottiene il codice del computer. Si ottiene del codice in linguaggio intermedio che il runtime poi compila ed esegue. C++ è l'unica eccezione a questa regola, perché può anche produrre file binari nativi non gestiti eseguiti in Windows.
Esecuzione del linguaggio intermedio &
Che cos'è "Intermediate Language" (o IL per breve)? Si tratta di un prodotto di compilazione di codice scritto in linguaggi .NET di alto livello. Dopo aver compilato il codice scritto in uno di questi linguaggi, si otterrà un file binario costituito da IL. È importante notare che l'IL è indipendente da qualsiasi linguaggio specifico che viene eseguito sopra il runtime; esiste anche una specifica separata che si può leggere se si è interessati.
Dopo aver prodotto IL dal codice di alto livello, è molto probabile che si voglia eseguirlo. È qui che il CLR assume il controllo e avvia il processo di just-in-time compilazione o JIT-ing del codice da IL al codice macchina che può effettivamente essere realmente eseguito su una CPU. In questo modo, CLR sa esattamente cosa sta facendo il codice e può gestire in modo efficace.
Il linguaggio intermedio è talvolta chiamato anche Common Intermediate Language (CIL).
Interoperabilità del codice non gestito
Naturalmente, CLR consente di superare i limiti tra il mondo gestito e quello non gestito ed è presente un sacco di codice che lo fa, anche nelle librerie di classi .NET . Questa operazione viene chiamata interoperabilitào interop. Queste disposizioni consentono, ad esempio, di incapsulare una libreria non gestita e di chiamarla. Tuttavia, è importante notare che una volta eseguita questa operazione, quando il codice supera i limiti del runtime, la gestione effettiva dell'esecuzione è di nuovo nella mano del codice non gestito e pertanto rientra nelle stesse restrizioni.
Analogamente a questo, C# è un linguaggio che consente di usare costrutti non gestiti, ad esempio puntatori direttamente nel codice usando ciò che è noto come contesto non sicuro, che definisce una parte di codice per cui l'esecuzione non è gestita da CLR.