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/) |