Машина да Винчи - Da Vinci Machine
Разработчики) | Sun Microsystems |
---|---|
Операционная система | Кроссплатформенность |
Тип | Библиотека |
Лицензия | GPL + исключение связи |
Интернет сайт | openjdk |
Машина Да Винчи , также называемая многоязычной виртуальной машиной , была проектом Sun Microsystems, целью которого было создание прототипа расширения виртуальной машины Java (JVM) для добавления поддержки динамических языков .
Уже было возможно запускать динамические языки поверх JVM, но цель состоит в том, чтобы упростить реализацию новых динамических языков и повысить их производительность. Этот проект был эталонная реализация в JSR 292 ( Поддержка динамически типизированных языков на платформе Java ).
История
До Java 7 виртуальная машина Java не имела встроенной поддержки языков с динамической типизацией :
- Существующий набор команд JVM является статически типизированным .
- JVM имеет ограниченную поддержку динамического изменения существующих классов и методов. В настоящее время он работает только в среде отладки .
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 оптимизировать вызовы такого типа.
Смотрите также
- Сценарии для платформы Java
- Список языков JVM
- Dynamic Language Runtime - среда от Microsoft, которая обеспечивает поддержку динамических языков в .NET Framework Common Language Runtime.
- Nashorn (движок JavaScript) - основан на машине Да Винчи