200 likes | 382 Views
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?.
E N D
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 • CommonType 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
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 IntermediateLanguage • 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, dopieropóź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-timecompilation) - 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 (NativeImage Generator) • Kompiluje kod całego podzespołu do kodu binarnego • Kod maszynowy umieszczany jest w pamięci podręcznej obrazów kodu natywnego (NativeImageCache) • Pozwala to na szybsze uruchamianie aplikacji
KONIEC Źródła • www.microsoft.com