Поделиться через


Обзор среды выполнения динамического языка

Среда выполнения динамических языков (DLR) — это среда выполнения, которая добавляет набор служб для динамических языков в среду CLR. DLR упрощает разработку динамических языков для запуска в .NET и добавления динамических функций в статически типизированные языки.

Динамические языки могут определять тип объекта во время выполнения, в то время как в статически типизированных языках, таких как C# и Visual Basic (при использовании Option Explicit On), необходимо указать типы объектов во время разработки. Примерами динамических языков являются Lisp, Smalltalk, JavaScript, PHP, Ruby, Python, ColdFusion, Lua, Cobra и Groovy.

Большинство динамических языков обеспечивают следующие преимущества для разработчиков:

  • Возможность использовать цикл быстрого отклика (REPL, или цикл чтение-оценка-печать). Это позволяет вводить несколько операторов и сразу же выполнять их, чтобы увидеть результаты.
  • Поддержка как разработки сверху вниз, так и более традиционной разработки снизу вверх. Например, при использовании подхода сверху вниз можно вызывать функции, которые еще не реализованы, а затем добавлять базовые реализации, когда они нужны.
  • Упрощение рефакторинга и изменения кода, так как вам не нужно изменять объявления статических типов во всем коде.

Динамические языки делают отличные языки сценариев. Клиенты могут легко расширить приложения, созданные с помощью динамических языков с новыми командами и функциями. Динамические языки также часто используются для создания веб-сайтов и тестовых средств, обслуживания ферм серверов, разработки различных служебных программ и выполнения преобразований данных.

Цель DLR – обеспечить работу системы динамических языков на платформе .NET и их совместимость с .NET. DLR добавляет динамические объекты в C# и Visual Basic для поддержки динамического поведения на этих языках и включения их взаимодействия с динамическими языками.

DLR также помогает создавать библиотеки, поддерживающие динамические операции. Например, если у вас есть библиотека, использующая объекты XML или JavaScript Object Notation (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.

См. также