Scopul acestui articol este de a fixa cat mai bine conceptul de functionare al platformei de programare .Net. Dupa opinia mea, acest lucru este esential pentru un dezvoltator .Net.
Vom enumera, pe scurt, cateva caracteristici importante din .NET, apoi vom descrie componentele .Net Framework.
Functionalitati .NET
Sa enumeram cateva din functionalitatile importante ale .NET, care au reusit sa ii convinga pe programatori sa adopte aceasta platforma:
- interoperabilitate cu secvente de cod “unmanaged” (cod care ruleaza in afara CLR).
- suport pentru numeroase limbaje de programare.
- executie comuna pentru toate limbajele .NET. Programele in .Net se executa sub supravegherea CLR, acesta garantand anumite proprietati si un anumit comportament din punct de vedere al memoriei, securitatii, erorilor.
- o imensa librarie de clase de baza care se adreseaza tuturor limbajelor .Net. Sunt disponibile clase care incapsuleaza functii de grafica, interactiune cu baza de date, XML, algoritmi, etc.
- un model simplu de deployment prin includerea unor instrumente care ajuta la instalarea programului in conditiile de securitate si fara a interfera cu versiuni anterioare.
Cele trei entitati care stau la baza functionarii .Net sunt: CLR, CTS, CLS.
Common Language Runtime
Cel mai important concept in functionarea .NET il reprezinta Common Language Runtime. El este un “layer” (nivel, strat) intre sistemul de operare si aplicatiile .Net. Acestea nu comunica direct cu sistemul de operare, ci prin intermediul CLR.

Ca sa definim “runtime” putem spune ca poate fi inteles ca o colectie de servicii care este apelata la executia unui anumite unitati de cod compilat.
Termenul “runtime”” in .Net este reprezentat de Common Language Runtime (CLR). Pentru dezvoltatorii Java, exista Java Virtual Machine.
Principalul scop al CLR este de a localiza, incarca si de a administra tipurile .Net. De asemenea, se ocupa de managementul memoriei, al thread-uilor si de securitate. Pe scurt, CLR se ocupa de executia programului.
Baza CLR o reprezinta un dll numit mscoree.dll (Common Object Runtime Execution Engine).
Functionalitatile din CLR sunt disponibile pentru orice limbaj de programare .Net folosit. Daca la runtime se folosesc exceptii pentru a raporta eventuale erori, atunci toate limbajele vor receptiona erorile prin execeptii.
CLR “nu stie” ce limbaj de programare a fost folosit in fisierele cod-sursa ale programului. Se poate folosi orice limbaj de programare atat timp cat compilatorul acestuia este compatabil cu CLR.
O data cu lansarea .Net Framework 4.0, versiunea CLR a ajuns la 4.0.
Pentru mai multe informatii despre CLR, puteti urmari un interviu cu Ian Carmichael, despre istoria si viitorul CLR.
Common Type System
.Net este independent de limbaj (suporta peste 20 de limbaje de programare diferite). Cu toate acestea, un programator se poate folosi de tipurile de date specifice limbajului preferat, fara a intampina probleme.
De exemplu, in fiecare limbaj exista un cuvant cheie unic pentru a defini un tip de baza (o variabila de tip intreg este declarata in C# ca int, in Visual Basic este declarata ca integer sau in C++ ca int. Acestea indica in cele din urma tipul de baza System.Int32 in .Net Framework, in assembly-ul mscrolib.dll.
Common Type System defineste modul in care tipurile de date urmeaza sa fie declarate si administrate la executie. Functionalitatea principala a CTS este de a standardiza conventiile pe care trebuie sa le respecte toate limbajele de programare din .Net. In plus, CTS se ocupa si de type safety.
Cu ajutorul CTS se elimina probleme legate de overflow/underflow pentru datele numerice, sau probleme despre reprezentarea tipurilor, de exemplu, string, boolean, etc, in alte limbaje.
CTS suporta tipurile valoare si tipurile referinta.
Observatie: Un limbaj de programare .Net nu suporta fiecare functionalitate definita de CTS.
Important de retinut este ca CTS este o specificatie formala care arata cum trebuie sa fie definite tipurile pentru a fi gazduite de CLR. Probabil cei mai interesati de modul cum functioneaza CTS sunt programatorii care dezvolta instrumente de programare/compilatoare care au ca tinta platforma .Net.
Puteti accesa http://www.dotnetlanguages.net pentru a vedea o lista cu limbajele de programare din .Net.
Common Language Specification
Fiecare limbaj de programare indica in mod unic, cu ajutorul sintaxei proprii, aceleasi constructii de programarare (tipuri de date, controlul fluxului) – programming constructs. De exemplu, in C# concatenarea se poate face cu ajutorul operatorului +, iar in VB se foloseste &.
Aceste diferente minore sunt aproapte neinsemnate pentru .Net runtime, deoarece compilatoarele limbajelor respective emit acelasi set de instructiuni in limbaj MSIL.
CLS reprezinta regulile care descriu setul de functionalitati pe care un compilator .Net trebuie sa il suporte pentru a produce cod care sa fie gazduit de CLR.
Regulile din CLS trebuie cunoscute de cei care dezvolta compilatoare si vor ca produsele lor sa functioneze perfect in mediul .Net.
CLS Compliance
Exista situatii in care, in C#, este nevoie de “programming constructs” care nu sunt conforme cu CLS. In aceste cazuri, se poate folosi atributul CLSCompliant pentru a instrui compilatorul sa verifice fiecare linie de cod din punct de vedere al regulilor CLS. Daca sunt gasite incalcari ale acestor reguli, vor fi afisate erori de compilare.
Microsoft Intermediate Language
Cand se compileaza un program .Net, codul sursa nu se converteste in cod binar, ci intr-un cod intermediar numit Micrososft Intermediate Language (MSIL) sau, dupa noua denumire, Common Intermediate Language.

Toate compilatoarele limbajelor .NET emit instructiuni CIL si metadata.
Cand un *.dll sau *.exe a fost creat cu un compilator .Net, se foloseste termenul abstract assembly.
Un assembly contine cod CIL (este similar notiunii de bytecod din JAVA) si metadata. De exemplu, daca am clasa Agent, metadata va contine detalii despre clasa de baza a clasei Agent, despre interfetele implementate si informatii despre fiecare membru al clasei.
Un assembly este la randul lui descris folosind metadata. Aceste informatii reprezinta un manifest (detalii despre versiunea curenta a assembly-ului, referinte catre assembly-uri externe).
In cele mai multe cazuri, exista o singura corespondenta intre un assembly .Net si un fisier binar (.dll,.exe). In cazul in care scriem un program pentru desktop, executabilul poate fi referit ca assembly-ul in sine.
Daca un assembly este compus dintr-un singur dll sau exe atunci se numeste single-file assembly. Acesta contine instructiunile CIL, metadata si fisierul manifest intr-un pachet bine definit, independent.
Daca un assembly este compus din mai multe fisiere binare, el se numeste multi-file assembly. Fiecare fisier component poarta numele de modul. Unul din aceste module trebuie sa fie considerat principal si sa contina fisierul manifest al assembly-ului.
Codul MSIL contine instructiuni care sunt independente de orice CPU. Este treaba CLR sa transforme acest cod intermediar intr-un cod executabil pe un mediu in care regulile CLR sunt implementate.
Compilatorul JIT
Atunci cand codul CIL compilat trebuie sa fie executat, CLR invoca compilatorul Just In Time (Jitter). Acesta va compila instructiunile CIL in cod executabil specific masinii sau sistemului de operare. Compilatoarele JIT se diferentiaza de cele traditionale prin faptul ca ele transforma codul CIL in cod nativ doar cand e nevoie. De exemplu, atunci cand o functie este apelata, codul CIL al functiei este convertit in cod nativ chiar atunci, just in time. Daca o sectiune de cod CIL este convertita la cod nativ, data viitoare cand este nevoie de aceasta, CLR va folosi aceeasi copie (deja compilata) fara a recompila.
Compilatoarele JIT optimizeaza codul in functie de procesor si sistem de operare, la executie. Microsoft spune ca C# si .Net nu concureaza cu C++ din punct de vedere al eficientei si al vitezei de executie, dar in anumite cazuri datorita compilatoarelor JIT, codul poate devine mai rapid decat in C++.

Base class libraries
Pe langa CLR si specificatiile din CLS/CLR, platofrma .NET pune la dispozitie o librarie pentru toate limbajele de programare din .Net.
BCL incapsuleaza functii pentru lucrul cu thread, I/O, grafica, interactiune cu dispozitive hardware externe. De asemea, BCL furnizeaza suport pentru servicii apelate de aplicatii din lumea reala (acces la baza de date, manipularea documentelor XML, securitate).
BCL a fost actualizata cu fiecare versiune de .Net Framework.
Observatie: A nu se confunda BCL cu FCL. Chiar daca nu are un mare impact asupra dezvolatorilor, consider ca este util sa cunoastem aceste diferente.
FCL reprezinta tot ce este inclus in instalarea .Net (ADO.NET, ASP.NET, WPF, etc).
BCL reprezinta o parte din ECMA (European Computer Manufacturers Association) pentru Common Language Infrastructure.
Concluzii
In ansamblu, .Net Framework se bazeaza pe un motor de executie, runtime, (mscoree.dll) si pe o vasta librarie de clase (mscorlib.dll plus alte referinte).
Assembly-urile .Net pot fi dezvoltate sau rulate pe o platforma non-Microsoft datorita Common Language Infrastructure (CLI).
CLR poate gazdui orice assembly care se supune regulilor codului managed. Assembly-urile contin instructiuni CIL care sunt compilate in instructiuni specifice masinii/platformei de un compilator JIT.
Exista implementari ale .Net Framework, open-source, de exemplu, Mono, care permit programelor sa ruleze pe Mac Os si Unix.
Sunt cazuri in care, datorita functionalitatilor si flexibilitatii oferite, sa intervina “costuri” mai mari la executie in ceea ce priveste performanta.
Versiuni de .Net Framework ruleaza pe Windows, PocketPC, pe Zune media player, in Azure Cloud, chiar si pe consolele de jocuri Xbox.
Bogdan says:
Foarte interesant articolul. Desi programez in .NET nu m-am interesat pana acum despre dedesupturile .NET-ului.
Bogdan says:
‘Autorule’, vreau sa-ti urez Sarbatori Fericite!
zeltera says:
Multumesc. Si tie.
Stefan says:
Mersi pentru informatii ! Este f. interesant cand cineva, bine intentionat, iti deschide perspective si te face sa intrelegi la ce sunt necesare anumite platforme de lucru si nu lucrezi, asa, dea-n boulea (cum se spune pe romaneste). Inca odata multumesc !!!