Обзор среды выполнения динамического языка
Среда выполнения динамических языков (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.