Общие сведения о среде DLR
Среда DLR представляет собой среду выполнения, которая добавляет набор служб для динамических языков в среду CLR. Среда DLR упрощает разработку динамических языков, используемых в .NET Framework и добавляет динамические функции в языки со статической типизацией.
Динамические языки могут определить тип объекта во время выполнения, тогда как для языков со статической типизацией, например C# и Visual Basic (при использовании Option Explicit On), во время разработки следует указать типы объектов. Примерами динамических языков могут служить Lisp, Smalltalk, JavaScript, PHP, Ruby, Python, ColdFusion, Lua, Cobra и Groovy.
Большинство динамических языков предоставляют разработчикам следующие преимущества.
Возможность использования цикла быстрой обратной связи (REPL, или цикл "read-evaluate-print"). Он позволяет вводить несколько операторов и сразу же выполнять их для просмотра результатов.
Поддержка разработки "сверху вниз" и более традиционной — "снизу вверх". Например, при использовании метода "сверху вниз" можно вызвать все еще не реализованные функции, а затем добавить базовые реализации по мере необходимости.
Более простой рефакторинг и изменение кода, поскольку нет необходимости изменять объявления статических типов в коде.
Динамические языки позволяют создавать качественные скриптовые языки. Пользователи могут легко расширить приложения, созданные с использованием динамических языков, с помощью новых команд и функциональных возможностей. Динамические языки также часто используются для создания веб-сайтов и окружений тестов, обслуживания ферм серверов, разработки различных служебных программ и выполнения преобразования данных.
Назначение среды DLR — обеспечение работы систем динамических языков в .NET Framework и взаимодействия в .NET. Среда DLR предоставляет объекты для C# и Visual Basic в Visual Studio 2010 для поддержки динамического поведения в этих языках и обеспечения взаимодействия с динамическими языками.
Среда DLR также упрощает создание библиотек, поддерживающих динамические операции. Например, если имеется библиотека, использующая объекты XML или нотации объектов JavaScript (JSON), эти объекты могут отображаться в качестве динамических для языков, использующих среду DLR. Это позволяет пользователям библиотек создавать синтаксически более простой и более естественный код для работы с объектами и доступа к членам объектов.
Например, для увеличения значения счетчика в формате XML в C# можно использовать следующий код.
Scriptobj.SetProperty("Count", ((int)GetProperty("Count")) + 1);
Вместо него для этой же операции можно использовать следующий код С помощью среды DLR.
scriptobj.Count += 1;
Как и CLR, среда DLR является частью .NET Framework и поставляется в установочных пакетах .NET Framework и Visual Studio. Кроме того, по адресу CodePlex можно загрузить версию с открытым исходным кодом.
Примечание |
---|
Версия среды DLR с открытым исходным кодом обладает той же функциональностью, что и среда DLR, входящая в Visual Studio и .NET Framework.Она также обеспечивает дополнительную поддержку для разработчиков языков.Дополнительные сведения см. в документации по адресу CodePlex. |
Примеры языков, разработанных с помощью среды DLR, включают следующие.
IronPython. Программное обеспечение с открытым исходным кодом, которое можно загрузить по адресу CodePlex.
IronRuby. Программное обеспечение с открытым исходным кодом, которое можно загрузить по адресу RubyForge.
Основные преимущества среды DLR
Среда DLR обеспечивает следующие преимущества.
Упрощает перенос динамических языков в .NET Framework
Среда DLR позволяет разработчикам языков избежать создания лексических анализаторов, средств синтаксического анализа, семантических анализаторов, генераторов кода и других средств, которые обычно приходится создавать самостоятельно. Для использования среды DLR язык должен создать деревья выражений, которые представляют код на уровне языка в виде древовидной структуры, вспомогательные процедуры среды выполнения и необязательные динамические объекты, реализующие интерфейс IDynamicMetaObjectProvider. Среда DLR и .NET Framework автоматизируют значительное количество задач анализа и генерации кода. Это позволяет разработчикам языков сконцентрировать свои усилия на уникальных функциях языка.
Обеспечивает динамические функции в языках со статической типизацией
Существующие языки .NET Framework (C# и Visual Basic) могут создавать динамические объекты и использовать их совместно с объектами со статической типизацией. Например, в C# и Visual Basic могут использоваться динамические объекты для HTML, Document Object Model (DOM) и отражение .NET.
Обеспечивает будущие преимущества среды DLR и .NET Framework
Языки, реализованные с использованием среды DLR, могут быть улучшены в будущем за счет усовершенствований среды DLR и .NET Framework. Например, если .NET Framework выпускает новую версию с усовершенствованным сборщиком мусора или меньшим временем загрузки сборки, языки, реализованные с использованием среды DLR, сразу же получат те же преимущества. Если в среде DLR усовершенствуется оптимизация (например более эффективная компиляция), производительность повысится и для всех языков, реализованных с использованием среды DLR.
Обеспечивает общий доступ к библиотекам и объектам
Объекты и библиотеки, реализованные на одном языке, могут использоваться другими языками. Среда DLR также обеспечивает взаимодействие языков со статической и динамической типизацией. Например, в C# может быть объявлен динамический объект, использующий библиотеку, написанную на динамическом языке. Вместе с этим динамические языки могут использовать библиотеки из .NET Framework.
Обеспечивает быструю динамическую отправку и вызов
Среда DLR обеспечивает быстрое выполнение динамических операций за счет поддержки усовершенствованного полиморфного кэширования. Среда 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 Framework, но и с другими инфраструктурами и службами, включая Silverlight и COM. Связыватели инкапсулируют семантику языка и указывают способ выполнения операций в месте вызова с помощью деревьев выражений. Это обеспечивает для языков с динамической и статической типизацией, использующим среду DLR, совместный доступ к библиотекам и всем технологиям, поддерживаемым средой DLR.
DLR-документация
Дополнительные сведения о том, как с помощью версии среды DLR с открытым исходным кодом добавить динамические функции в язык или как обеспечить использование динамического языка в .NET Framework, см. в документации по адресу CodePlex.
См. также
Ссылки
Основные понятия
Деревья выражений (C# и Visual Basic)
Другие ресурсы
Пошаговое руководство. Создание и использование динамических объектов (C# и Visual Basic)