Co robi kompilator just-In-time (JIT)?

Co konkretnie robi kompilator JIT w przeciwieństwie do kompilatora nie-JIT? Czy ktoś może podać zwięzły i łatwy do zrozumienia opis?

Author: Md. Abu Nafee Ibna Zahid, 2008-09-18

18 answers

Kompilator JIT uruchamia po uruchomieniu program i kompiluje kod (Zwykle bajt lub instrukcje maszyny Wirtualnej) w locie (lub just-In-time, jak to się nazywa) do postaci, która jest zwykle szybsza, zazwyczaj natywny zestaw instrukcji CPU hosta. JIT ma dostęp do dynamicznych informacji o uruchomieniu, podczas gdy standardowy kompilator nie ma i może dokonać lepszych optymalizacji, takich jak funkcje inlining, które są często używane.

Jest to w przeciwieństwie do tradycyjnego kompilatora, który kompiluje wszystkieKod do języka maszynowego Przed program zostanie uruchomiony jako pierwszy.

Parafrazując, konwencjonalne Kompilatory budują cały program jako plik EXE przed pierwszym uruchomieniem. W przypadku nowszych programów stylowych, assembly jest generowany z pseudokodem (P-code). Dopiero po uruchomieniu programu na systemie operacyjnym (np. poprzez dwukrotne kliknięcie jego ikony) kompilator (JIT) zacznie generować kod maszynowy (m-code), który procesor oparty na Intelu lub cokolwiek innego będzie Rozumiem.

 441
Author: Mark Cidade,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-06 16:13:58

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 byłby połączony (przez linker) w plik wykonywalny.

W pewnym momencie ewolucji języków, Kompilatory skompilowałyby język wysokiego poziomu do pseudo-kodu, który następnie byłby interpretowany (przez interpreter) w celu uruchomienia programu. Wyeliminowało to kod obiektowy i pliki wykonywalne oraz umożliwiło stosowanie tych języków być przenośne na wiele systemów operacyjnych i platform sprzętowych. Pascal (skompilowany do kodu P) był jednym z pierwszych; Java i C# są nowszymi przykładami. Ostatecznie termin P-Kod został zastąpiony kodem bajtowym, ponieważ większość pseudoperacji ma długość bajtu.

Kompilator Just-In-Time (JIT) jest cechą interpretera run-time, który zamiast interpretowania kodu bajtowego za każdym razem, gdy wywołana jest metoda, kompiluje kod bajtowy do instrukcji kodu maszynowego uruchamia maszynę, a następnie wywołuje ten kod obiektowy. Idealnie sprawność działania kodu obiektowego przezwycięży nieefektywność rekompilacji programu za każdym razem, gdy jest uruchamiany.

 230
Author: Craig Trader,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 19:06:10

JIT-Just In time 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 skonwertowany na strukturę podobną do języka asemblera [dla ex IL (intermediate language) dla C#, Bajt dla Javy].

Kod pośredni jest konwertowany na język maszynowy tylko wtedy, gdy aplikacja potrzebuje, które wymagane kody są konwertowane tylko na język maszynowy kod.

Porównanie JIT vs Non-JIT:

  • W JIT nie cały kod jest konwertowany do kodu maszynowego najpierw część kodu, który jest niezbędny zostanie przekonwertowany na kod maszynowy wtedy jeśli wywołana metoda lub funkcja nie znajduje się w maszynie, to zostanie przekształcony w kod maszynowy... zmniejsza obciążenie procesora.

  • Ponieważ kod maszynowy zostanie wygenerowany w czasie wykonywania....JIT kompilator stworzy kod maszynowy zoptymalizowany pod kątem działania procesor maszyny Architektura.

Przykłady JIT:

    W Javie JIT jest w JVM (Java Virtual Machine) W C# jest to CLR (Common Language Runtime) [15]}W Androidzie jest w DVM (Dalvik Virtual Machine) lub ART (Android RunTime) w nowszych wersjach.
 60
Author: Durai Amuthan.H,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-11 08:39:38

Jak inni wspomnieli

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 utrzymuje licznik od ilości czasu wykonania funkcji. JeĹ "li liczba ta przekroczy predefiniowany limit, JIT kompiluje kod do jÄ ™ zyka maszynowego, ktĂłry moĹźe byÄ ‡ bezpoĹ" rednio wykonywany przez procesor (w przeciwieĺ " stwie do normalnego przypadku, w ktĂłrym javac kompiluje kod do bajtăłw, a nastÄ ™ pnie java - interpreter interpretuje ten bajtowy kod linia po linii konwertuje go na kod maszynowy i wykonuje).

Również następnym razem, gdy ta funkcja jest obliczana, ten sam skompilowany kod jest wykonywany ponownie, w przeciwieństwie do normalnej interpretacji, w której kod jest interpretowany ponownie linia po linii. To sprawia, że egzekucja jest szybsza.

 23
Author: Aniket Thakur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-10 13:20:45

JIT oznacza Just-In-Time, co oznacza, że kod jest kompilowany, gdy jest potrzebny, nie przed uruchomieniem.

Jest to korzystne, ponieważ kompilator może wygenerować kod, który jest zoptymalizowany dla konkretnej maszyny. Statyczny kompilator, podobnie jak przeciętny kompilator C, skompiluje cały kod do kodu wykonywalnego na maszynie dewelopera. Stąd kompilator będzie wykonywał optymalizacje w oparciu o pewne założenia. Może kompilować się wolniej i robić więcej optymalizacji, ponieważ nie jest spowolnienie wykonania programu dla użytkownika.

 9
Author: Brian Lyttle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 19:00:45

Po wygenerowaniu kodu bajtowego (który jest neutralny dla architektury) przez kompilator Javy, wykonanie będzie obsługiwane przez JVM (w Javie). Kod bajtowy zostanie załadowany do JVM przez program ładujący, a następnie każda instrukcja bajtowa zostanie zinterpretowana.

Kiedy musimy wywołać metodę wiele razy, musimy zinterpretować ten sam kod wiele razy i może to zająć więcej czasu niż jest to potrzebne. Mamy więc Kompilatory JIT (just-In-time). Gdy bajt został załadowany do JVM (jego przebieg czas), Cały kod zostanie skompilowany, a nie zinterpretowany, co pozwoli zaoszczędzić czas.

Kompilatory JIT dziaĹ 'ajÄ ... tylko w czasie uruchamiania, wiÄ ™ c nie mamy wyjĹ" cia binarnego.

 9
Author: User,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-30 13:49:18

Kompilator JIT kompiluje tylko kod bajtowy do równoważnego kodu natywnego przy pierwszym uruchomieniu. Przy każdym kolejnym wykonaniu JVM używa jedynie skompilowanego kodu natywnego w celu optymalizacji wydajności.

Tutaj wpisz opis obrazka

Bez kompilatora JIT, interpreter JVM tłumaczy kod bajtowy linia po linii, aby wyglądało to tak, jakby uruchamiana była natywna aplikacja.

Tutaj wpisz opis obrazka

Źródło

 7
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-19 04:45:01

Just In Time Compiler (JIT) :
Kompiluje bajtekody Javy do instrukcji maszynowych tego konkretnego procesora.

Na przykład, jeśli mamy instrukcję loop w naszym kodzie Javy:

while(i<10){
    // ...
    a=a+i;
    // ...
 }

Powyższy kod pętli działa 10 razy, jeśli wartość i wynosi 0.

Nie jest konieczne kompilowanie kodu bajtowego 10 razy, ponieważ ta sama instrukcja będzie wykonywana 10 razy. W takim przypadku konieczne jest skompilowanie tego kodu tylko raz i wartość może być zmieniana przez 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 do kodu maszynowego dla lepszej wydajności.

Innym podobnym przykładem jest wyszukiwanie wzorca za pomocą "wyrażenia regularnego" na liście łańcuchów/zdań.

Kompilator JIT nie kompiluje całego kodu do kodu maszynowego. Kompiluje kod, który ma podobny wzór przy uruchomieniu czas.

Więcej informacji można znaleźć w dokumentacji Oracle Understand JIT .
 6
Author: Anands23,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-30 13:52:47

Masz kod, który jest complied do jakiegoś IL (intermediate language). Podczas uruchamiania programu komputer nie rozumie tego kodu. Rozumie tylko rodzimy kod. Tak więc kompilator JIT kompiluje Twój IL do kodu natywnego w locie. Robi to na poziomie metody.

 4
Author: Charles Graham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 18:56:06

Wiem, że to stary wątek, ale optymalizacja runtime jest kolejną ważną częścią kompilacji JIT, która nie wydaje się być tutaj omawiana. Zasadniczo kompilator JIT może monitorować działanie programu w celu określenia sposobów poprawy jego wykonania. Następnie może wprowadzać te zmiany w locie-podczas wykonywania. Google JIT optimization (javaworld ma ładny Dobry artykuł na ten temat.)

 4
Author: eze,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-21 13:36:55

JIT oznacza kompilator just In time jit to program, który zamienia kod bajtowy Javy w instrukcję, która może być wysłana bezpośrednio do procesora.

Użycie kompilatora Java just In time (tak naprawdę drugiego kompilatora) na konkretnej platformie systemowej powoduje, że kod bajtowy jest zgodny z konkretnym kodem systemowym, gdy kod zostanie ponownie skompilowany przez kompilator jit, zwykle będzie działał szybciej na komputerze.

Kompilator just-In-time jest dostarczany wraz z maszyną wirtualną i jest używany opcjonalnie. Kompiluje kod bajtowy do specyficznego dla platformy kodu wykonywalnego, który jest natychmiast wykonywany.

 2
Author: user3459027,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-16 06:41:06

Kompilator nie-JIT pobiera kod źródłowy i przekształca go w specyficzny dla maszyny kod bajtowy podczas kompilacji. Kompilator JIT pobiera kod bajtowy maszyny, który został wygenerowany w czasie kompilacji i przekształca go w specyficzny dla maszyny kod bajtowy w czasie wykonywania. Kompilator JIT, którego używa Java, pozwala na uruchomienie pojedynczego pliku binarnego na wielu platformach bez modyfikacji.

 1
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 19:08:48

Poniższe przykłady kodu pokazują jak JIT optymalizuje Kod Javy.

Kod Przed Optymalizacją

    class A {
      B b;
      public void newMethod() {
        y = b.get();
        ...do stuff...
        z = b.get();
        sum = y + z;
      }
    }

class B {
   int value;
   final int get() {
      return value;
   }
}

Kod Po Optymalizacji

class A {
B b;
public void newMethod() {
   y = b.value;
   ...do stuff...
   sum = y + y;
}
}
class B {
   int value;
   final int get() {
      return value;
   }
}

Pierwotnie kod zawierał dwa wywołania metody B. get (). Po optymalizacji, dwa wywołania metody są zoptymalizowane do jednej operacji kopiowania zmiennych; to znaczy, zoptymalizowany kod nie musi wykonywać wywołania metody, aby uzyskać wartość pola klasy B.

 1
Author: Girdhar Singh Rathore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-25 06:19:25

Just-In-time (JIT) compilation, (również dynamiczne tłumaczenie lub Kompilacja w czasie wykonywania), jest sposobem wykonywania kodu komputerowego , Który obejmuje kompilację podczas wykonywania programu – w czasie wykonywania - , a nie przed wykonaniem.

Kompilacja jest połączeniem dwóch tradycyjnych metod tłumaczenia na kod maszynowy- ahead-of-time compilation (AOT) i interpretation - i łączy w sobie pewne zalety i wady obu. JIT compilation łączy szybkość skompilowanego kodu z elastycznością interpretacji.

Rozważmy JIT używany w JVM,

Na przykład Kompilatory JIT HotSpot JVM generują dynamiczne optymalizacje. Innymi słowy, podejmują decyzje optymalizacyjne podczas działania aplikacji Java i generują wydajne natywne instrukcje maszynowe przeznaczone dla podstawowej architektury systemu.

Gdy metoda jest wybrana do kompilacji, JVM przekazuje 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 ułatwić kompilatorowi JIT analizę metody, jej kod bajtowy jest najpierw przeformułowany w wewnętrzną reprezentację zwaną Trace trees, która bardziej przypomina kod maszynowy niż bajt. Analiza i optymalizacja są następnie wykonywane na drzewach metody. Na końcu drzewa są tłumaczone na rodzime kod.

Drzewo śledzenia jest strukturą danych, która jest używana w runtime kompilacji kodu programowania. Drzewa śledzenia są używane w typie "just In time compiler", który śledzi kod wykonywany podczas hotspotów i kompiluje go. Zobacz to .

Zobacz:

 1
Author: prime,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-06 09:44:52

20% kodu bajtowego jest używane przez 80% czasu. Kompilator JIT pobiera te statystyki i optymalizuje te 20% kodu bajtowego, aby działać szybciej poprzez dodawanie metod inline, usuwanie nieużywanych blokad itp., a także tworzenie kodu bajtowego specyficznego dla tej maszyny. Cytuję z tego artykułu, okazało się, że był przydatny. http://java.dzone.com/articles/just-time-compiler-jit-hotspot

 0
Author: Santosh budhe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-06 10:12:11

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, bajtowe kody metody są kompilowane do natywnego kodu maszynowego przy pierwszym wywołaniu metody. Natywny kod maszynowy metody jest następnie buforowany, więc może być ponownie użyty przy następnym wywołaniu tej samej metody.

 0
Author: Venkata Santhosh Piduri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-03 13:08:12

JVM faktycznie wykonuje kroki kompilacji podczas wykonywania ze względu na wydajność. Oznacza to, że Java nie ma czystego oddzielenia od wykonania kompilacji. Najpierw wykonuje tzw. statyczną kompilację z kodu źródłowego Javy do kodu bajtowego. Następnie ten bajt jest przekazywany do JVM w celu wykonania. Ale wykonywanie kodu bajtowego jest powolne, więc JVM mierzy, jak często jest on uruchamiany, A gdy wykryje" hotspot " kodu, który jest uruchamiany bardzo często, wykonuje dynamiczną kompilację z kodu bajtowego do kod maszynowy kodu "hotspot" (hotspot profiler). Tak efektywnie obecnie programy Java są uruchamiane przez machinecode execution.

 0
Author: hi.nitish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-03 19:08:32

Kompilator just In time (JIT) jest oprogramowaniem, które pobiera Nie wykonywalne dane wejściowe i zwraca odpowiedni kod maszynowy do wykonania. Na przykład:

Intermediate representation    JIT    Native machine code for the current CPU architecture

     Java bytecode            --->        machine code
     Javascript (run with V8) --->        machine code

Konsekwencją tego jest to, że dla pewnej architektury procesora musi być zainstalowany odpowiedni kompilator JIT.

Kompilator różnic, interpreter i JIT

Chociaż ogólnie mogą być wyjątki, gdy chcemy przekształcić kod źródłowy w kod maszynowy, możemy użycie:

  1. kompilator: pobiera kod źródłowy i zwraca plik wykonywalny
  2. Interpreter : wykonuje instrukcję programu po instrukcji. Pobiera wykonywalny segment kodu źródłowego i zamienia ten segment w instrukcje maszynowe. Proces ten jest powtarzany, dopóki cały kod źródłowy nie zostanie przekształcony w instrukcje maszynowe i wykonany.
  3. JIT: wiele różnych implementacji JIT są możliwe, jednak JIT jest zwykle połączenie komplementariusza i tłumacza. JIT najpierw przekształca dane pośrednie (np. kod bajtowy Javy), które otrzymuje do języka maszynowego poprzez interpretację. JIT może często wyczuć, kiedy pewna część kodu jest wykonywana często i skompiluje tę część w celu szybszego wykonania.
 0
Author: Willem van der Veen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-26 17:15:11