Подтвердить что ты не робот

Эквивалент DLR для JVM?

Есть ли эквивалент DLR (Dynamic Language Runtime для .NET) на JVM? Я знаю, что я мог бы заниматься и реализовывать свои собственные динамические привязки и выдавать собственный байт-код с Java. Но есть ли какая-либо предварительно построенная структура (например, DLR), поэтому мне не нужно повторно изобретать колесо?

4b9b3361

Ответ 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, Это несколько иной подход, поскольку он меняет набор команд байт-кода вместо того, чтобы просто быть библиотекой, сидящей поверх виртуальной машины, но проекты имеют одно и то же намерение: упростить создание динамических языков для соответствующих платформ.