Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Среда выполнения динамических языков (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.