Изучение среды выполнения динамического языка в .Net

Статически типизированные языки - это языки, в которых вам нужно будет указать тип объекта во время его определения. Примеры статически типизированных языков включают C #, VB и C ++. Напротив, в динамически типизированных языках тип объекта определяется во время выполнения - только в то время, когда значение присваивается типу. Python, Ruby и JavaScript являются примерами языков с динамической типизацией.

DLR (Dynamic Language Runtime) работает поверх CLR (Common Language Runtime) и добавляет динамизма управляемой среде .Net - вы можете использовать ее для реализации динамических функций в вашем приложении. По сути, DLR обеспечивает возможность взаимодействия между статически типизированными и динамически типизированными языками в контексте CLR. Вы можете использовать DLR для обмена библиотеками и объектами с динамическими языками. В этой статье я представлю обзор среды выполнения динамического языка в Microsoft .Net.

Вы можете получить версию DLR с открытым исходным кодом от Codeplex.

Что такое DLR?

DLR - это результат усилий Microsoft по запуску сервисов поверх CLR и обеспечению взаимодействия между языками со статической и динамической типизацией. Поддержка среды выполнения динамического языка обеспечивается пространством имен System.Dynamic. В MSDN говорится: «Среда выполнения динамического языка (DLR) - это среда выполнения, которая добавляет набор служб для динамических языков в среду CLR. DLR упрощает разработку динамических языков для работы на платформе .Net Framework. и добавить динамические функции к языкам со статической типизацией ".

Чем это полезно?

Услуги, предоставляемые DLR, включают поддержку системы динамического типа, стандартной модели хостинга, а также генерации и отправки динамического кода. Вкратце преимущества DLR включают:

  1. Обеспечивает поддержку динамических функций на языках со статической типизацией. Имея DLR, вы можете создавать динамически типизированные объекты и использовать их вместе со своими статически типизированными объектами в вашем приложении.
  2. Обеспечивает беспрепятственный перенос динамических языков в .Net Framework. DLR позволяет легко переносить динамические языки в .NET Framework. Чтобы использовать возможности DLR, все, что нужно вашему динамическому языку, - это способность создавать деревья выражений и вспомогательные подпрограммы времени выполнения.
  3. Облегчает совместное использование библиотек и объектов. DLR позволяет создавать объекты и библиотеки на одном языке для доступа с другого языка.
  4. Обеспечивает поддержку отправки и вызова динамических методов. DLR обеспечивает поддержку вызова и отправки динамических методов с использованием расширенного полиморфного кэширования.

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

Подсистема DLR в основном состоит из трех уровней. К ним относятся следующие:

  1. Деревья выражений - DLR использует деревья выражений для представления семантики языка.
  2. Кэширование сайта вызовов - вызовы методов с использованием динамических объектов кэшируются в памяти, так что DLR может использовать историю кеширования для последующих вызовов того же метода для более быстрой отправки.
  3. Взаимодействие с динамическими объектами - DLR обеспечивает взаимодействие между языками со статической и динамической типизацией. DLR включает в себя набор типов - классов и интерфейсов в пространстве имен System.Dynamic. Вы можете использовать интерфейс IDynamicMetaObjectProvider и классы DynamicMetaObject, DynamicObject и ExpandoObject для создания динамических платформ.

Языковые связки

Языковые привязки в DLR помогают ему разговаривать с другими языками. Итак, для каждого динамического языка у вас обычно есть связыватель, который может с ним взаимодействовать. В качестве примера ниже приведены обычно используемые связующие в DLR.

  • .Net Binder - используется для общения с объектами .Net
  • JavaScript Binder - используется для взаимодействия с объектами, созданными в объектах JavaScript.
  • IronRuby Binder - позволяет DLR взаимодействовать с объектами IronRuby.
  • IronPython Binder - помогает DLR взаимодействовать с объектами IronPython.
  • COM Binder - помогает DLR взаимодействовать с COM-объектами.

Ключевое слово "динамическое"

Вы можете воспользоваться ключевым словом dynamic для доступа к динамическому объекту. Ключевое слово dynamic впервые было введено в .Net Framework 4. Оно позволяет вашему приложению взаимодействовать с динамическими типами. Таким образом, вы можете использовать ключевое слово dynamic для доступа к COM-объекту или объекту, созданному на динамических языках, таких как Python, Ruby или JavaScript.

Вот фрагмент кода, который показывает, как можно использовать ключевое слово dynamic.

с помощью System.Dynamic;

динамический excelObj = System.Runtime.InteropServices.Marshal.GetActiveObject ("Excel.Application");

Нам больше не нужно использовать отражение для доступа к COM-объектам - ваш код очень чистый без кода отражения, который в противном случае вам пришлось бы писать без ключевого слова dynamic.

Предлагаемые чтения

//msdn.microsoft.com/en-us/library/dd233052(v=vs.110).aspx