JIT-er
Jak działa .Netowy mechanizm kompilacji:
-
Mamy kod napisany w wysoko abstrakcyjnym języku który jest zgodny ze standardem CLS(Common Language Specification)
-
Kompilator kompiluje kod źródłowy do kodu CIL(Common Intermediate Language).
-
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