Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

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

История [ править ]

Java virtual machine architecture.svg

До 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) - основан на машине Да Винчи

Ссылки [ править ]

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

Внешние ссылки [ править ]

  • Страница проекта Da Vinci Machine
  • Презентация Sun на симпозиуме Lang.NET
  • Блог Джона Роуза (руководитель проекта)
  • Презентационный документ JSR 292
  • Презентационный документ JSR 292 ACM 2010 [ постоянная мертвая ссылка ]