Мне до сих пор не ясна концепция компиляции байтовых кодов в машинные коды компилятором JIT. Я хочу знать, почему он создает более быстрые коды по сравнению с интерпретатором, отличным от JIT. Может ли кто-нибудь дать мне хороший пример того, как этот процесс выполняется?
Почему интерпретатор с JIT выдает более быстрые коды, чем без него?
Ответы (3)
Предположим, у вас есть цикл, который нужно выполнить миллион раз.
«Настоящий» интерпретатор должен просматривать байт-код this на каждой итерации цикла и определять, какое влияние код должен оказывать на состояние системы (вызовы и т. д.).
JIT-компилятор просматривает байт-код только один раз1 и компилирует его в машинный код, который затем может быть понят непосредственно компьютером — дальнейшая трансляция не требуется. Перевод требует времени, поэтому, если вы можете сделать это только один раз, это более эффективно.
Приведем пример из реальной жизни: если бы у вас был роман на английском языке и некоторые французы интересовались им, вы могли бы отдать книгу тому, кто знает оба языка, и кто мог бы читать ее вслух каждого человека индивидуально. Или вы можете попросить этого человека забрать книгу, перевести ее на французский язык, а затем дать каждому французу копию книги на французском языке. Если книгой интересуется только один человек, то оперативный перевод более эффективен - нет необходимости в редакторе, верстальщике, типографе и т.д... но если желающих много прочтите книгу, тогда имеет смысл сделать более тщательный разовый перевод.
1 Некоторые JIT-компиляторы, в том числе и в HotSpot, фактически JIT-компилируют один и тот же код несколько раз с разными уровнями оптимизации, в зависимости от использования.
Код, скомпилированный JIT, фактически выполняется непосредственно на «голом железе», тогда как интерпретируемый код должен постоянно переинтерпретироваться интерпретатором. Интерпретатору больше не нужно повторно обрабатывать и повторно обрабатывать байт-код.
Компилятор переводит наш исходный код высокого уровня в байт-код, а для перевода байт-кода в машинный код некоторые реализации имеют обычный интерпретатор, некоторые — компилятор Just-in-time. Чтобы выполнить цикл, который выполняется, скажем, миллион раз, JIT-компилятор преобразует байт-код в машинный код только один раз, а в следующих итерациях машина просто понимает байт-код. В то время как обычный интерпретатор в каждой итерации многократно переводит байт-код в машинный код, что требует больше времени для завершения цикла, который выполняется, скажем, миллион раз.
javap -c
дизассемблирует файл класса и показывает байт-код. Примеры языка ассемблера есть везде. - person Dave Newton   schedule 09.01.2012