Есть ли эквивалент DLR (Dynamic Language Runtime для .NET) на JVM? Я знаю, что я мог бы заниматься и реализовывать свои собственные динамические привязки и выдавать собственный байт-код с Java. Но есть ли какая-либо предварительно построенная структура (например, DLR), поэтому мне не нужно повторно изобретать колесо?
Эквивалент DLR для JVM?
Ответ 1
DLR - это несколько разных вещей, некоторые из которых имеют прямые эквиваленты в Java, некоторые из которых существуют в разных формах, а некоторые из них не имеют эквивалента. Некоторые из тех, у которых есть эквивалент, уже являются частью платформы, некоторые из них будут частью Java 7, а некоторые из них доступны для третьих сторон.
Инфраструктура связывания и кэширования времени выполнения
DLR имеет инфраструктуру привязки и кэширования времени выполнения, что делает динамическую отправку быстрой и эффективной. Как сделать динамическую отправку так же быстро, как статическая отправка и намного быстрее, чем диспетчеризация виртуальных таблиц в стиле С++, известна уже более 20 лет, но большинство динамических механизмов выполнения не используют такие технологии, как полиморфное встроенное кэширование, вывод динамического типа, Тип Обратная связь Оптимизация и так далее. DLR пытается обеспечить единую реализацию, которая может использоваться всеми языками на основе DLR (включая связующее средство времени выполнения С#, используемое для ключевого слова dynamic
на С# 4).
эквивалент Java JSR-292, который расширяет JVM с помощью инфраструктуры привязки и кэширования времени выполнения. Основное различие между DLR и JSR-292 заключается в том, что JSR-292 реализован на уровне VM, а это означает, что для его использования вам нужна новая виртуальная машина. JSR-292 будет частью следующей спецификации JVM, которая, в свою очередь, будет частью спецификации платформы Java 7, но это все еще год или около того. (Он уже доступен, в текущем выпуске JDK7 Early Access, хотя и был довольно продолжительным.)
DLR, OTOH - это просто библиотека, и вы можете установить ее на CLR 2.0, если хотите. Действительно, вам даже не нужна CLR, любая VES, совместимая с CLI, например Novell Mono. И поскольку DLR является Open Source, Novell может просто загрузить исходный код с веб-сайта Microsoft и отправить его как часть Mono без написания кода... что именно они делают. Внедрение Sun JSR-292 также является открытым исходным кодом, но это не помогает IBM, Oracle, Apache, RedHat, GNU и т.д., Потому что это очень специфично для VM, поэтому каждый поставщик JVM должен реализовать его самостоятельно. (И их много, только у Sun есть четыре разных JVM.)
[Примечание: есть Rémi Forax JSR-292 backport, который реализует JSR-292 для более старых JVM с помощью перезаписи байтов. Он на 100% совместим, но довольно медленный.]
Протокол метаобъекта для взаимодействия
DLR содержит MOP (интерфейс IDynamicObject
), который позволяет всем языкам на основе DLR взаимодействовать друг с другом и с языками на основе CLI на гораздо более высоком уровне и с гораздо более тесной интеграцией, чем с необходимостью проходить через CTS.
В пространстве Java эквивалент - это Attila Szegedi (разработчик компилятора Rhino JavaScript для JVM) dynalang, который вдохновлен программой CommonLisp MOP. Тем не менее,
- не закончен,
- не используется (пока) и
- сторонняя библиотека, а не часть стандартной платформы.
Все три из них, вероятно, будут меняться когда-нибудь, но, по крайней мере, последнее, вероятно, не произойдет для Java 7.
Стандартизированный API встраивания
DLR предоставляет стандартизированный API встраивания для языков на основе DLR, который позволяет внедрять языковое исполнение в ваше приложение без необходимости изучения другого API для каждой другой среды выполнения. Действительно, вам даже не нужно знать, что такое время выполнения!
Эквивалентным этому является JSR-223 Java Scripting API, который был частью платформы Java начиная с Java 6 и живет в javax.script
package.
Представление и компилятор кода
DLR содержит стандартное представление для кода (деревья DLR, деревья выражений) и как интерпретатор, так и высокооптимизирующий компилятор для этих деревьев, что позволяет разработчикам langage сосредоточиться на своих языковых спецификациях компилятора и иметь дело DLR с nitty-gritty генерации кода за кулисами.
В Java нет эквивалента.
Динамические возможности для статических языков
С# 4 и VB.NET 10 добавляют динамическую типизацию для упрощения интеграции с динамическими языками. Хотя это не имеет ничего общего с DLR, он использует DLR для некоторых своих работ.
В Java нет эквивалента.
Ответ 2
Я не могу сказать, что я не отстаю от этих вещей в частности, но я считаю, что проект примерно эквивалентен DLR, Это несколько иной подход, поскольку он меняет набор команд байт-кода вместо того, чтобы просто быть библиотекой, сидящей поверх виртуальной машины, но проекты имеют одно и то же намерение: упростить создание динамических языков для соответствующих платформ.