Не работы ради, а из развлечения токмо, недавно нарвался на проект Graal (надеюсь доберусь и до его разбора) и по ссылкам углубился в такие глуби, что скоро перестал верить своим глазам. Оказалось что существует underworld с вампи… виртуальными машинами для Java, о которых нормальный магл и понятия не имеет. Только посвящённые. Теперь и я немного посвящён и делюсь, чтобы каждый был готов к их пришествию.
В нашем мире правит HotSpot, и, я думаю, никто не будет с этим спорить. Но есть люди, которых он не устраивает в том виде, который он приобрел годами направленных мутаций. Кому-то не нравится его низкоуровневый внутренний мир, кому-то хочется модульности, кто-то любит пожестче и т.д. Вариантов много.
И тогда, эта группа любителей странных вещей объединяется и начинает пилить. Пилить OpenJDK обычно, в надежде сделать “правильно”.
Надо сразу определиться, что разработчиков Maxine VM совершенно не волнуют стандартные библиотеки, так как используется классический JDK версии 6 (семёрка сейчас имплементируется), а все улучшайзинги касаются исключительно самой VM.
Главная фича Maxine – это то, что она полностью (ну, почти) написана на Java, то есть является метацикличной (metacircular). Так как Максин создана не для конечного пользователя, а в научных/образовательных целях, то это очень важно, и позволяет неплохо подтянуть системное программирование в его чистом виде. Единственная часть, которая не является Java – это код на C, который отвечает за получение от ОС так называемых нативных служб: встроенных потоков, выделения виртуальной памяти и т.д., а также части реализации JNI и JVM TI.
Сам процесс запуска виртуальной машины тоже требует определенной доли веры в то, что ты делаешь. Во-первых вам потребуется HotSpot. Проблема состоит в том, что она нужна для генерации загрузочного образа Maxine VM. Пару слов о том, как это происходит: с помощью javac код транслируется в байткод, после чего запускается на родительской виртуальной машине, которой, пока, Maxine VM быть не может в силу своей молодости. После чего полученное приложение (boot image generator), превращает байткод в машинный, мапит его на файл и запускает собственную виртуальную машину, после чего родительская VM не используется. Звучит заумно, но если вдуматься, то вполне логично и понятно.
Максин разбита не несколько схем. Каждая схема отвечает за свой кусок функционала и может быть расширена и дополнена, так как использует стандартные интерфейсы для взаимодействия с остальными частями системы. Например, существуют схемы для размещения объектов в памяти, для выделения heap и сборки мусора и т.д. Это важнейшая фича для экспериментов. Модульность даёт возможность написать свой сборщик мусора, со своим алгоритмом, на языке высокого уровня, а затем проверить его в боевых условиях. Собственно ради этого и стоит запускать эту VM. Никому и в страшном сне не приснится использовать ее в качестве основной.
Есть еще фишки, которые достаточно интересны, чтобы на них взглянуть:
-
JDK, для соединения с HotSpot, использует native методы. Maxine VM обходит и этот позор, создавая классы обертки для этих методов на Java с помощью аннотаций.
-
C1X и T1X компиляторы. Maxine использует динамическую компиляцию. Это значит, что байткод превращается в машинный при первом вызове функции. Это делает T1X. C1X включается при частом использовании некоторой функции (происходит оптимизация).
-
Ну и Maxine Inspector. Этот tool используется для дебаггинга самой VM. Достаточно удобный. Хотя…
В этом посте я осветил небольшую часть того, что входит в состав этой виртуальной машины и ее функционала. Может быть, по мере углубления в вопрос я смогу рассказать чуть больше и чуть подробнее, а сейчас многие вещи все еще являются загадкой.