недеља, 13. март 2016.

Arhitektura Microsoft .NET Framework-a

Microsoft .NET Framework je razvojna platforma ili kako je još zovu „Operativni sistem u operativnom sistemu“ koje omogućava lakše, brže i bezbednije programiranje i izvršavanje aplikacija i servisa pisanih za .Net tehnologiju. Microsoft .NET Framework radi na Microsoft Windows operativnim sistemima i sastoji se iz dva dela. Prvi deo je osnovna komponenta CLR – Common Language Runtime što bi se na srpskom jeziku moglo prevesti kao „Zajednički jezik u vreme izvršavanja“. CLR je u stvari virtualna mašina koja izvršava aplikacije i servere pisane za .Net tehnologiju, dok drugi deo čini BCL zajedno sa FCL (BCL\FCL). BCL – Base Class Library – Biblioteka baznih klasa je standardna biblioteka dostupna svim programskim jezicima koji koriste Microsoft .NET Framework , sadrži ogromnu kolekciju klasa, interfejsa i tipova podataka dok FCL – Framework Class Library je nadskup na BCL, koji uključuje Microsoft imenske prostore. Inače, većina programera FCL posmatra kao Microsoft-ovu implementaciju BCL-a. BCL se deli na korisnički definisanu biblioteku klasa, koju zovemo Assembly – sklop i predefinisanu biblioteku klasa koju zovemo Namespace – imenski prostor. Obadve biblioteke klasa kao jedna celina pre svega programerima omogućavaju brže, lakše i bezbednije programiranje jer programer pored gotovih isprogramiranih klasa nema potrebe da programira kod koji je već savršeno isprogramiran. Ali to nije sve, već ceo Microsoft .NET Framework omogućava i upravljanje resursima, ponovo korišćenje koda, specijalizaciju koda, razvoj programerske višejezičnosti, bezbednost, administraciju, eksploataciju itd.


( .NET Framework komponente)

Napretkom tehnologije i Microsoft .NET Framework konstantno napreduje i njegova zadnja verzija dok još pišem ovaj post je 4.6.1 realizovana 17 novembra 2015 godine. Microsoft .NET Framework je besplatan, uglavnom se instalira i update-tuje sa Microsoft Visual Studio-om iako ga možete instalirati i bez IDE, zato što je neophodan da bi aplikacije i servisi za .Net tehnologiju uopšte mogle da rade. Programeri uglavnom imaju instalirane više ili sve verzije Microsoft .NET Framework-a, tako da je retkost i videti da na jednom računaru imate instaliran samo jednu verziju Microsoft .NET Framework-a . Prva verzija Microsoft .NET Framework-a se pojavila još u januaru 2002 godine, da bi već u aprilu 2003 godine bila nadograđena na Microsoft .NET Framework verziju 1.1. Ali prava vrednost Microsoft .NET Framework-a nastaje tek od novembra 2005 godine pojavom Microsoft .NET Framework-a 2.0. Ona je sa sobom donela .Net programskim jezicima generike, partialne tipove, anonimne metode, iritatore, tip Nullable kao i delegate. U novembru 2007 godine izlaskom Microsoft .NET Framework-a 3.0 pojavile su se tehnologije poput WF, WCF i WPF i njegovom nadogradnjom na Microsoft .NET Framework 3.5 omogućene su nam auto-propertiji, anonimni tipovi, extension metode, Query izrazi kao i Lambda što u celini predstavlja programski jezik LINQ. U aprilu 2010 godine nam dolazi Microsoft .NET Framework 4.0 karakterističan po integrisanim SilverLight aplikacijama i Dynamic binding - kasnom povezivanju. Od Microsoft .NET Framework 4.5 omogućene su nam pravljenje metro aplikacija i asinhronizovane metode dok trenutna verzija Microsoft .NET Framework 4.6.1 donosi sa sobom pre svega mnogo ispravljenih bagova i poboljšanja svih segmenata, posebno u sferi kriptografije. Zahvaljujući svim izmenama i progresu Microsoft .NET Framework-a, danas na primer programski jezik C# 6.0 ima znatne izmene u samom kodiranju što omogućava brže i kraće pisanje koda.

Osnove CLR – Common Language Runtime-a

CLR – Common Language Runtime se uglavnom kaže da je CLR centralni deo radnog okvira Microsoft .NET Framework-a, da je CLR komponenta Microsoft-ove implementacije pre svega standarda CLI – Common Language Infrastructure što u prevodu znači da je komponenta CLR zajednički jezik izvršavanja za različite i raznovrsne programske jezike. Osnovne karakteristike CLR-a kao što su memorija, otvaranje sklopova, bezbednost, niti, sinhronizacija i rukovanje izuzecima i greškama su jednostavno dostupne svakom programskom jeziku koji ga cilja. CLR koristi izuzetke da prijavi greške, tako da svaki programski jezik koji koristi CLR ima takođe dostupnu ovu mogućnost, kao i na primer svaki programski jezik koji cilja CLR može da kreira Threads – niti, on takođe proverava svaki tip podataka u vašem sklopu. Takođe, CLR omogućava i GC – Garbidge Collection – skupljač smeća. GC oslobađa memoriju kad se resursi više ne koriste. Takođe se može pozvati i programerski u cilju čišćenja memorije. CAS – Code Access Security – obezbeđivač koda, reguliše prava vaše aplikacije zasnovanu na podešavanjima u Windows-u. On stavlja vaš sklop u određenu grupu privilegija u koju vaš sklop pripada i CAS jednostavno obezbeđuje da se kod vaše aplikacije pokreće pod okruženjem sigurnosne konfiguracije vašeg računara kako bi sprečio nepouzdan kod u obavljanju privilegovane akcije. CLR takođe proverava i verifikaciju koda kako bi osigurao pravilno izvršavanje koda i bezbednost tipova podataka u kodu za vreme izvršavanja kako bi sprečio vaš izvorni kod u nelegalnim operacijama poput pristupa pogrešnim lokacijama memorije. Međutim, ukoliko vaš programski jezik ne cilja CLR i kompajlira program bez CLR-a, onda ste vi lišeni svih navedenih mogućnosti koje CLR nudi. Tada vi kao programer morate da isprogramirate i da se pobrinete za sve što CLR sadrži. Svaki programski jezik koji cilja CLR se jasno i nedvosmisleno se zove Managed code – kontrolisani kod, dok svaki programski jezik koji ne cilja CLR se zove Unmanaged code – nekontrolisani ili nebezbedni kod. U C# programskom jeziku moguće je tokom programiranja u kontrolisanom kodu radi brzine i bolji performansi neki deo koda napisati kao nekontrolisani kod ali u kontrolisanom okruženju koristeći ključnu reč unsafe prilikom deklaracije metoda koji sadrži nebezbedni kod.

( CLR - Common Language Runtime dijagram )

Što se tiče kompajlera, Microsoft ima nekoliko koji ciljaju CLR i to su C++/CLI, C#, Visual Basic, IronPython, IronRuby, IL – Intermediate Language, ali i Ada, APL, Caml, COBOL, Eiffel, Forth, Fortran, Haskell, LexicoLISP, LOGO, Lua, Mercury, ML, Oberon , Pascal , Perl , PHP, Prolog, RPG , Sheme, Smalltalk i Tcl/Tk bez obzira što su to jezici drugih proizvođača i ne spadaju u .Net programske jezike.

( CLR - Common Language Runtime dijagram )

Svaki programski jezik, čak i .Net programski jezici imaju svoje različite kompajlere. Na primer za C# programski jezik koristi CSC – CSharp CompilerC# kompajler.

C:\Program Files (x86)\Microsoft Visual Studio 14.0>csc /?
Microsoft (R) Visual C# Compiler version 1.0.0.50618
Copyright (C) Microsoft Corporation. All rights reserved.
...


Dok Visual Basic ima takođe svoj kompajler VBC – Visaul Basic Compiler - Visual Basic kompajler.

C:\Program Files (x86)\Microsoft Visual Studio 14.0>vbc /?
Microsoft (R) Visual Basic Compiler version 1.0.0.50618
Copyright (C) Microsoft Corporation. All rights reserved.
...


Bez obzira koji vi koristite .Net programski jezik, njegov kompajler će taj jezik, izvorni kod; pretvoriti u CIL – Common Intermediate Language – Zajednički posrednički jezik – koji se formalno zove MSIL – Microsoft Intermediate Language – Mikrosoft posrednički jezik ili još kraće IL - Intermediate Language - Posrednički jezik. IL je sam po sebi kontrolisani kod. IL je sličan asemblerskom programskom jeziku i zato što se svi .Net programski jezici prevode u IL programskom jeziku, IL omogućava da različiti programski jezici međusobno komuniciraju. Na primer, kad vi napišete u C# programskom jeziku:


int i = 8; // CSharp language

ili to isto napišete u Visual Basic programskom jeziku.



Dim i As Integer = 8 ' VB language

IL programski jezik će zahvaljujući CTS – Common Type System – Zajednički tip sistema; sistemu koji preslikava tipove podataka specifičnih za ekvivaletni tip podataka Microsoft .NET Framework-a preslikati i tip int u C# programskom jeziku i integer u Visual Basic programskom jeziku u .Net-ov tip podataka.



System.Int32 i = 8; // .Net System.Int32 type

Na taj način je omogućena programerska višejezička kompatabilnost. Kad kompajler prevede vaš izvorni kod na IL programski jezik, onda se prevedeni vaš kod zove i objektni kod. IL prvo cilja na  CLR i prvo proverava CLS – Common Language Specification – Zajednička jezička specifikacija i druge instrukcije pre nego što se vaš izvorni kod prevede u objektni kod. Ukoliko vaš izvorni kod krši pravila CLS-a ili jednostavno sadrži Compile Time Errors – sintaksne ili Run Time Errors - sintatičke greške, kompajler neće kopmajlirati vaš izvorni kod u objektni kod, već će vam prijaviti grešku. Ukoliko nemate grešaka, vaš izvorni kod će biti preveden u objektni kod. Objektni kod se pamti u datoteci izvršnog fajla *.exe ili *.dll dinamičnoj link biblioteci fajlu.

Kako kompajler zna koju datoteku će prevesti u .exe a koju u *.dll datoteku?

Jednostavno, svaka datoteka koja ima početnu Main() metodu se prevodi u izvršnu datoteku *.exe, dok sve ostale datoteke se prevode kao klase i objektni kod smeštaju u *.dll datoteku. Imajte u vidu da .Net-ove *.exe i *.dll datoteke nisu iste kao datoteke napravljene pomoću drugih starijih razvojnih alata. One samo liče na prethodne datoteke *.exe i *.dll. Sad kad je kompajler uspešno kompajlirao izvorni kod u IL programski jezik i smestio objektni kod u datoteke, tada se prilikom pozivanja datoteke na izvršenje pokreće JIT – Just in Time – tačno na vreme; kompajler koji prevodi IL kod na mašinski jezik.


 ( JIT Compiler prevodi objektni kod u izvršni kod )


Znači linkovanjem objektnog koda se dobija mašinski ili izvršni kod. Tokom izvršavanja vaše aplikacije JIT ne prevodi celu aplikaciju, sav vaš IL kod, nego samo deo koda koji je potreban za izvršavanje aplikacije. Neki delovi koda koje korisnik trenutno ne koristi u aplikaciji se neće ni kompajlirati. Zato se JIT kompajler i zove tačno na vreme. To ima ogromnu prednost naspram starijih kompajlera koji prevode celi izvorni kod u izvršni kod.