64 lines
11 KiB
Markdown
64 lines
11 KiB
Markdown
---
|
||
title: Just in Time Compilation
|
||
localeTitle: Только во время компиляции
|
||
---
|
||
## Только во время компиляции
|
||
|
||
Компиляция «точно вовремя» - это метод повышения производительности интерпретируемых программ. Во время выполнения программа может быть скомпилирована в собственный код, чтобы повысить ее производительность. Он также известен как динамическая компиляция.
|
||
|
||
Динамическая компиляция имеет некоторые преимущества перед статической компиляцией. При запуске приложений Java или C # среда выполнения может профилировать приложение во время его запуска. Это позволяет создавать более оптимизированный код. Если поведение приложения изменяется во время его запуска, среда выполнения может перекомпилировать код.
|
||
|
||
Некоторые из недостатков включают задержки запуска и накладные расходы компиляции во время выполнения. Чтобы ограничить накладные расходы, многие компиляторы JIT компилируют часто используемые коды кода.
|
||
|
||
### обзор
|
||
|
||
Традиционно существует два метода преобразования исходного кода в форму, которая может быть запущена на платформе. Статическая компиляция преобразует код в язык для конкретной платформы. Интерпретатор напрямую выполняет исходный код.
|
||
|
||
Компиляция JIT пытается использовать преимущества обоих. Пока интерпретируемая программа запускается, компилятор JIT определяет наиболее часто используемый код и компилирует его в машинный код. В зависимости от компилятора это можно сделать по методу или в меньшем разделе кода.
|
||
|
||
Динамическая компиляция была впервые описана в статье Дж. Маккарти на LISP в 1960 году.
|
||
|
||
Just In Time Compilation, JIT или Dynamic Translation - это компиляция, выполняемая во время выполнения программы. Значение во время выполнения, в отличие от предшествующего выполнения. Что происходит, это перевод на машинный код. Преимущества JIT связаны с тем, что, поскольку компиляция имеет место во время выполнения, компилятор JIT имеет доступ к динамической информации о времени выполнения, что позволяет ему улучшать оптимизацию (например, встроенные функции).
|
||
|
||
Что важно понимать в компиляции JIT, заключается в том, что он будет компилировать байт-код в инструкции машинного кода работающей машины. Смысл в том, что полученный машинный код оптимизирован для архитектуры процессора работающего компьютера.
|
||
|
||
Два примера JIT-компиляторов: JVM (Java Virtual Machine) в Java и CLR (Common Language Runtime), на C #.
|
||
|
||
## JIT означает Just-in-Time, что означает, что код скомпилируется, когда это необходимо, а не во время выполнения.
|
||
|
||
Вначале компилятор отвечал за превращение языка высокого уровня (более высокого уровня, чем ассемблер) в объектный код (машинные инструкции), который затем был бы связан (компоновщиком) с исполняемым файлом.
|
||
|
||
В какой-то момент эволюции языков компиляторы будут компилировать язык высокого уровня в псевдокод, который затем будет интерпретироваться (интерпретатором) для запуска вашей программы. Это устранило объектный код и исполняемые файлы и позволило переносить эти языки на несколько операционных систем и аппаратных платформ. Паскаль (который скомпилирован в P-Code) был одним из первых; Java и C # являются более свежими примерами. В конце концов термин P-Code был заменен байт-кодом, так как большинство псевдо-операций являются байтами длинных.
|
||
|
||
Компилятор Just-In-Time (JIT) - это функция интерпретатора времени выполнения, который вместо интерпретации байт-кода при каждом вызове метода скомпилирует байт-код в инструкции машинного кода работающей машины и затем вызывает это вместо этого. В идеале эффективность запуска кода объекта будет преодолевать неэффективность перекомпиляции программы каждый раз, когда она запускается.
|
||
|
||
Компилятор JIT запускается после запуска программы и компиляции кода (обычно байт-кода или каких-либо инструкций VM) «на лету» (или точно в срок, как его называют), в форму, которая обычно быстрее, обычно родной процессор основного процессора набор инструкций. JIT имеет доступ к динамической информации о времени выполнения, тогда как стандартный компилятор не делает и может улучшить оптимизацию, например, часто используемые функции наложения.
|
||
|
||
Это противоречит традиционному компилятору, который компилирует весь код для машинного языка до того, как программа будет запущена в первый раз.
|
||
|
||
Чтобы перефразировать, обычные компиляторы строят всю программу как EXE-файл ПЕРЕД первым при ее запуске. Для более новых программ стиля сборка создается с псевдокодом (p-код). Только ПОСЛЕ того, как вы выполняете программу в ОС (например, дважды щелкнув по ее значку), компилятор (JIT) запустит и сгенерирует машинный код (m-код), который процессор Intel или что-то поймет.
|
||
|
||
## Типичный сценарий:
|
||
|
||
Исходный код полностью преобразуется в машинный код
|
||
|
||
## Сценарий JIT:
|
||
|
||
Исходный код будет преобразован в язык ассемблера, такой как структура \[для ex IL (промежуточный язык) для C #, ByteCode для java\].
|
||
|
||
Промежуточный код преобразуется в машинный язык только тогда, когда требуется приложение, требуемые коды преобразуются только в машинный код.
|
||
|
||
## Сравнение JIT и Non-JIT:
|
||
|
||
В JIT не весь код сначала преобразуется в машинный код, часть необходимого кода будет преобразована в машинный код, а если вызванный метод или функциональность не находится в машине, то это будет превращено в машинный код ... это уменьшает нагрузку на CPU. Поскольку машинный код будет генерироваться во время выполнения .... JIT-компилятор будет генерировать машинный код, оптимизированный для работы архитектуры процессора. Примеры JIT:
|
||
|
||
В Java JIT находится в JVM (виртуальная машина Java) В C # он находится в CLR (Common Language Runtime) В Android он находится в DVM (Dalvik Virtual Machine) или ART (Android RunTime) в новых версиях.
|
||
|
||
Java Virtual Machine (JVM) (JVM исполняет байт-код) поддерживает подсчет количества времени выполнения функции. Если этот счет превышает предопределенный предел, JIT компилирует код в машинный язык, который может быть непосредственно выполнен процессором (в отличие от обычного случая, когда javac компилирует код в байт-код, а затем java - интерпретатор интерпретирует этот байт-код по строкам, преобразует его в машинный код и выполняется).
|
||
|
||
Также в следующий раз, когда эта функция вычисляется, тот же скомпилированный код выполняется снова, в отличие от обычной интерпретации, в которой код интерпретируется снова по строкам. Это ускоряет выполнение.
|
||
|
||
#### Больше информации
|
||
|
||
* [Компиляция JIT (Википедия)](https://en.wikipedia.org/wiki/Just-in-time_compilation)
|
||
* [Введение в JIT](https://eli.thegreenplace.net/2013/11/05/how-to-jit-an-introduction/) |