JIT-компиляция

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

JIT-компиляция (англ. Just-in-time compilation, компиляция «на лету»), динамическая компиляция (англ. dynamic translation) — технология увеличения производительности программных систем, использующих байт-код, путём компиляции байт-кода в машинный код непосредственно во время работы программы. Таким образом достигается высокая скорость выполнения по сравнению с интерпретируемым байткодом[1] (сравнимая с компилируемыми языками) за счёт увеличения потребления памяти (для хранения результатов компиляции) и затрат времени на компиляцию. JIT базируется на двух более ранних идеях, касающихся среды исполнения: компиляции байт-кода и динамической компиляции.

В языках, компилирующихся в байт-код, таких как Java, PHP, C#, Lua, Perl, GNU CLISP, исходный код транслируется в одно из промежуточных представлений, известное как байт-код. Байт-код не является машинным кодом какого-либо компьютера и может переноситься на различные компьютерные архитектуры. Байт-код интерпретируется (исполняется) виртуальной машиной.

JIT используется в реализациях Java, JavaScript, .NET Framework, в одной из реализаций Python — PyPy.[2] Существующие наиболее распространённые интерпретаторы языков PHP, Ruby, Perl, Python и им подобных имеют ограниченные или неполные JIT.

В Java JIT используется так: если набрать в командной строке java MyClass, то запускается JVM, в ней вызывается процедура загрузки классов с параметром MyClass, затем загруженный класс передается интерпретатору, который исполняет байт-код класса (инструкции виртуальной java-машины). Когда интерпретатор замечает, что некий метод исполняется очень часто, то этот метод передается в JIT и транслируется в машинные команды, и все последующие вызовы этого метода будут обращаться к оттранслированному машинному представлению. Таким образом, получается смесь из интерпретируемых и транслированных методов. Более того, в транслированные методы также вставляется сбор статистики и, если метод исполняется очень часто, то его снова передают в JIT с целью оптимизации - например, короткие методы инлайнятся, неизменяемые параметры подставляются в код, константные выражения выносятся из цикла, объекты, не выходящие из метода, заказываются на стеке, а не в куче - используются десятки способов.


Проект DotGNU разрабатывает библиотеку libJIT, которая предоставляет возможность привести JIT в любой скриптовой язык. Проекты LLVM и GNU Lightning[3] также могут быть использованы для создания JIT.

Видимо, впервые компиляция на лету была введена в реализациях динамического интерпретируемого языка Smalltalk.

Также большой интерес представляет диссертация, защищённая в 1994 году в Университете ETH (Швейцария, Цюрих) Михаэлем Францем «Динамическая кодогенерация — ключ к переносимому программному обеспечению»[4] и реализованная им система Juice[5] динамической кодогенерации из переносимого семантического дерева для языка Оберон. Система Juice предлагалась как плагин для интернет-браузеров.

См. также[править | править вики-текст]

Примечания[править | править вики-текст]