Co konkretnie robi kompilator JIT, a nie kompilator inny niż JIT? Czy ktoś może podać zwięzły i łatwy do zrozumienia opis?
compilation
compiler-construction
jit
Michiel Borkent
źródło
źródło
Odpowiedzi:
Kompilator JIT jest uruchamiany po uruchomieniu programu i kompiluje kod (zwykle kod bajtowy lub instrukcje VM) w locie (lub jak to się nazywa w odpowiednim momencie) w formie, która jest zwykle szybsza, zazwyczaj natywna jednostka centralna hosta zestaw instrukcji. JIT ma dostęp do dynamicznych informacji o środowisku wykonawczym, podczas gdy standardowy kompilator tego nie robi i może dokonywać lepszych optymalizacji, takich jak często używane funkcje wstawiania.
Jest to przeciwieństwo tradycyjnego kompilatora, który kompiluje cały kod do języka maszynowego przed pierwszym uruchomieniem programu.
Parafrazując, konwencjonalne kompilatory budują cały program jako plik EXE PRZED pierwszym uruchomieniem. W przypadku programów w nowszym stylu zestaw jest generowany z pseudokodem (kod p). Dopiero po uruchomieniu programu w systemie operacyjnym (np. Dwukrotne kliknięcie jego ikony) kompilator (JIT) uruchomi się i wygeneruje kod maszynowy (kod m), który zrozumie procesor oparty na procesorze Intel lub cokolwiek innego.
źródło
Na początku kompilator był odpowiedzialny za przekształcenie języka wysokiego poziomu (zdefiniowanego jako wyższy poziom niż asembler) w kod obiektowy (instrukcje maszynowe), który następnie zostałby połączony (przez linker) w plik wykonywalny.
W pewnym momencie ewolucji języków kompilatory skompilują język wysokiego poziomu w pseudo-kod, który zostanie następnie zinterpretowany (przez interpretera) w celu uruchomienia programu. To wyeliminowało kod obiektowy i pliki wykonywalne oraz pozwoliło na przenoszenie tych języków na wiele systemów operacyjnych i platform sprzętowych. Pascal (skompilowany do kodu P) był jednym z pierwszych; Java i C # to nowsze przykłady. Ostatecznie termin P-Code został zastąpiony kodem bajtowym, ponieważ większość pseudo-operacji ma długość bajtu.
Kompilator Just-In-Time (JIT) jest funkcją interpretera wykonawczego, który zamiast interpretować kod bajtowy za każdym razem, gdy wywoływana jest metoda, kompiluje kod bajtowy w instrukcjach kodu maszynowego uruchomionego komputera, a następnie wywołuje to zamiast tego kod obiektu. Idealnie sprawność działania kodu obiektowego przezwycięży nieefektywność ponownej kompilacji programu przy każdym uruchomieniu.
źródło
JIT - w samą porę samo słowo mówi, kiedy jest potrzebne (na żądanie)
Typowy scenariusz:
Kod źródłowy jest całkowicie konwertowany na kod maszynowy
Scenariusz JIT:
Kod źródłowy zostanie przekonwertowany na język asemblera podobny do struktury [dla ex IL (język pośredni) dla C #, ByteCode dla java].
Kod pośredni jest konwertowany na język maszynowy tylko wtedy, gdy aplikacja potrzebuje wymaganych kodów, są konwertowane tylko na kod maszynowy.
Porównanie JIT vs Non-JIT:
W JIT nie cały kod jest konwertowany na kod maszynowy, najpierw niezbędna część kodu zostanie przekonwertowana na kod maszynowy, a następnie jeśli wywoływana metoda lub funkcja nie znajduje się w maszynie, zostanie to zamienione na kod maszynowy ... zmniejsza się obciążenie procesora.
Ponieważ kod maszynowy będzie generowany w czasie wykonywania .... kompilator JIT wygeneruje kod maszynowy zoptymalizowany pod kątem uruchamiania architektury procesora maszyny.
Przykłady JIT:
źródło
Jak wspomnieli inni
JIT oznacza Just-in-Time, co oznacza, że kod jest kompilowany, gdy jest potrzebny, a nie przed uruchomieniem.
Aby dodać punkt do powyższej dyskusji, JVM przechowuje informacje o tym, ile razy funkcja jest wykonywana. Jeśli liczba ta przekroczy predefiniowany limit, JIT kompiluje kod do języka maszynowego, który może być bezpośrednio wykonany przez procesor (w przeciwieństwie do zwykłego przypadku, w którym javac kompiluje kod do kodu bajtowego, a następnie java - interpreter interpretuje ten kod bajtowy linia po linii konwertuje go na kod maszynowy i wykonuje).
Również przy następnym obliczeniu tej funkcji ponownie zostanie wykonany ten sam skompilowany kod, w przeciwieństwie do normalnej interpretacji, w której kod jest interpretowany ponownie wiersz po wierszu. Dzięki temu wykonanie jest szybsze.
źródło
Kompilator JIT kompiluje tylko bajt-kod do równoważnego kodu macierzystego przy pierwszym uruchomieniu. Przy każdym kolejnym wykonaniu JVM wykorzystuje jedynie skompilowany już kod macierzysty w celu optymalizacji wydajności.
Bez kompilatora JIT interpreter JVM tłumaczy kod bajt wiersz po wierszu, aby wyglądał tak, jakby wykonywana była aplikacja natywna.
Źródło
źródło
JIT oznacza Just-in-Time, co oznacza, że kod jest kompilowany, gdy jest potrzebny, a nie przed uruchomieniem.
Jest to korzystne, ponieważ kompilator może generować kod zoptymalizowany dla konkretnego komputera. Kompilator statyczny, podobnie jak przeciętny kompilator C, skompiluje cały kod do kodu wykonywalnego na komputerze programisty. Dlatego kompilator wykona optymalizacje w oparciu o pewne założenia. Może kompilować się wolniej i wykonywać więcej optymalizacji, ponieważ nie spowalnia wykonywania programu przez użytkownika.
źródło
Po wygenerowaniu kodu bajtowego (który jest neutralny dla architektury) przez kompilator Java, wykonanie będzie obsługiwane przez JVM (w Javie). Kod bajtu zostanie załadowany do JVM przez moduł ładujący, a następnie każda instrukcja bajtu zostanie zinterpretowana.
Kiedy musimy wywoływać metodę wiele razy, musimy interpretować ten sam kod wiele razy, co może zająć więcej czasu, niż jest to konieczne. Mamy więc kompilatory JIT (just-in-time). Po załadowaniu bajtu do JVM (czas jego działania) cały kod zostanie skompilowany, a nie zinterpretowany, co pozwoli zaoszczędzić czas.
Kompilatory JIT działają tylko w czasie wykonywania, więc nie mamy żadnych danych binarnych.
źródło
Just In Time Compiler (JIT):
Kompiluje bytecodes java do instrukcji maszynowych tego konkretnego procesora.
Na przykład, jeśli w naszym kodzie Java jest instrukcja pętli:
Powyższy kod pętli działa 10 razy, jeśli wartość i wynosi 0.
Nie jest konieczne wielokrotne kompilowanie kodu bajtowego 10 razy, ponieważ ta sama instrukcja będzie wykonywana 10 razy. W takim przypadku konieczne jest skompilowanie tego kodu tylko raz, a wartość można zmienić wymaganą liczbę razy. Tak więc kompilator Just In Time (JIT) śledzi takie instrukcje i metody (jak wspomniano powyżej) i kompiluje takie fragmenty kodu bajtowego w kodzie maszynowym, aby uzyskać lepszą wydajność.
Innym podobnym przykładem jest wyszukiwanie wzorca za pomocą „Wyrażenia regularnego” na liście ciągów / zdań.
Kompilator JIT nie kompiluje całego kodu do kodu maszynowego. Kompiluje kod, który ma podobny wzorzec w czasie wykonywania.
Przeczytaj dokumentację Oracle na temat Zrozumienia JIT, aby przeczytać więcej.
źródło
Masz kod, który jest skompilowany do jakiegoś IL (języka pośredniego). Po uruchomieniu programu komputer nie rozumie tego kodu. Rozumie tylko natywny kod. Tak więc kompilator JIT kompiluje Twoją IL w natywnym kodzie w locie. Robi to na poziomie metody.
źródło
Wiem, że to stary wątek, ale optymalizacja środowiska wykonawczego to kolejna ważna część kompilacji JIT, która nie wydaje się tutaj omawiana. Zasadniczo kompilator JIT może monitorować uruchamiany program, aby określić sposoby poprawy wykonania. Następnie może wprowadzać te zmiany w locie - podczas działania. Optymalizacja Google JIT (javaworld ma na ten temat całkiem niezły artykuł ).
źródło
Kompilator „just in time” (JIT) to oprogramowanie, które pobiera nieobsługiwane dane wejściowe i zwraca odpowiedni kod maszynowy do wykonania. Na przykład:
Konsekwencją tego jest to, że dla określonej architektury CPU musi być zainstalowany odpowiedni kompilator JIT.
Kompilator różnic, interpreter i JIT
Chociaż mogą istnieć wyjątki, gdy chcemy przekształcić kod źródłowy w kod maszynowy, możemy użyć:
źródło
Jit to skrót od jit kompilatora to program, który zamienia kod bajtu java w instrukcję, która może być wysłana bezpośrednio do procesora.
Korzystanie z kompilatora java just in time (tak naprawdę drugiego kompilatora) na konkretnej platformie systemowej jest zgodne z kodem bajtowym w określonym kodzie systemowym, gdy kod zostanie ponownie skompilowany przez kompilator jit, zwykle będzie działał szybciej na komputerze.
Kompilator just-in-time jest dostarczany z maszyną wirtualną i jest używany opcjonalnie. Kompiluje kod bajtowy w specyficzny dla platformy kod wykonywalny, który jest natychmiast wykonywany.
źródło
Kompilacja just-in-time (JIT) (także tłumaczenie dynamiczne lub kompilacja w czasie wykonywania) to sposób wykonywania kodu komputerowego, który obejmuje kompilację podczas wykonywania programu - w czasie wykonywania - a nie przed jego wykonaniem .
Kompilacja IT to połączenie dwóch tradycyjnych podejść do tłumaczenia na kod maszynowy - kompilacja z wyprzedzeniem (AOT) i interpretacja - i łączy w sobie zalety i wady obu tych metod. Kompilacja JIT łączy szybkość skompilowanego kodu z elastycznością interpretacji .
Rozważmy JIT używany w JVM,
Na przykład kompilatory HotSpot JVM JIT generują dynamiczne optymalizacje. Innymi słowy, podejmują decyzje optymalizacyjne podczas działania aplikacji Java i generują wysokowydajne instrukcje natywnej maszyny skierowane do podstawowej architektury systemu.
Po wybraniu metody do kompilacji JVM podaje swój kod bajtowy do kompilatora Just-In-Time (JIT). JIT musi zrozumieć semantykę i składnię kodu bajtowego, zanim będzie mógł poprawnie skompilować metodę. Aby pomóc kompilatorowi JIT w analizie metody, jego kod bajtowy jest najpierw przeformułowany w wewnętrznej reprezentacji zwanej drzewkami śledzenia, która bardziej przypomina kod maszynowy niż kod bajtowy. Następnie przeprowadza się analizy i optymalizacje drzew tej metody. Na koniec drzewa są tłumaczone na kod macierzysty.
Patrz:
źródło
Kompilator inny niż JIT pobiera kod źródłowy i przekształca go w specyficzny dla maszyny kod bajtowy w czasie kompilacji. Kompilator JIT pobiera kod bajtowy agnostyczny wygenerowany w czasie kompilacji i przekształca go w kod bajtowy specyficzny dla maszyny w czasie wykonywania. Kompilator JIT, z którego korzysta Java, pozwala na uruchomienie jednego pliku binarnego na wielu platformach bez modyfikacji.
źródło
20% kodu bajtowego jest używane przez 80% czasu. Kompilator JIT pobiera te statystyki i optymalizuje ten 20% kodu bajtów, aby działał szybciej, dodając metody wbudowane, usuwając nieużywane blokady itp., A także tworząc kod bajtowy specyficzny dla tego komputera. Cytuję ten artykuł, który okazał się przydatny. http://java.dzone.com/articles/just-time-compiler-jit-hotspot
źródło
JIT odnosi się do silnika wykonawczego w kilku implementacjach JVM, który jest szybszy, ale wymaga więcej pamięci, jest kompilatorem just-in-time. W tym schemacie kody bajtów metody są kompilowane do natywnego kodu maszynowego przy pierwszym wywołaniu metody. Natywny kod maszynowy dla tej metody jest następnie buforowany, dzięki czemu można go ponownie użyć przy następnym wywołaniu tej samej metody.
źródło
JVM faktycznie wykonuje kroki kompilacji w czasie wykonywania ze względu na wydajność. Oznacza to, że Java nie ma czystej separacji wykonywania i kompilacji. Najpierw wykonuje tak zwaną kompilację statyczną od kodu źródłowego Java do kodu bajtowego. Następnie ten kod bajtowy jest przekazywany do maszyny JVM w celu wykonania. Ale wykonywanie kodu bajtowego jest powolne, więc JVM mierzy, jak często jest uruchamiany kod bajtowy, a gdy wykryje „gorący punkt” kodu, który jest uruchamiany bardzo często, wykonuje dynamiczną kompilację od kodu bajtowego do kodu maszynowego kodu „hotspot” (profiler punktu aktywnego). Tak skutecznie dzisiaj programy Java są uruchamiane przez wykonanie kodu maszynowego.
źródło
Kompilator Just In Time znany również jako kompilator JIT służy do poprawy wydajności w Javie. Jest domyślnie włączony. Jest to kompilacja wykonywana w czasie wykonywania raczej wcześniej. Java spopularyzowała użycie kompilatora JIT, włączając go do JVM.
źródło