Эта статья поднимает множество проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалить эти сообщения-шаблоны ) ( Узнайте, как и когда удалить этот шаблон сообщения )
|
Разработчики) | Sun Microsystems |
---|---|
Операционная система | Кроссплатформенность |
Тип | Библиотека |
Лицензия | GPL + исключение связи |
Веб-сайт | openjdk |
Машина Да Винчи , также называемая многоязычной виртуальной машиной , была проектом Sun Microsystems, целью которого было создание прототипа расширения виртуальной машины Java (JVM) для добавления поддержки динамических языков .
Уже было возможно запускать динамические языки поверх JVM, но цель состоит в том, чтобы упростить реализацию новых динамических языков и повысить их производительность. Этот проект был эталонная реализация в JSR 292 ( Поддержка динамически типизированных языков на платформе Java ). [1]
История [ править ]
До Java 7 виртуальная машина Java не имела встроенной поддержки языков с динамической типизацией :
- Существующий набор команд JVM является статически типизированным . [2]
- JVM имеет ограниченную поддержку динамического изменения существующих классов и методов. В настоящее время он работает только в среде отладки .
JSR 292 ( Поддержка динамически типизированных языков на платформе Java ) [1] предлагает:
- добавить новую
invokedynamic
инструкцию на уровне JVM, чтобы разрешить вызов метода, основанного на динамической проверке типа , [3] [4] [5] - чтобы иметь возможность динамически изменять классы и методы во время выполнения в производственной среде.
После успеха реализации JRuby Java в конце января 2008 г. был начат проект Da Vinci. [6] Возможности, с которыми экспериментировал Da Vinci, планировалось добавить в Java 7 . Он направлен на создание прототипа этого JSR, а также других расширений с более низким приоритетом. [7] Первый рабочий прототип, разработанный как патч для OpenJDK , был объявлен и стал доступен в конце августа 2008 года. [8] [9] [10]
С тех пор команда JRuby успешно внедрила динамический вызов в свою кодовую базу. Динамический вызов поставляется с выпуском 1.1.5 и будет отключен на JVM без invokedynamic
возможностей. [11]
С тех пор проект был интегрирован в кодовую базу JDK 7 [12], а затем интегрирован в выпуск Java 7 .
Архитектура [ править ]
Динамический вызов основан на том факте, что даже если Java является строго статическим языком на уровне языка, информация о типе гораздо менее распространена на уровне байт-кода .
Однако реализации динамических языков должны иметь возможность использовать своевременную компиляцию (а не отражение ) для достижения хорошей производительности и, таким образом, для компиляции сценариев в байт-код во время выполнения. [ необходима цитата ] Чтобы разрешить запуск виртуальной машины Java , эти байт-коды должны быть проверены перед выполнением, а верификатор должен проверить, что типы статичны во всем коде. Это приводит к реализации этой имеющей создать много различного байткода для различных контекстов вызова метода, каждый раз , когда подпись из аргументов изменения.
Это не только использует много памяти, но также заполняет область памяти, называемую Metaspace (постоянное создание до Java 8), часть кучи, используемой JVM для хранения информации о классах . Память, используемая в этой области, почти никогда не собирается сборщиком мусора, потому что в ней хранятся неизменяемые данные в контексте программ Java; и по этой причине реализации динамических языков могут компилировать только небольшую часть скриптов. [13]
JSR 292 предлагает:
- предоставить механизм, посредством которого существующий класс может быть загружен и изменен, создавая новый класс с этими изменениями, но разделяя остальную его структуру и данные, таким образом не заполняя пространство постоянного поколения ,
- предоставить новый
invokedynamic
байт-код, который позволяет JVM оптимизировать вызовы такого типа. [3]
См. Также [ править ]
- Сценарии для платформы Java
- Список языков JVM
- Dynamic Language Runtime - среда от Microsoft, которая обеспечивает поддержку динамических языков в .NET Framework Common Language Runtime.
- Nashorn (движок JavaScript) - основан на машине Да Винчи
Ссылки [ править ]
- ^ a b см. JSR 292
- ^ Наттер, Чарльз (2007-01-03). "InvokeDynamic: Действительно полезно?" . Проверено 6 февраля 2008 . CS1 maint: обескураженный параметр ( ссылка )
- ^ а б Эд Орт (июль 2009 г.). «Новая функция JDK 7: поддержка динамически типизированных языков в виртуальной машине Java» . Проверено 26 июля 2009 . CS1 maint: обескураженный параметр ( ссылка )
- ^ Джефф Фризен (2014-12-16). "Как вызвать динамику" . JavaWorld . Проверено 10 июня 2020 . CS1 maint: обескураженный параметр ( ссылка )
- ↑ Рафаэль Винтерхальтер (2 марта 2015 г.). «Разборка invokedynamic» . dzone.com . Проверено 10 июня 2020 . CS1 maint: обескураженный параметр ( ссылка )
- ^ Криль, Павел (2008-01-31). «Sun's Da Vinci Machine расширяет охват JVM» . Архивировано из оригинала на 2009-03-28 . Проверено 6 февраля 2008 . CS1 maint: обескураженный параметр ( ссылка )
- ^ «Суб-проекты и исследования» . Sun Microsystems . 2007 . Проверено 6 февраля 2008 . CS1 maint: обескураженный параметр ( ссылка )
- ^ Роуз, Джон (2008-08-26). «С Международным днем Invokedynamic!» . Архивировано из оригинала на 2008-09-03 . Проверено 3 сентября 2008 . CS1 maint: обескураженный параметр ( ссылка )
- ^ Роуз, Джон (2008-09-02). «С Международным днем Invokedynamic!» . Проверено 7 сентября 2008 . CS1 maint: обескураженный параметр ( ссылка )
- Перейти ↑ Lorimer, RJ (2008-09-01). «Динамический вызов выполняется в OpenJDK» . infoq.com . Проверено 3 сентября 2008 . CS1 maint: обескураженный параметр ( ссылка )
- ↑ Наттер, Чарльз (11 сентября 2008 г.). «Первый вкус InvokeDynamic» . Проверено 13 сентября 2008 .
Мне удалось успешно подключить InvokeDynamic непосредственно к процессу отправки JRuby!
Какой азарт!
Код уже находится в багажнике JRuby и будет поставляться с JRuby 1.1.5 (хотя он, очевидно, будет отключен на JVM без InvokeDynamic).
CS1 maint: обескураженный параметр ( ссылка )
- ^ Роза, Джон (2009-04-22). "прогресс: indy.patch -> JDK7" . Проверено 30 апреля 2009 .
Большая часть indy.patch вошла в виртуальную машину JDK7 в репозитории интеграции моей рабочей группы, сегодня, примерно в 4:00 утра по тихоокеанскому времени:
CS1 maint: обескураженный параметр ( ссылка )
- ↑ Наттер, Чарльз (11 сентября 2008 г.). «Первый вкус InvokeDynamic» . Проверено 6 февраля 2008 .
Грязный секрет нескольких реализаций JVM, включая Hotspot, заключается в том, что существует отдельная куча (или отдельное поколение кучи), используемая для специальных типов данных, таких как определения классов, метаданные класса, а иногда и байт-код или собственный код JITted.
И у него не могло быть более пугающего названия: «Постоянное поколение».
За исключением редких случаев, объекты, загруженные в PermGen, никогда не собираются сборщиком мусора (потому что они должны быть постоянными, понимаете?), И если не использовать очень и очень осторожно, он заполнится (...)
CS1 maint: обескураженный параметр ( ссылка )
Внешние ссылки [ править ]
- Страница проекта Da Vinci Machine
- Презентация Sun на симпозиуме Lang.NET
- Блог Джона Роуза (руководитель проекта)
- Презентационный документ JSR 292
- Презентационный документ JSR 292 ACM 2010 [ постоянная мертвая ссылка ]