CLR na platformie .NET
Download
Report
Transcript 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ęzyka
Kompilacja do MSIL
Wykonanie kodu zarządzanego
Obsługa typów danych
Różne języki, różna składnia
Podobne podstawowe pojęcia:
Liczba całkowita
Napis
Zbieranie kodu w metody
Grupowanie danych i metod w klasy
CTS - Wspólny zestaw typów
danych
Common Type System
Zestaw typów, niezależny od składni języka
Każ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 referencyjne
Uż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 referencyjne
Pamięć ze stosu zwalniana jest automatycznie
Pamięć ze sterty po zapełnieniu zwalnia odśmiecacz
(garbage collector)
GC działa automatycznie, nie zaleca się jawnego
uruchamiania go w aplikacji
Odzyskiwanie pamięci
Tworzenie aktualnej listy „osiągalnych” obiektów
2. Usuwanie obiektów spoza listy
3. Porządkowanie sterty w spójny blok zajętej pamięci
4. Poprawianie istniejących odwołań
1.
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:
Finalizatory
Każ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 finalizator
Finalizator 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ęzyka
Common Language Specification
Wywołanie kodu napisanego w jednym języku, z kodu
napisanego w innym
Wymaga to obsługi w różnych językach typów danych
w ten sam sposób
Okreś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ądzany
Kompilatory zamieniają kod źródłowy napisany w
dowolnym języku na:
Kod wykonywalny zapisany w MSIL
Metadane, 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średni
Microsoft Intermediate Language
Kod podobny do zestawu instrukcji procesora
Polecenia MSIL bazują bezpośrednio na pojęciach
zdefiniowanych w CTS
Kod ź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
Metadane
Szczegółowy opis typów zdefiniowanych w kodzie
zarządzanym, z którym są związane
Przechowywane w tym samym pliku co kod MSIL
Opisują 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/tekst
Grupowanie 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 systemie
W 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ądzanego
Przy uruchomieniu aplikacji, potrzebne podzespoły są
odnajdywane i ładowane do pamięci
Jeśli aplikacja nie wywoła żadnej metody z
podzespołu, nie zostanie on w ogóle załadowany
Podzespoł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 kompilacji
JIT (just-in-time compilation) - kompilacją w samą porę
1.
Każda metoda kompilowana jest dopiero w czasie
pierwszego uruchomienia
Kompilacja następuje przy każdym uruchomieniu aplikacji
Przy użyciu NGEN (Native Image Generator)
2.
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
Źródła
www.microsoft.com
KONIEC