Какво прави JIT компилаторът?

Току-що гледах видеоклиповете на Google IO и те говореха за JIT компилатора, който са включили в android. Те показаха демонстрация на подобрения в производителността благодарение на JIT компилатора. Чудех се какво точно прави един JIT компилатор и исках да чуя от различни хора.

И така, какво е задължението на JIT компилатора?


person mehmet6parmak    schedule 25.05.2010    source източник
comment
възможен дубликат на Какво прави точно навреме (JIT) компилатор?   -  person msanford    schedule 20.08.2013


Отговори (9)


Java кодът обикновено се разпространява като байт код, който е машинно независим псевдокод. (Същата идея беше използвана преди в UCSD-p система, разработена през 70-те години.) Предимството на това е, че едно и също приложение може да се изпълнява в различни процесори и операционни системи. В допълнение, байт кодът често е по-малък от компилираното приложение.

Недостатъкът е, че интерпретирането на кода е бавно в сравнение с изпълнението на компилиран код. За решаването на този проблем е разработен JIT компилатор. JIT компилаторът компилира кода в машинен код точно преди кодът да бъде изпълнен. Това ускорява изпълнението в сравнение с интерпретатора, но се отделя допълнително време за компилиране всеки път, когато програмата се изпълнява. В допълнение, тъй като JIT компилаторът трябва да компилира бързо, той не може да използва сложни техники за оптимизация, които се използват в статичните компилатори.

Друг подход е HotSpot компилирането. Първоначално работи като интерпретатор, но след това открива кои процедури се използват най-често и компилира само тях. Предимството е, че няма първоначално забавяне поради компилирането. Освен това компилаторът на HotSpot може да направи профилиране по време на изпълнението и след това да издаде по-силна оптимизация за най-важните рутинни процедури. Може дори да събира информация, така че когато стартирате едно и също приложение отново и отново, то да работи все по-бързо и по-бързо. Повече информация за HotSpot компилирането може да бъде намерена от тази статия (tnx Pangea за линка).

Разбира се, вместо да използвате JIT компилатор, можете просто да използвате статичен компилатор, за да компилирате байт кода за вашата машина. Това позволява пълна оптимизация и след това не е необходимо да компилирате отново всеки път, когато стартирате приложението. В телефони и уеб страници обаче често просто изпълнявате кода (или аплета) веднъж, така че JIT компилаторът може да е по-добър избор.

Актуализация

Файловете с байт код на Python имат разширение .py. Когато изпълните файла с байт код, компилаторът JIT на Python създава компилиран файл .pyc. Следващият път, когато стартирате същата програма, ако .py файлът не се е променил, няма нужда да го компилира отново, но вместо това Python изпълнява предишния компилиран .pyc файл. Това ускорява стартирането на програмата.

person PauliL    schedule 25.05.2010
comment
@PauliL: ако JIT преобразува байт код в машинно разбираем формат, тогава как платформата на байт кода е независима? - person Sharda Prasad Jaiswal; 25.04.2016
comment
@ShardaPrasadJaiswal: Байткодът е независим от платформата. JOT компилаторът го компилира в собствения код на вашия компютър, когато стартирате програмата. - person PauliL; 27.01.2018

JIT е съкращение от „точно навреме“. Компилаторът JIT компилира код, който често е на междинен език като Java bytecode или Microsoft IL, в собствен, изпълним код и прави това в момента, в който кодът се извиква. Така че докато кодът не бъде извикан, той съществува само в преносим, ​​неспецифичен за машината байт код или IL, а след това, когато бъде извикан, се генерира собствен код (който след това се използва повторно при следващи извиквания).

person David M    schedule 25.05.2010

Това е компилатор точно навреме, по средата между интерпретатор и компилатор (т.е. той компилира, но само малко преди кодът да бъде изпълнен).

Това позволява оптимизации на компилацията, използвайки динамична информация, известна само по време на изпълнение (тъй като компилаторите обикновено работят статично и така имат достъп само до информация по време на компилация). Те са много по-трудни за писане, но могат да дадат големи подобрения в производителността.

За повече информация, както винаги, вижте Уикипедия:

В компютрите компилацията точно навреме (JIT), известна също като динамичен превод, е техника за подобряване на производителността по време на изпълнение на компютърна програма. Традиционно компютърните програми имат два режима на работа по време на изпълнение, или интерпретирана, или статична (предварителна) компилация. Интерпретираният код се превежда от език на високо ниво в машинен код непрекъснато по време на всяко изпълнение, докато статичната компилация превежда кода в машинен код преди изпълнението и изисква този превод само веднъж.

JIT компилаторите представляват хибриден подход, като преводът се извършва непрекъснато, както при интерпретаторите, но с кеширане на преведения код, за да се минимизира влошаването на производителността. Той също така предлага други предимства пред статично компилиран код по време на разработка, като обработка на късно обвързани типове данни и възможност за налагане на гаранции за сигурност.

person Skilldrick    schedule 25.05.2010

JIT = Точно навреме. Това е процес, при който програма, която иначе би била интерпретирана (напр. Java байт кодове или Javascript код), се преобразува в собствен машинен код в движение, докато работи, за да подобри производителността.

Някои от предимствата са, че JIT компилаторът може да вижда горещите точки и да прилага по-агресивни оптимизации, той също може да се възползва от всички разширения, които текущият процесор има като SSE2.

Този въпрос може да съдържа повече информация: Как JIT компилаторът помага за производителността на приложенията?

person Paolo    schedule 25.05.2010

И така, какво е задължението на JIT компилатора?

Както други споменаха, това е съкращение от "Just In Time", което в този смисъл означава "Точно навреме за изпълнение".

Когато компилирате програми в машинен код, те често са насочени към определена платформа.

Следователно JIT е „изобретен“, вие искате да компилирате последните битове и части от вашия код за изпълняваната платформа, така че гледайте на това като на компилатор/оптимизатор „преди изпълнение“.

JIT улеснява живота ни и прави (надяваме се) нашите приложения да работят по-бързо.

Разбира се, има и други цели на JIT-компилацията, горното е само едно от тях.

person Filip Ekberg    schedule 25.05.2010

Доста хубаво обяснение:

„На практика методите не се компилират при първото им извикване. За всеки метод JVM поддържа брой извиквания, който се увеличава при всяко извикване на метода. JVM интерпретира метод, докато броят му на извиквания надвиши Праг на JIT компилация. Следователно често използваните методи се компилират скоро след стартирането на JVM, а по-рядко използваните методи се компилират много по-късно или изобщо не. Прагът на JIT компилация помага на JVM да стартира бързо и все още има подобрена производителност.Прагът е внимателно подбран, за да се получи оптимален баланс между времената за стартиране и дългосрочната производителност.

След като методът бъде компилиран, неговият брой извиквания се нулира до нула и следващите извиквания към метода продължават да увеличават неговия брой. Когато броят на извикванията на метод достигне праг за повторно компилиране на JIT, JIT компилаторът го компилира втори път, като прилага по-голям избор от оптимизации, отколкото при предишната компилация. Този процес се повтаря, докато се достигне максимално ниво на оптимизация. Най-натоварените методи на Java програма винаги се оптимизират най-агресивно, увеличавайки максимално предимствата на производителността от използването на JIT компилатора. JIT компилаторът може също да измерва оперативни данни по време на изпълнение и да използва тези данни за подобряване на качеството на по-нататъшни рекомпилации.

Компилаторът JIT може да бъде деактивиран, в който случай цялата програма на Java ще бъде интерпретирана. Деактивирането на JIT компилатора не се препоръчва, освен за диагностициране или заобикаляне на проблеми с JIT компилация."

Източник: https://www-01.ibm.com/support/knowledgecenter/SSYKE2_7.0.0/com.ibm.java.aix.71.doc/diag/understanding/jit_overview.html

person Antea    schedule 02.07.2015

JIT компилаторът обикновено е последната част от тръбопровода на VM и генерира машинен код от междинния език на VM.

Той подобрява скоростта чрез оптимизиране на генерирания код за средата, в която работи (специфични инструкции за процесора, размер на кеша,...).

Традиционните компилатори също оптимизират генерирания машинен код, но те трябва да го направят, без да са наясно с конкретните ресурси, които ще бъдат налични по време на изпълнение.

person Ovidiu Pacurar    schedule 25.05.2010

Компилаторът Just-In-Time (JIT) е компонент на Java™ Runtime Environment, който подобрява производителността на Java приложенията по време на изпълнение.

Обърнете се към документацията на IBM тук.

Преводачът основно прави това:

  1. Прочетете следващия байт код, който трябва да бъде изпълнен
  2. Погледнете какъв е байт кодът и намерете оригиналните машинни инструкции, които съответстват на него
  3. Изпълнение на родните машинни инструкции(и)
  4. Отидете на стъпка 1

Това е просто, работи добре и ще стартира вашата Java програма. Но също така е неефективно, тъй като търсенето на оригиналната инструкция(и) за всеки отделен байткод, който трябва да бъде изпълнен, струва време за обработка. Така че JVM съдържа втори механизъм, компилатор Just-In-Time, който основно прави това:

  1. Прочетете всички байт кодове за метода, който трябва да бъде изпълнен
  2. Преобразувайте всички тези байт кодове в собствени машинни инструкции
  3. Изпълнете генерираните нативни машинни инструкции

След като е преобразувал байткодовете за даден метод в нативни машинни инструкции, JVM запомня този нативен код, така че следващия път, когато методът трябва да се изпълни, може просто да изпълни нативните инструкции - не е необходимо да преобразува байткодовете всеки път, когато методът се изпълнява. Това кара програмата да работи много по-бързо.

Освен това JIT извършва много оптимизации, за да генерира естествен код, който работи възможно най-бързо.

person Aniket Thakur    schedule 05.08.2013
comment
Този въпрос вече имаше редица достойни отговори; не знам защо има нужда от копиране и поставяне на съществуващо съдържание. - person Andrew Barber; 06.08.2013
comment
@AndrewBarber Спрях се на този въпрос и не намерих къде ясно да се споменава, че JIT е вид алтернатива на интерпретатора. Само след като направих още малко проучване, получих ясна представа за това. Публикувах само, за да може да помогне на другите. Специално документацията на IBM е много полезна. - person Aniket Thakur; 06.08.2013
comment
Два от първите три отговора бяха доста ясни относно сравнението с устните преводачи. - person Andrew Barber; 06.08.2013
comment
@AniketThakur подкрепи.^ - person Aniket Kapse; 13.02.2015

Съмнявам се, сър, ако javac е Java компилатор, неговата роля е да преобразува изходния код в байтов код, означава .Class и след това .class (байтов код) се интерпретира от Java интерпретатор (Java) означава от JVM и JIT е част от JVM, тогава какво е действителната му работа

person Amit Kumar Jha    schedule 26.08.2016