Just-in-time compilation (JIT) (також відома як dynamic translation або run-time compilation) — компіляція «на льоту» — це технологія збільшення продуктивності програмних систем, що виконують програмний код, шляхом трансляції байт-коду в машинний код безпосередньо під час роботи програми. У такий спосіб досягається висока швидкість виконання за рахунок збільшення споживання пам'яті (для зберігання результатів компіляції) і витрат часу на компіляцію.
JIT компіляція є комбінацією двох основних методів трансляції в машинний код, інтерпретації та статичної компіляції, та наслідує якості обох підходів: переваги швидкості скомпільованого коду та гнучкості інтерпретатора поєднані з накладними витратами інтерпретації та компіляції коду. JIT-компіляція є підвидом динамічної компіляції що дозволяє використання технік адаптивної оптимізації, таких як динамічна рекомпіляція, використання інтерпретатором мікроархітектурних оптимізацій. JIT-компіляція підходить для динамічних мов програмування, оскільки системи компіляції реального часу можуть сконструювати типи даних та гарантувати безпеку.
Застосування
Цей розділ не містить . (жовтень 2020) |
JIT-компіляція може бути використана у окремих програмах, або для реалізації певного динамічного функціоналу, такого як регулярні вирази. Для прикладу, редактор може скомпілювати регулярний вираз, який був введений під час роботи програми, у швидкий машинний код — цю компіляцію неможливо провести завчасно, оскільки шаблон регулярного виразу вводиться під час виконання. Деякі сучасні покладаються на JIT-компіляцію для підвищення швидкості роботи коду. Прикладами таких середовищ є більшість імплементацій Java та .NET Framework. Схожим чином, багато бібліотек використовують JIT-компіляцію для трансляції регулярних виразів у необхідний байт- або машинний код. JIT компіляція також використовується в деяких емуляторах, з метою трансляції машинного коду процесорів однієї архітектури до машинного коду процесора іншої архітектури.
Звичний JIT-компілятор виконує статичну компіляцію перед виконанням, отримуючи байткод (код віртуальної машини), відомий також як байткод компіляція, а після — виконує компіляцію в машинний код (динамічна компіляція, або JIT-компіляція), замість простого процесу інтерпретації байткоду в машинний код. Це дозволяє покращити швидкість виконання коду (порівняно з інтерпретацією), ціною втрати часу на компіляцію. Трансляція коду JIT-компілятором, так само як і інтерпретатором, є безперервним процесом, проте кешування скомпільованого коду зменшує затримку подальшого виконання повторно використаного коду. Оскільки в цьому випадку компілюється тільки частина програми, затримка на компіляцію перед виконанням є меншою, ніж час компіляції всієї програми.
Історія розвитку JIT-компіляції, її основних підходів
Найпершим опублікованим JIT-компілятором вважається робота Джона Маккарті над LISP у 1960. В його статті «Recursive functions of symbolic expressions and their computation by machine, Part I» (англ. Рекурсивні функції символічних виразів та їхнє обчислення машинами, Частина 1), він згадує функції, що транслюються під час роботи програми, уникаючи необхідності збереження вихідного коду компілятора на перфокартах. (кращим терміном для описаної системи буде «Система компіляції та запуску» (англ. compile and go system). Іншим раннім застосуванням JIT-компіляції є робота Кена Томпсона, шаблонований пошук текстового редактора QED, в якому використовувалась JIT-компіляція регулярних виразів у машинний код IBM 7094, під керівництвом ОС Compatible Time-Sharing System. Великий вплив мав спосіб отримання машинного коду через інтерпретацію, який був використаний у імплементації експериментальної мови програмування LC² компанією Mitchell у 1970 році.
Мова Smalltalk містила в собі новаторські аспекти JIT-компіляції. Наприклад, трансляція машинного коду виконувалась за потребою, а результат компіляції кешувався для подальшого використання. У випадку нестачі пам'яті, система видаляла видаляла частинки цього коду та відновлювала новою компіляцією за потреби. Мова Self, «діалект» мови Smalltalk що був розроблений компанією Sun, розвинула ці техніки та певний час була найшвидшою з сімейства Smalltalk, досягаючи половини швидкості оптимізованого коду на C, будучи повністю об'єктно-орієнтованою мовою.
Згодом Sun припинили активну розробку Self, однак використали отриманий досвід у мові Java. Термін «Just-in-time компіляція» був запозичений з виробничого терміну «Just in time» та набув популярності у Java — Джеймс Гослінг використовував цей термін з 1993. Зараз JIT-компіляція використовується більшістю імплементацій віртуальної машини Java, оскільки HotSpot бере за основу та активно використовує цю технологію.
Проєкт Dynamo компанії HP був експериментальним JIT-компілятором, в якому формат байткоду відповідав машинному коду, система переводила машинний код у машинний код . Це призвело до збільшення швидкодії, у деяких випадках до 30 %, оскільки відкрило можливість використовувати оптимізації на рівні машинного коду, наприклад, вбудовування коду для кращого використання кеш-пам'яті, оптимізації викликів динамічних бібліотек та інші, що доступні тільки під час безпосереднього виконання, що робить їх проблематичними для використання звичайними компіляторами.
30 березня 2019 року було анонсовано, що PHP 8 отримає JIT-компіляцію у 2021 році.
Питання безпеки
JIT-компіляція вимагає більшої уваги до питань безпеки та несе підвищені ризики, оскільки має на меті виконання автогенерованого машинного коду. Скомпільований код зберігається в пам'ять та одразу виконується.
Цей процес відрізняється від виконання заздалегідь скомпільованого машинного коду тим, що у випадку JIT-компіляції процесор має виконувати код з загальної ділянки пам'яті. Це суперечить ідеї , за якої виконання машинного коду має бути дозволене тільки з спеціально відмічених ділянок пам'яті, та навпаки — виконання коду з загальної пам'яті заборонене, оскільки це є слабким місцем захисту від зовнішніх втручань. З цієї причини, сегменти пам'яті з кодом, який був скомпільований на льоту, мають бути відмічені як виконавчі сегменти. З міркувань безпеки, виконавча помітка має бути виставлена після запису коду в пам'ять та виставлення помітки тільки для читання (read-only), оскільки одночасний дозвіл на запис та виконання сегменту пам'яті є потенційною небезпекою (див. ). Для прикладу, Javascript JIT-компілятор Firefox'а отримав таку імплементацію у версії Firefox 46.
JIT spraying є підвидом експлойта, що використовує JIT-компіляцію як елемент heap spraying атаки, що дозволяє обійти ASLR та , заповнивши купу виконавчим кодом.
Див. також
- HotSpot
- Common Language Runtime, загальномовне виконавче середовище використовує JIT-компіляцію.
- , мікропроцесор, що на льоту виконує компіляцію x86 коду у власний мікрокод.
- — бібліотека, що генерує на льоту код на мові асемблера.
- LLVM
- Самомодифікований код
- Динамічна компіляція
Примітки
- . Computer Science and Engineering (амер.). Архів оригіналу за 28 жовтня 2020. Процитовано 3 жовтня 2020.
- kexugit. . docs.microsoft.com (en-us) . Архів оригіналу за 19 липня 2020. Процитовано 4 жовтня 2020.
- Aycock, 2003, 2. JIT Compilation Techniques, 2.1 Genesis, p. 98.
- Aycock, 2003, 2. JIT Compilation Techniques, 2.2 LC², p. 98–99.
- Mitchell, J.G. (1970). The design and construction of flexible and efficient interactive programming systems.
- Aycock, 2003.
- Deutsch, L.P.; Schiffman, A.M. (1984). (PDF). POPL '84: Proceedings of the 11th ACM SIGACT-SIGPLAN Symposium on Principles of Programming Languages: 297—302. doi:10.1145/800017.800542. ISBN . Архів оригіналу (PDF) за 18 червня 2004.
- [1] [ 24 листопада 2006 у Wayback Machine.]
- Aycock, 2003, 2.14 Java, p. 107, footnote 13.
- «Dynamo: A Transparent Dynamic Optimization System» [ 2 червня 2012 у Wayback Machine.] Vasanth Bala, Evelyn Duesterwald, Sanjeev Banerjia — PLDI '00 Proceedings of the ACM SIGPLAN 2000 conference on Programming language design and implementation — pages 1 to 12 — DOI:10.1145/349299.349303. Retrieved March 28, 2012
- John Jannotti. . Ars Technica. Архів оригіналу за 5 лютого 2012. Процитовано 5 липня 2013.
- . Архів оригіналу за 19 жовтня 2002. Процитовано 12 квітня 2016.
{{}}
: Обслуговування CS1:Сторінки з посиланнями на джерела, що мають непридатні URL () - . Архів оригіналу за 23 лютого 2020. Процитовано 16 жовтня 2020.
- . April 2019. Архів оригіналу за 7 жовтня 2020. Процитовано 16 жовтня 2020.
- «How to JIT — an introduction [ 17 березня 2019 у Wayback Machine.]», Eli Bendersky, November 5th, 2013 at 5:59 am
- De Mooij, Jan. . Jan De Mooij. Архів оригіналу за 14 травня 2016. Процитовано 11 травня 2016.
- Jürgen Schmidt (20 січня 2011). . The H. Архів оригіналу за 23 січня 2011. Процитовано 22 січня 2011.
Джерела
- Aycock, J. (June 2003). A brief history of just-in-time. ACM Computing Surveys. 35 (2): 97—113. doi:10.1145/857076.857077.
- Thompson, K. (1968). Programming Techniques: Regular expression search algorithm. Communications of the ACM. 11 (6): 419—422. doi:10.1145/363347.363387.
Це незавершена стаття з інформатики. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Just in time compilation JIT takozh vidoma yak dynamic translation abo run time compilation kompilyaciya na lotu ce tehnologiya zbilshennya produktivnosti programnih sistem sho vikonuyut programnij kod shlyahom translyaciyi bajt kodu v mashinnij kod bezposeredno pid chas roboti programi U takij sposib dosyagayetsya visoka shvidkist vikonannya za rahunok zbilshennya spozhivannya pam yati dlya zberigannya rezultativ kompilyaciyi i vitrat chasu na kompilyaciyu JIT kompilyaciya ye kombinaciyeyu dvoh osnovnih metodiv translyaciyi v mashinnij kod interpretaciyi ta statichnoyi kompilyaciyi ta nasliduye yakosti oboh pidhodiv perevagi shvidkosti skompilovanogo kodu ta gnuchkosti interpretatora poyednani z nakladnimi vitratami interpretaciyi ta kompilyaciyi kodu JIT kompilyaciya ye pidvidom dinamichnoyi kompilyaciyi sho dozvolyaye vikoristannya tehnik adaptivnoyi optimizaciyi takih yak dinamichna rekompilyaciya vikoristannya interpretatorom mikroarhitekturnih optimizacij JIT kompilyaciya pidhodit dlya dinamichnih mov programuvannya oskilki sistemi kompilyaciyi realnogo chasu mozhut skonstruyuvati tipi danih ta garantuvati bezpeku ZastosuvannyaCej rozdil ne mistit posilan na dzherela Vi mozhete dopomogti polipshiti cej rozdil dodavshi posilannya na nadijni avtoritetni dzherela Material bez dzherel mozhe buti piddano sumnivu ta vilucheno zhovten 2020 JIT kompilyaciya mozhe buti vikoristana u okremih programah abo dlya realizaciyi pevnogo dinamichnogo funkcionalu takogo yak regulyarni virazi Dlya prikladu redaktor mozhe skompilyuvati regulyarnij viraz yakij buv vvedenij pid chas roboti programi u shvidkij mashinnij kod cyu kompilyaciyu nemozhlivo provesti zavchasno oskilki shablon regulyarnogo virazu vvoditsya pid chas vikonannya Deyaki suchasni pokladayutsya na JIT kompilyaciyu dlya pidvishennya shvidkosti roboti kodu Prikladami takih seredovish ye bilshist implementacij Java ta NET Framework Shozhim chinom bagato bibliotek vikoristovuyut JIT kompilyaciyu dlya translyaciyi regulyarnih viraziv u neobhidnij bajt abo mashinnij kod JIT kompilyaciya takozh vikoristovuyetsya v deyakih emulyatorah z metoyu translyaciyi mashinnogo kodu procesoriv odniyeyi arhitekturi do mashinnogo kodu procesora inshoyi arhitekturi Zvichnij JIT kompilyator vikonuye statichnu kompilyaciyu pered vikonannyam otrimuyuchi bajtkod kod virtualnoyi mashini vidomij takozh yak bajtkod kompilyaciya a pislya vikonuye kompilyaciyu v mashinnij kod dinamichna kompilyaciya abo JIT kompilyaciya zamist prostogo procesu interpretaciyi bajtkodu v mashinnij kod Ce dozvolyaye pokrashiti shvidkist vikonannya kodu porivnyano z interpretaciyeyu cinoyu vtrati chasu na kompilyaciyu Translyaciya kodu JIT kompilyatorom tak samo yak i interpretatorom ye bezperervnim procesom prote keshuvannya skompilovanogo kodu zmenshuye zatrimku podalshogo vikonannya povtorno vikoristanogo kodu Oskilki v comu vipadku kompilyuyetsya tilki chastina programi zatrimka na kompilyaciyu pered vikonannyam ye menshoyu nizh chas kompilyaciyi vsiyeyi programi Istoriya rozvitku JIT kompilyaciyi yiyi osnovnih pidhodivNajpershim opublikovanim JIT kompilyatorom vvazhayetsya robota Dzhona Makkarti nad LISP u 1960 V jogo statti Recursive functions of symbolic expressions and their computation by machine Part I angl Rekursivni funkciyi simvolichnih viraziv ta yihnye obchislennya mashinami Chastina 1 vin zgaduye funkciyi sho translyuyutsya pid chas roboti programi unikayuchi neobhidnosti zberezhennya vihidnogo kodu kompilyatora na perfokartah krashim terminom dlya opisanoyi sistemi bude Sistema kompilyaciyi ta zapusku angl compile and go system Inshim rannim zastosuvannyam JIT kompilyaciyi ye robota Kena Tompsona shablonovanij poshuk tekstovogo redaktora QED v yakomu vikoristovuvalas JIT kompilyaciya regulyarnih viraziv u mashinnij kod IBM 7094 pid kerivnictvom OS Compatible Time Sharing System Velikij vpliv mav sposib otrimannya mashinnogo kodu cherez interpretaciyu yakij buv vikoristanij u implementaciyi eksperimentalnoyi movi programuvannya LC kompaniyeyu Mitchell u 1970 roci Mova Smalltalk mistila v sobi novatorski aspekti JIT kompilyaciyi Napriklad translyaciya mashinnogo kodu vikonuvalas za potreboyu a rezultat kompilyaciyi keshuvavsya dlya podalshogo vikoristannya U vipadku nestachi pam yati sistema vidalyala vidalyala chastinki cogo kodu ta vidnovlyuvala novoyu kompilyaciyeyu za potrebi Mova Self dialekt movi Smalltalk sho buv rozroblenij kompaniyeyu Sun rozvinula ci tehniki ta pevnij chas bula najshvidshoyu z simejstva Smalltalk dosyagayuchi polovini shvidkosti optimizovanogo kodu na C buduchi povnistyu ob yektno oriyentovanoyu movoyu Zgodom Sun pripinili aktivnu rozrobku Self odnak vikoristali otrimanij dosvid u movi Java Termin Just in time kompilyaciya buv zapozichenij z virobnichogo terminu Just in time ta nabuv populyarnosti u Java Dzhejms Gosling vikoristovuvav cej termin z 1993 Zaraz JIT kompilyaciya vikoristovuyetsya bilshistyu implementacij virtualnoyi mashini Java oskilki HotSpot bere za osnovu ta aktivno vikoristovuye cyu tehnologiyu Proyekt Dynamo kompaniyi HP buv eksperimentalnim JIT kompilyatorom v yakomu format bajtkodu vidpovidav mashinnomu kodu sistema perevodila mashinnij kod u mashinnij kod Ce prizvelo do zbilshennya shvidkodiyi u deyakih vipadkah do 30 oskilki vidkrilo mozhlivist vikoristovuvati optimizaciyi na rivni mashinnogo kodu napriklad vbudovuvannya kodu dlya krashogo vikoristannya kesh pam yati optimizaciyi viklikiv dinamichnih bibliotek ta inshi sho dostupni tilki pid chas bezposerednogo vikonannya sho robit yih problematichnimi dlya vikoristannya zvichajnimi kompilyatorami 30 bereznya 2019 roku bulo anonsovano sho PHP 8 otrimaye JIT kompilyaciyu u 2021 roci Pitannya bezpekiJIT kompilyaciya vimagaye bilshoyi uvagi do pitan bezpeki ta nese pidvisheni riziki oskilki maye na meti vikonannya avtogenerovanogo mashinnogo kodu Skompilovanij kod zberigayetsya v pam yat ta odrazu vikonuyetsya Cej proces vidriznyayetsya vid vikonannya zazdalegid skompilovanogo mashinnogo kodu tim sho u vipadku JIT kompilyaciyi procesor maye vikonuvati kod z zagalnoyi dilyanki pam yati Ce superechit ideyi za yakoyi vikonannya mashinnogo kodu maye buti dozvolene tilki z specialno vidmichenih dilyanok pam yati ta navpaki vikonannya kodu z zagalnoyi pam yati zaboronene oskilki ce ye slabkim miscem zahistu vid zovnishnih vtruchan Z ciyeyi prichini segmenti pam yati z kodom yakij buv skompilovanij na lotu mayut buti vidmicheni yak vikonavchi segmenti Z mirkuvan bezpeki vikonavcha pomitka maye buti vistavlena pislya zapisu kodu v pam yat ta vistavlennya pomitki tilki dlya chitannya read only oskilki odnochasnij dozvil na zapis ta vikonannya segmentu pam yati ye potencijnoyu nebezpekoyu div Dlya prikladu Javascript JIT kompilyator Firefox a otrimav taku implementaciyu u versiyi Firefox 46 JIT spraying ye pidvidom eksplojta sho vikoristovuye JIT kompilyaciyu yak element heap spraying ataki sho dozvolyaye obijti ASLR ta zapovnivshi kupu vikonavchim kodom Div takozhHotSpot Common Language Runtime zagalnomovne vikonavche seredovishe vikoristovuye JIT kompilyaciyu mikroprocesor sho na lotu vikonuye kompilyaciyu x86 kodu u vlasnij mikrokod biblioteka sho generuye na lotu kod na movi asemblera LLVM Samomodifikovanij kod Dinamichna kompilyaciyaPrimitki Computer Science and Engineering amer Arhiv originalu za 28 zhovtnya 2020 Procitovano 3 zhovtnya 2020 kexugit docs microsoft com en us Arhiv originalu za 19 lipnya 2020 Procitovano 4 zhovtnya 2020 Aycock 2003 2 JIT Compilation Techniques 2 1 Genesis p 98 Aycock 2003 2 JIT Compilation Techniques 2 2 LC p 98 99 Mitchell J G 1970 The design and construction of flexible and efficient interactive programming systems Aycock 2003 Deutsch L P Schiffman A M 1984 PDF POPL 84 Proceedings of the 11th ACM SIGACT SIGPLAN Symposium on Principles of Programming Languages 297 302 doi 10 1145 800017 800542 ISBN 0 89791 125 3 Arhiv originalu PDF za 18 chervnya 2004 1 24 listopada 2006 u Wayback Machine Aycock 2003 2 14 Java p 107 footnote 13 Dynamo A Transparent Dynamic Optimization System 2 chervnya 2012 u Wayback Machine Vasanth Bala Evelyn Duesterwald Sanjeev Banerjia PLDI 00 Proceedings of the ACM SIGPLAN 2000 conference on Programming language design and implementation pages 1 to 12 DOI 10 1145 349299 349303 Retrieved March 28 2012 John Jannotti Ars Technica Arhiv originalu za 5 lyutogo 2012 Procitovano 5 lipnya 2013 Arhiv originalu za 19 zhovtnya 2002 Procitovano 12 kvitnya 2016 a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite web title Shablon Cite web cite web a Obslugovuvannya CS1 Storinki z posilannyami na dzherela sho mayut nepridatni URL posilannya Arhiv originalu za 23 lyutogo 2020 Procitovano 16 zhovtnya 2020 April 2019 Arhiv originalu za 7 zhovtnya 2020 Procitovano 16 zhovtnya 2020 How to JIT an introduction 17 bereznya 2019 u Wayback Machine Eli Bendersky November 5th 2013 at 5 59 am De Mooij Jan Jan De Mooij Arhiv originalu za 14 travnya 2016 Procitovano 11 travnya 2016 Jurgen Schmidt 20 sichnya 2011 The H Arhiv originalu za 23 sichnya 2011 Procitovano 22 sichnya 2011 DzherelaAycock J June 2003 A brief history of just in time ACM Computing Surveys 35 2 97 113 doi 10 1145 857076 857077 Thompson K 1968 Programming Techniques Regular expression search algorithm Communications of the ACM 11 6 419 422 doi 10 1145 363347 363387 Ce nezavershena stattya z informatiki Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi