CLR na platformie .NET
description
Transcript of CLR na platformie .NET
Tomasz Kostarski
O czym będzie?Co to jest CLR?Obsługa typów danych (CTS i Pakowanie)Zarządzanie pamięcią (Odzyskiwanie i
Finalizatory)Wspólna specyfikacja języka (CLS)Kod zarządzalny (MSIL, Metadane,
Podzespoły, Wykonywanie kodu)
Co to jest CLR?Wspólne środowisko uruchomieniowe (Common Language Runtime)Wybór kompilatora dla językaKompilacja do MSILWykonanie kodu zarządzanego
Obsługa typów danychRóżne języki, różna składniaPodobne podstawowe pojęcia:
Liczba całkowitaNapisZbieranie kodu w metodyGrupowanie danych i metod w klasy
CTS - Wspólny zestaw typów danychCommon Type SystemZestaw typów, niezależny od składni językaKażdy język zgodny z CLR musi używać chociaż
części typów z CTS, ale może mieć dowolną składnię
W każdym języku można definiować własne typy danych spoza CTS
Typy skalarne i referencyjne, wszystkie dziedziczą po Object
Wszystkie typy skalarne to typy proste, na stosie pamiętamy ich wartość
Typy referencyjne przechowują na stosie wskaźnik do swych wartości umieszczonych gdzieś w pamięci
Najważniejsze typy danych w CTS
Pakowanie (boxing)Konwersja typów skalarnych na typy referencyjneUżywane np. przy przekazywaniu wartości skalarnej
do metody oczekującej typu referencyjnego
Możliwa powtórna konwersja przez rozpakowanie
Większość języków z CLR wykonuje to automatycznie
Oczywisty wpływ na wydajność
Zarządzanie pamięciąPamięć dla danych przydzielana na stosie lub
stercie – zmienne skalarne lub referencyjnePamięć ze stosu zwalniana jest automatyczniePamięć ze sterty po zapełnieniu zwalnia
odśmiecacz (garbage collector)GC działa automatycznie, nie zaleca się
jawnego uruchamiania go w aplikacji
Odzyskiwanie pamięci1. Tworzenie aktualnej listy „osiągalnych” obiektów2. Usuwanie obiektów spoza listy3. Porządkowanie sterty w spójny blok zajętej
pamięci4. Poprawianie istniejących odwołań
Najwięcej śmieci wśród najmłodszych obiektów Najstarsze obiekty przesuwane są ku końcowi
sterty Odśmiecanie najmłodszych obiektów, a jeśli
nadal brakuje pamięci przeglądanie starszych
Przed:
Po:
FinalizatoryKażdy obiekt na stercie posiada finalizator
(domyślnie pusty)Kiedy GC znajdzie obiekt do usunięcia umieszcza
go na liście oczekujących na finalizacjęPo przeszukaniu całej pamięci, dla każdego
obiektu z listy wykonuje się jego finalizatorFinalizator to nie destruktor – nie wiadomo kiedy i
czy się wykona (aplikacja może zakończyć się wcześniej)
Dla ważnych czynności sprzątających lepiej stworzyć odpowiednią metodę
CLS - Wspólna specyfikacja językaCommon Language SpecificationWywołanie kodu napisanego w jednym języku, z
kodu napisanego w innymWymaga to obsługi w różnych językach typów
danych w ten sam sposóbOkreśla jak duży podzbiór CTS musi byś
zaimplementowany w języku, by osiągnąć zgodność
Niektóre wymagania: obsługa większości typów skalarnych, najniższy indeks w tablicy musi być zerem
Kod zarządzanyKompilatory zamieniają kod źródłowy
napisany w dowolnym języku na:Kod wykonywalny zapisany w MSILMetadane, czyli informacje na temat kodu
wykonywalnego i danych przez niego używanych
W czasie wykonania aplikacji, CLR tłumaczy kod MSIL na kod natywny procesora
Ta konwersja daje możliwość zarządzania wykonaniem aplikacji, stąd nazwa
MSIL - standardowy język pośredniMicrosoft Intermediate LanguageKod podobny do zestawu instrukcji procesoraPolecenia MSIL bazują bezpośrednio na
pojęciach zdefiniowanych w CTSKod źródłowy z języków wyższego poziomu,
kompilowany jest do wspólnego kodu pośredniego
Dodatkowa warstwa abstrakcji daje nam potencjalną przenośność
Możliwość sprawdzenia bezpieczeństwa typów przed uruchomieniem
MetadaneSzczegółowy opis typów zdefiniowanych w
kodzie zarządzanym, z którym są związanePrzechowywane w tym samym pliku co kod
MSILOpisują między innymi: nazwy typów, zasięgi,
po kim dziedziczy, interfejsy, metody, obsługiwane zdarzenia
Z metadanych korzysta funkcja IntelliSense w Visual Studio .NET
W metadanych opisane są też atrybuty
Podzespoły/Złożenia (assembly)Aplikacja składa się z różnych plików,
kod/grafika/tekstGrupowanie plików stanowiących jeden logiczny
moduł, udostępniający określoną funkcjonalnośćManifest – odpowiednik metadanych dla pojedynczego
podzespołu, zawiera: nazwę podzespołu (może to być nazwa silna),numer wersji podzespołu (wspólny i taki sam dla
wszystkich modułów, które stanowią podzespół), informacje na temat kultury (lub języka) obsługiwanej
przez podzespół, listę wszystkich plików, które stanowią podzespół, wraz
z ich sumami kontrolnymi, listę innych wymaganych do pracy podzespołów wraz z
numerami ich wersji.
Podzespoły c.d.Silna nazwa – unikatowa w całym systemieW CLR nazwa typu danych, to nazwa nadana
+ nazwa podzespołu w którym został zdefiniowany
Większość podzespołów to pojedynczy plik DLL
Instalacja podzespołu to po prostu skopiowanie plików nie wymaga dodania wpisów do rejestru
Wykonywanie kodu zarządzanegoPrzy uruchomieniu aplikacji, potrzebne podzespoły
są odnajdywane i ładowane do pamięciJeśli aplikacja nie wywoła żadnej metody z
podzespołu, nie zostanie on w ogóle załadowanyPodzespoły są najpierw szukane w GAC (Global
Assembly Cache) - globalna pamięć podręczna podzespołów, dopiero później w innych miejscach
Po załadowaniu podzespołów potrzebna jest jeszcze ich kompilacja z MSIL na kod natywny
Dwie metody kompilacji1. JIT (just-in-time compilation) - kompilacją w samą
porę Każda metoda kompilowana jest dopiero w czasie
pierwszego uruchomienia Kompilacja następuje przy każdym uruchomieniu
aplikacji
2. Przy użyciu NGEN (Native Image Generator) Kompiluje kod całego podzespołu do kodu binarnego Kod maszynowy umieszczany jest w pamięci podręcznej
obrazów kodu natywnego (Native Image Cache) Pozwala to na szybsze uruchamianie aplikacji
KONIEC
www.microsoft.comŹródła