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 Usuwanie obiektów spoza listy Porządkowanie sterty w spójny blok zajętej pamięci 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:
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ę 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) 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