Общие сведения о среде DLR
Среда DLR представляет собой среду выполнения, которая добавляет набор служб для динамических языков в среду CLR. DLR упрощает разработку динамических языков для запуска в .NET и добавления динамических функций в статически типизированные языки.
Динамические языки могут определять тип объекта во время выполнения, в то время как в статически типизированных языках, таких как C# и Visual Basic (при использовании Option Explicit On
), необходимо указать типы объектов во время разработки. Примерами динамических языков могут служить Lisp, Smalltalk, JavaScript, PHP, Ruby, Python, ColdFusion, Lua, Cobra и Groovy.
Большинство динамических языков предоставляют разработчикам указанные ниже преимущества.
- Возможность использования цикла быстрой обратной связи (REPL или цикл "read-eval-print"). Он позволяет вводить несколько операторов и сразу же выполнять их для просмотра результатов.
- Поддержка разработки "сверху вниз" и более традиционной — "снизу вверх". Например, при использовании подхода сверху вниз можно вызывать функции, которые еще не реализованы, а затем добавлять базовые реализации, когда они нужны.
- Упрощение рефакторинга и изменения кода, так как вам не нужно изменять объявления статических типов во всем коде.
Динамические языки позволяют создавать качественные скриптовые языки. Пользователи могут легко расширить приложения, созданные с использованием динамических языков, с помощью новых команд и функциональных возможностей. Динамические языки также часто используются для создания веб-сайтов и тестовых средств, обслуживания ферм серверов, разработки различных служебных программ и выполнения преобразований данных.
Целью DLR является включение системы динамических языков для запуска в .NET и обеспечения взаимодействия .NET. Среда DLR добавляет динамические объекты в C# и Visual Basic для поддержки динамического поведения в этих языках и реализации взаимодействия с динамическими языками.
Среда DLR также упрощает создание библиотек, поддерживающих динамические операции. Например, если имеется библиотека, использующая объекты XML или нотации объектов JavaScript (JSON), эти объекты могут являться динамическими для языков, использующих среду DLR. Это позволяет пользователям библиотек создавать синтаксически более простой и более естественный код для работы с объектами и для доступа к членам объектов.
Например, для увеличения значения счетчика в формате XML в C# можно использовать приведенный ниже код.
Scriptobj.SetProperty("Count", ((int)GetProperty("Count")) + 1);
Вместо него для этой же операции можно использовать приведенный ниже код в среде DLR.
scriptobj.Count += 1;
Как и среда CLR, DLR является частью .NET. Он доступен для скачивания в репозитории IronLanguages/dlr на GitHub.
IronPython — это пример языка, разработанного с помощью DLR.
Основные преимущества DLR
Среда DLR предоставляет следующие преимущества.
Упрощение переноса динамических языков в .NET
Среда DLR позволяет разработчикам языков избежать создания лексических анализаторов, средств синтаксического анализа, семантических анализаторов, генераторов кода и других средств, которые обычно приходится создавать самостоятельно. Для использования среды DLR язык должен создать деревья выражений, которые представляют код на уровне языка в виде древовидной структуры, вспомогательные процедуры среды выполнения и необязательные динамические объекты, реализующие интерфейс IDynamicMetaObjectProvider. DLR и .NET автоматизируйте множество задач анализа кода и создания кода. Это позволяет разработчикам языков сконцентрировать свои усилия на уникальных функциях языка.
Включает динамические функции на статически типизированных языках
Существующие языки .NET, такие как C# и Visual Basic, могут создавать динамические объекты и использовать их вместе со статически типизированными объектами. Например, C# и Visual Basic могут использовать динамические объекты для HTML, объектной модели документа (DOM) и отражения.
Предоставляет будущие преимущества DLR и .NET
Языки, реализованные с помощью DLR, могут воспользоваться будущими улучшениями DLR и .NET. Например, если .NET выпускает новую версию с улучшенным сборщиком мусора или более быстрым временем загрузки сборки, языки, реализованные с помощью DLR, немедленно получают то же преимущество. Если в среде DLR усовершенствуется оптимизация (например, повысится эффективность компиляции), производительность повысится и для всех языков, реализованных с использованием среды DLR.
Обеспечивает общий доступ к библиотекам и объектам
Объекты и библиотеки, реализованные на одном языке, могут использоваться другими языками. Среда DLR также обеспечивает взаимодействие языков со статической и динамической типизацией. Например, в C# может быть объявлен динамический объект, использующий библиотеку, написанную на динамическом языке. Вместе с этим динамические языки могут использовать библиотеки из .NET Framework.
Обеспечивает быструю динамическую отправку и вызов
Среда DLR обеспечивает быстрое выполнение динамических операций за счет поддержки усовершенствованного полиморфного кэширования. Среда DLR создает правила для операций привязки, использующих объекты для необходимых реализаций среды выполнения, а затем кэширует эти правила, чтобы избежать ресурсоемких вычислений привязок во время последовательного выполнения того же кода с теми же типами объектов.
Архитектура среды DLR
Среда DLR добавляет в среду CLR ряд служб для лучшей поддержки динамических языков. В число этих служб входят следующие:
Деревья выражений. Среда DLR использует деревья выражений для представления семантики языка. С этой целью в среде DLR имеются расширенные деревья выражений LINQ, включающие в себя поток управления, назначение и другие узлы моделирования языков. Дополнительные сведения см. в разделах Деревья выражений (C#) или Деревья выражений (Visual Basic).
Кэширование места вызова. Динамическое место вызова — это часть кода, в которой выполняется такая операция с динамическими объектами, как
a + b
илиa.b()
. Среда DLR кэширует характеристикиa
иb
(как правило, типы этих объектов) и сведения об операции. Если такая операция выполнялась ранее, среда DLR извлекает всю необходимую информацию из кэша для быстрой отправки.Взаимодействие динамических объектов. Среда DLR предоставляет набор классов и интерфейсов, которые представляют динамические объекты и операции и могут использоваться разработчиками языков и динамических библиотек. Эти классы и интерфейсы включают IDynamicMetaObjectProvider, DynamicMetaObject, DynamicObject и ExpandoObject.
DLR использует привязыватели на сайтах вызовов, чтобы взаимодействовать не только с .NET, но и с другими инфраструктурами и службами, такими как COM. Модули привязки инкапсулируют семантику языка и указывают способ выполнения операций в месте вызова с помощью деревьев выражений. Это обеспечивает для языков с динамической и статической типизацией, использующих среду DLR, совместный доступ к библиотекам и всем технологиям, поддерживаемым средой DLR.
Документация по DLR
Дополнительные сведения об использовании открытый код версии DLR для добавления динамического поведения на язык или о том, как включить использование динамического языка с .NET, см. в документации по репозиторию IronLanguages/dlr на сайте GitHub.
См. также
- ExpandoObject
- DynamicObject
- Среда CLR
- Деревья выражений (C#)
- Expression Trees (Visual Basic) (Деревья выражений (Visual Basic))
- Пошаговое руководство. Создание и использование динамических объектов