Машина да Винчи - Da Vinci Machine

Многоязычная виртуальная машина
Леонардо да Винчи Helicopter.jpg
Разработчики) Sun Microsystems
Операционная система Кроссплатформенность
Тип Библиотека
Лицензия GPL + исключение связи
Интернет сайт openjdk .java .net / проекты / mlvm /

Машина Да Винчи , также называемая многоязычной виртуальной машиной , была проектом Sun Microsystems, целью которого было создание прототипа расширения виртуальной машины Java (JVM) для добавления поддержки динамических языков .

Уже было возможно запускать динамические языки поверх JVM, но цель состоит в том, чтобы упростить реализацию новых динамических языков и повысить их производительность. Этот проект был эталонная реализация в JSR 292 ( Поддержка динамически типизированных языков на платформе Java ).

История

Java virtual machine architecture.svg

До Java 7 виртуальная машина Java не имела встроенной поддержки языков с динамической типизацией :

JSR 292 ( Поддержка динамически типизированных языков на платформе Java ) предлагает:

  • добавить новую invokedynamic инструкцию на уровне JVM, чтобы разрешить вызов метода, основанного на проверке динамического типа ,
  • чтобы иметь возможность динамически изменять классы и методы во время выполнения в производственной среде.

После успеха реализации JRuby Java в конце января 2008 г. был начат проект Da Vinci. Планировалось добавить возможности, с которыми экспериментировал Da Vinci, в Java 7 . Он направлен на создание прототипа этого JSR, а также других расширений с более низким приоритетом. Первый рабочий прототип, разработанный как патч для OpenJDK , был анонсирован и стал доступен в конце августа 2008 года.

С тех пор команда JRuby успешно внедрила динамический вызов в свою кодовую базу. Динамический вызов поставляется с выпуском 1.1.5 и будет отключен на JVM без invokedynamic возможностей.

С тех пор проект был интегрирован в кодовую базу JDK 7, а затем интегрирован в выпуск Java 7 .

Архитектура

Динамический вызов основан на том факте, что даже если Java является строго статическим языком на уровне языка, информация о типе гораздо менее распространена на уровне байт-кода .

Однако реализации динамических языков должны иметь возможность использовать своевременную компиляцию (а не отражение ) для достижения хорошей производительности и, таким образом, для компиляции сценариев в байт-код во время выполнения. Чтобы разрешить запуск виртуальной машины Java , эти байт-коды должны быть проверены перед выполнением, а верификатор должен проверить, что типы статичны во всем коде. Это приводит к реализации этой имеющей создать много различного байткода для различных контекстов вызова метода, каждый раз , когда подпись из аргументов изменения.

Это не только использует много памяти, но и заполняет область памяти под названием Metaspace (постоянное создание до Java 8), часть кучи, используемой JVM для хранения информации о классах . Память, используемая в этой области, почти никогда не собирается сборщиком мусора, поскольку в ней хранятся неизменяемые данные в контексте программ Java; и по этой причине реализации динамических языков могут компилировать только небольшую часть скриптов.

JSR 292 предлагает:

  • предоставить механизм, посредством которого существующий класс может быть загружен и изменен, создавая новый класс с этими модификациями, но разделяя остальную его структуру и данные, таким образом не заполняя пространство постоянного поколения ,
  • предоставить новый invokedynamic байт-код, который позволяет JVM оптимизировать вызовы такого типа.

Смотрите также

Рекомендации

внешняя ссылка