Java
JVM интерпритация - что происходит под капотом?
Помогите пожалуйста прояснить картину. Что значит интерпритация байт-кода с точки зрения процессов в компьютере? Мне казалось - это значит, что во время выполнения приложения jvm компилирует байт код в код для процессора ( т. е. то, что происходит во время компиляции c++), но картина мира начала рушится, когда узнал, JIT компилятор делает именно это но только с тем кодом, который часто выполняется, а остальной код интерпритируется и вот мне не понятно - что значит интерпритация ( как буд-то не процессор выполняется этот код) и почему он медленнее? Спасибо!
Вы вроде как путаете теплое с мягким. Я порывался отвтить в предыдущем вопросе, но там отметился Максим, и вобщем то добавлять было уже нечего. Итак, есть исходники, сразу после написания, эти исходники преобразуются в байт-код, это как набор процессорных инструкций, только для сферического процессора в вакууме. Когда доходит дело до реального запуска на реальном процессоре, это байт-код, на лету в о время исполнения программы преобразуется из инстуркций сферического процессора, в конкретный набор инструкций для конкретного процессора на которм был произвден запуск. Это то что проиходит в общих чертах. Если копать немного глубже - то далее вступает в действие туева хуча механизмов, плюшек, свистелок/перделок и улучшайзеров. В самом Джите - есть куча фишечек которые оптимизируют работу программы. Куча кода который крутится часто и много тихой сапой преоразуются в набор "живых" инструкций и крутятся как есть, ну например List в котором всегда три кота, причем одних и тех-же, и у каждого кота берется только его, ну например name. Вот этот статичный кусок, скомпилится в некий статичный кусок кода, где даже сами коты как таковые храниться не будут. А вот всякий "неоднозначный" код, например интерфейс, который расширяется десятком классов, каждый из которых используется по разу или два за все время жизни программы, JIT тоже скомпилирует в набор инструкций, но "индивидуально", т. е. каждый раз, на лету в зависимости от того что происходит.
Анатолий Кислюк
Спасибо! А преобразованием инструкций байт кода в набор инструкций для конкретного процессора занимается так же JIT компилятор? или он активизируется только в момент, кода был найден List котов, а преобразование (интерпретация) - это как отдельная функция jvm?
Там давольно все сложно, и может разнится в разных JVM, общий подход такой :
1) Самый медленный - интерпретация : где то в JVM сидит длинный switch()... case и бегает по всем инструкция байт-кода и потихоньку исполняет его средствами среды (грубо говоря "C").
2) Эвристическая компиляция по ходу исполнения : небольшие конструкции выносятся в отдельный блок исполняемой памяти (исполняемые процессором инструкции) и сохраняется как "ссылка на функцию" - в случае провала, JVM откатывается в режим интерпретации. (тут в основном примитивные действия +-><== итд)
3) Предварительная JIT компиляция : собирая статистику, основываясь на попаданиях и промахах в пункте 2, JVM формирует "сильные" указатели на куски исполняемой программы - на этой стадии в основном происходит инлайнинг.
4) Стадия оптимизации : раскрутка циклов, оптимизация коллекций/массивов, переход к примитивным типам итд.
Но на самом деле там все очень сложно и возможно я все не так понимаю :)
1) Самый медленный - интерпретация : где то в JVM сидит длинный switch()... case и бегает по всем инструкция байт-кода и потихоньку исполняет его средствами среды (грубо говоря "C").
2) Эвристическая компиляция по ходу исполнения : небольшие конструкции выносятся в отдельный блок исполняемой памяти (исполняемые процессором инструкции) и сохраняется как "ссылка на функцию" - в случае провала, JVM откатывается в режим интерпретации. (тут в основном примитивные действия +-><== итд)
3) Предварительная JIT компиляция : собирая статистику, основываясь на попаданиях и промахах в пункте 2, JVM формирует "сильные" указатели на куски исполняемой программы - на этой стадии в основном происходит инлайнинг.
4) Стадия оптимизации : раскрутка циклов, оптимизация коллекций/массивов, переход к примитивным типам итд.
Но на самом деле там все очень сложно и возможно я все не так понимаю :)
то же самое, что интерпрЕтация не байт-кода, а исходного кода - в JS, Python и т. д.
Похожие вопросы
- Объясните пожалуйста, что происходит в этом коде:
- Ведическая интерпритация & западная интерпритация. Какая логичнее?
- Почему на одних машинах открывается капот в одну сторону, а на других в другую?
- Христиане, какие именно неоспоримые чудеса происходили с вами? Иожет это было самовнушение, религиозная интерпритация
- упор капота,как доработать чтоб работал на амартизаторах,ВАЗ 2109,ЦЕЛЬ -ЧТОБ КАПОТ ОТКРЫВАЛСЯ НА АМАРТИЗАТОРАХ.
- Ребята,знающие,кто сталкивался?Мне с завидной частотой снится кладбище,в рзных интерпритациях,то я ворю с умершими(незна
- Покраска капота
- Что сделать с капотом?
- Случалось ли такое что автомеханики забывали в капоте какие либо вещи? :)))
- Зачем на капотах спортивных авто вот такие штуки (фото)?