Java

JVM интерпритация - что происходит под капотом?

Помогите пожалуйста прояснить картину. Что значит интерпритация байт-кода с точки зрения процессов в компьютере? Мне казалось - это значит, что во время выполнения приложения jvm компилирует байт код в код для процессора ( т. е. то, что происходит во время компиляции c++), но картина мира начала рушится, когда узнал, JIT компилятор делает именно это но только с тем кодом, который часто выполняется, а остальной код интерпритируется и вот мне не понятно - что значит интерпритация ( как буд-то не процессор выполняется этот код) и почему он медленнее? Спасибо!
Вы вроде как путаете теплое с мягким. Я порывался отвтить в предыдущем вопросе, но там отметился Максим, и вобщем то добавлять было уже нечего. Итак, есть исходники, сразу после написания, эти исходники преобразуются в байт-код, это как набор процессорных инструкций, только для сферического процессора в вакууме. Когда доходит дело до реального запуска на реальном процессоре, это байт-код, на лету в о время исполнения программы преобразуется из инстуркций сферического процессора, в конкретный набор инструкций для конкретного процессора на которм был произвден запуск. Это то что проиходит в общих чертах. Если копать немного глубже - то далее вступает в действие туева хуча механизмов, плюшек, свистелок/перделок и улучшайзеров. В самом Джите - есть куча фишечек которые оптимизируют работу программы. Куча кода который крутится часто и много тихой сапой преоразуются в набор "живых" инструкций и крутятся как есть, ну например List в котором всегда три кота, причем одних и тех-же, и у каждого кота берется только его, ну например name. Вот этот статичный кусок, скомпилится в некий статичный кусок кода, где даже сами коты как таковые храниться не будут. А вот всякий "неоднозначный" код, например интерфейс, который расширяется десятком классов, каждый из которых используется по разу или два за все время жизни программы, JIT тоже скомпилирует в набор инструкций, но "индивидуально", т. е. каждый раз, на лету в зависимости от того что происходит.
Дмитрий Самара
Дмитрий Самара
4 644
Лучший ответ
Анатолий Кислюк Спасибо! А преобразованием инструкций байт кода в набор инструкций для конкретного процессора занимается так же JIT компилятор? или он активизируется только в момент, кода был найден List котов, а преобразование (интерпретация) - это как отдельная функция jvm?
Там давольно все сложно, и может разнится в разных JVM, общий подход такой :
1) Самый медленный - интерпретация : где то в JVM сидит длинный switch()... case и бегает по всем инструкция байт-кода и потихоньку исполняет его средствами среды (грубо говоря "C").

2) Эвристическая компиляция по ходу исполнения : небольшие конструкции выносятся в отдельный блок исполняемой памяти (исполняемые процессором инструкции) и сохраняется как "ссылка на функцию" - в случае провала, JVM откатывается в режим интерпретации. (тут в основном примитивные действия +-><== итд)

3) Предварительная JIT компиляция : собирая статистику, основываясь на попаданиях и промахах в пункте 2, JVM формирует "сильные" указатели на куски исполняемой программы - на этой стадии в основном происходит инлайнинг.

4) Стадия оптимизации : раскрутка циклов, оптимизация коллекций/массивов, переход к примитивным типам итд.

Но на самом деле там все очень сложно и возможно я все не так понимаю :)
то же самое, что интерпрЕтация не байт-кода, а исходного кода - в JS, Python и т. д.
Дима Пухов
Дима Пухов
1 563