Jak działa .Netowy mechanizm kompilacji:

  1. Mamy kod napisany w wysoko abstrakcyjnym języku który jest zgodny ze standardem CLS(Common Language Specification)

  2. Kompilator kompiluje kod źródłowy do kodu CIL(Common Intermediate Language).

  3. W momencie uruchomienia aplikacji JIT-er pobiera kod w CIL-u i na wyjściu generuje natywny kod zoptymalizowany pod architekturę naszego systemu , procka itp [ fragmenty kodu są często cachowane zwiększając wydajność procesu]. Kompilator nie przetwarza całego kodu. Wyciąga tylko te fragmenty , które są aktualnie używane. Proces ten różni się od mechanizmu C++ - owego , jeden proces kompilacji ,przetworzenie całego piku źródłowego , linkowanie i na wyjsciu plik wykonywalny. W sumie “Just in Time compialtion” jest czymś pośrednim między Kompilatorem standardowym a Interpreterem.

Za każdym razem kompilator działający w trybie normalnym optymalizuje proces kompilacji , dostosowywuje go do naszego sprzętu.

Mechanizmy optymalizacyjne:

-constant folding Proces upraszczania stałych w czasie kompilacji. Np kompilator wyrażenie 202020 zamieni na liczbe całkowita 8000

-copy propagation Wyszukiwanie przypisań bezpośrednich (np x=y) i zastępowanie ich jedną zmienną.

-elimination of range checking Wyłączenie sprawdzania przekroczenia zakresu np w tablicy w miejscach gdzie to sprawdzenie jest niepotrzebne.

-elimination of common subexpressions Wyszukiwanie podobnych wyrażeń i zastępowanie ich jedną zmienną.

-method inlining Zastępowanie wywołania metody kodem zawartym w funkcji.

Do dyspozycji prócz standardowego JIT-era mamy jeszcze. EconoJIT -er , który nie przeprowadza optymalizacji i tym samym proces kompilacji jest znacznie szybszy. Dodatkowo można wyłączyć opcję cachowania fragmentów kodu. Jest to szczególnie ważne w sytuacji gdy mamy dostępny niewielki obszar pamięci.

Ciekawym narzędziem dostępnym w ramach platformy .Net jest Ngen (Native Image Generator). Ngen kompiluje kod natywny i trzyma go w plikach zwanych “native images” , które wrzuca do cachu. Dzięki temu przy uruchomeniu konkretnego programu nie musimy przeprowadzać kompilacji JIT-owej ponieważ korzystamy z tego prekompilowanego kodu.

Jeżeli kogoś interesowałoby deployowanie aplikacji skompilowanej do natywnego kodu bez uzywania Jitera i bez konieczności instalowania .Net Frameworka .Istnieją narzędzia które pozwalają to zrobić np. Salamander

Share