Dynamic Language Runtime ( DLR ) от Microsoft работает поверх Common Language Runtime (CLR) и предоставляет услуги компьютерного языка для динамических языков . Эти услуги включают:
DLR используется для реализации динамических языков на платформе .NET Framework , включая проекты IronPython и IronRuby .
Поскольку реализации динамического языка имеют общую базовую систему, им должно быть проще взаимодействовать друг с другом. Например, должно быть возможно использовать библиотеки из любого динамического языка в любом другом динамическом языке. Кроме того, API хостинга обеспечивает взаимодействие со статически типизированными языками CLI , такими как C# и Visual Basic .NET .
Проект Dynamic Language Runtime от Microsoft был анонсирован компанией Microsoft на выставке MIX 2007. [2] [3]
Microsoft выпустила .NET DLR 0.9 beta в ноябре 2008 года, [4] а финальную версию 0.9 — в декабре 2008 года. Версия 1.0 была выпущена в апреле 2010 года. В июле 2010 года Microsoft изменила лицензию DLR с Microsoft Public License на Apache License 2.0 . [5] С выпуском .NET 4 , также в апреле 2010 года, DLR была включена в саму .NET Framework. [6]
Проект DLR с открытым исходным кодом, размещенный на GitHub, имеет несколько дополнительных функций для разработчиков языка. После релиза в июле 2010 года в течение нескольких лет в проекте наблюдалась низкая активность. Это было интерпретировано разработчиком Microsoft, работавшим над IronRuby, как отсутствие приверженности Microsoft динамическим языкам в .NET Framework. [7] [8] Однако с 2016/17 года наблюдалась регулярная активность, что привело к ряду улучшений и обновлений.
В 2007 году Microsoft изначально планировала использовать DLR для будущих Visual Basic 2010 (VB 10.0) и Managed JScript ( ECMAScript 3.0), а также Python и Ruby. [2] [9] [10] [11] [12]
Работа DLR над Ruby и Python привела к появлению IronRuby , .NET-реализации языка Ruby , и IronPython . [2]
К августу 2009 года Microsoft объявила, что больше не планирует внедрять Managed JScript в DLR. [13] Позднее Фредрик Хольмстрём независимо разработал реализацию JavaScript для DLR, которую он назвал «IronJS» в соответствии с традицией наименования IronPython и IronRuby.
Как и C# , Visual Basic может получать доступ к объектам из динамических языков, построенных на DLR, таких как IronPython и IronRuby . [14] [15]
PowerShell 3.0, выпущенный в Windows 8 , был обновлен для использования DLR. [16]
IronScheme , реализация Scheme , [17] планировала строить на основе DLR. Эта идея была заброшена, поскольку ветвь DLR , используемая проектом, перестала синхронизироваться с trunk , а также потому, что (по словам координатора проекта) текущая версия DLR на тот момент не могла поддерживать большинство требований Scheme. [18]
Dynamic Language Runtime построен на идее, что можно реализовать языковые особенности поверх универсального абстрактного синтаксического дерева , не зависящего от языка , узлы которого соответствуют определенной функциональности, общей для многих динамических языков. [19] Эта архитектура подкреплена идеей, что количество элементарных языковых конструкций, которые должны быть реализованы в универсальном стеке, должно быть изначально ограничено. [20] DLR динамически генерирует код, соответствующий функциональности, выраженной этими узлами. Компилятор для любого динамического языка, реализованного поверх DLR, должен генерировать абстрактные деревья DLR и передавать их библиотекам DLR.
DLR предоставляет динамически обновляемые DynamicSite
объекты, которые кэшируют задачу привязки методов к объектам. Поскольку тип объекта, а также содержащиеся в нем элементы, в динамических языках может изменяться в течение жизненного цикла программы, вызов метода должен проверять список методов, чтобы убедиться, что вызов является допустимым. DynamicSite
объекты представляют и кэшируют состояние объекта и его методов; любое обновление объекта DynamicSite
также отражается в объектах. DLR направляет все вызовы методов через DynamicSite
объекты, которые затем выполняют быстрый поиск и связывание метода с фактической реализацией. [21]
В отличие от других разработок, таких как виртуальная машина Parrot (без зависимостей) или Da Vinci Machine (построенная на Java JVM путем добавления новых байт-кодов в набор инструкций JVM ), DLR построена поверх существующей среды выполнения Common Language Runtime , виртуальной машины .NET Framework . [22]
В краткосрочной перспективе мы сосредоточимся на использовании небольшого количества языков для управления первой волной разработки DLR, где мы сможем тесно и лицом к лицу работать с разработчиками, чтобы сгладить самые худшие изъяны в дизайне DLR. После этой начальной фазы мы хотим обратиться к более широкому языковому сообществу.
У нас на самом деле нет такого документа, но общая цель — выпустить IronPython 2.0 к концу года. Для самого DLR план состоит в том, чтобы выпустить v1.0 примерно в то же время, что и IronPython 2.0.
Год назад команда сократилась вдвое, и наша гибкость была серьезно ограничена. [..] В целом, я вижу серьезную нехватку приверженности IronRuby и динамическим языкам в .NET в целом.
Без окончательного толчка к тому, чтобы языки работали в Visual Studio и интегрировались с дизайнером, оба языка Iron, вероятно, мертвы, и Microsoft, похоже, утратила волю сделать их успешными.
С новым DLR у нас есть поддержка IronPython, IronRuby, Javascript и новой динамической компиляции VBx
VB 10 использует функцию Silverlight, называемую Dynamic Language Runtime или DLR
DLR JScript был экспериментальным для информирования о дизайне DLR (деревья выражений, взаимодействие, сайты вызовов, хостинг и т. д.). JS, который мы выпустили с asp futures и Silverlight dynamic sdk, стал очень старым и непригодным для использования, поскольку DLR продолжал развиваться для выпуска в CLR 4.0. К сожалению, в настоящее время нет планов по разработке и выпуску JScript, размещаемого в DLR.
Visual Basic привязывается к объектам из динамических языков, таких как IronPython и IronRuby
К сожалению, моя ветка DLR сильно рассинхронизирована с веткой Silverlight. Я просто подумал об этом, возможно, мне не нужен DLR perse, буду изучать. Проблема в том, что DLR как таковой недостаточно хорош для поддержки большинства требований Схемы
Ключевой трюк реализации в DLR заключается в использовании таких деревьев для передачи кода в качестве данных и для сохранения кода в легко анализируемой и изменяемой форме как можно дольше.
Идея заключается в том, что существует быстро сглаживающаяся асимптотическая кривая для числа узлов дерева выражений, необходимых для реализации каждого нового языка. Так ли это, еще предстоит выяснить.
Интересно отметить различия между расширениями CLR и JVM. Они работают полностью выше уровня CLR, не улучшая его существенно, в то время как мы разрабатываем JVM и библиотеки одновременно.