Изучение байт-кода Java и JVM
В недавнем вопросе, заданном недавно, мой простой ответ подчеркнул многие мои неправильные представления о Java, JVM и о том, как код компилируется и запускается. Это создало во мне желание поднять мое понимание на более низкий уровень. У меня нет проблем с низкоуровневым пониманием, таким как сборка, как меня смущает байт-код и JVM. То, как объектно-ориентированный код разбивается на низком уровне, для меня потеряно. Мне было интересно, есть ли у кого-нибудь предложения о том, как узнать о JVM, байт-коде и функционировании Java более низкого уровня. Существуют ли какие-либо утилиты, которые позволяют вам писать и запускать байт-код напрямую, так как я считаю, что практический опыт работы с чем-то - это лучший способ вырасти в понимании этого? Дополнительно и чтение предложений по этой теме будет принята с благодарностью.
Изменить: вторичный вопрос. Так что у меня есть своего рода подвопрос, ответы дали мне интересную идею, чтобы узнать о jvm, какова вероятность написания действительно простого языка, такого как brainf**k или Ook, только в читаемом синтаксисе (возможно, я мог бы даже разработать его поддерживать oo в конечном итоге), который компилируется в байт-код быть? Будет ли это хорошим опытом обучения?
6 ответов
Рекомендуемое чтение: спецификация JVM.
Вы также можете поиграть с BCEL - есть другие библиотеки для манипулирования байт-кодом, но это, вероятно, самая известная из них.
Apache BCEL позволит вам анализировать и вручную создавать файлы.class из байт-кода.
javap позволит вам разобрать существующие файлы.class. Это особенно полезно для того, чтобы разбить классы быстрого тестирования, чтобы понять, что на самом деле происходит под одеялом.
Я научился читать учебник по ASM и изучать саму библиотеку.
ИМХО, ASM лучше, чем BECL.
BCEL уже успешно используется в нескольких проектах, таких как компиляторы, оптимизаторы, обфускаторы, генераторы кода и инструменты анализа. К сожалению, за последние несколько лет не было большого развития. Не стесняйтесь помочь, или вы можете заглянуть в проект ASM на objectweb. - http://jakarta.apache.org/bcel/
Существует только один надежный источник для понимания JVM
Спецификация виртуальной машины Java® Java SE 7 Edition
http://docs.oracle.com/javase/specs/jvms/se7/html/index.html
Программирование для виртуальной машины Java - хорошая книга для этой темы. (Раскрытие: я работаю с автором.)
Для понимания архитектуры Java/ JVM: прочитайте Википедию, спецификации и исходный код.
Чтобы понять, как объектно-ориентированный код выполняется на низком уровне: попробуйте и эмулируйте такие функции, как наследование / полиморфизм / инкапсуляция, в языке более низкого уровня, таком как C.
В C вы можете достичь вышеуказанного, например, с помощью комбинации указателей функций и вложенных структур.