В чем разница между CLR и DLR в С#?

В чем разница между CLR и DLR в С#? эти две концепции сопоставимы?

Ответы

Ответ 1

Common Language Runtime (CLR) - это основной набор услуг, предлагаемых .NET - система типов, JIT, сборщик мусора и т.д. Они доступны для всех языков .NET, следовательно, являются "общей" частью.

Dynamic Language Runtime (DLR) строит поверх этого и предлагает услуги для динамических языков: динамические типы, динамическую отправку методов, генерацию кода, & гр. Идея состоит в том, чтобы сделать эти вещи одинаковыми и поделиться ими среди динамических языков, чтобы они работали предсказуемо и схожими, так же как и вещи в среде CLR на всех языках.

В некотором роде они сопоставимы, "нормальный" язык на .NET использует CLR, динамический язык должен использовать DLR, но также будет использовать CLR. Они являются базовыми наборами функциональных возможностей, которые дизайнеры считают хорошими, когда они распространены на разных языках. IronPython и IronRuby были реализованы поверх DLR, а также функция С# 4 dynamic.

Ответ 2

Я просто добавлю простую диаграмму, чтобы продемонстрировать эту точку:

    "*** Runtime & Libraries ***"    │ "*** Languages ***"
┌────────────────────────────────────┤
│ .NET Libraries                     │
│   ┌────────────────────────────────┼──────────────────┐
│   │ Dynamic Language Runtime (DLR) │ C# 4.0 'dynamic' ├────┐
├───┴────────────────────────────────┼──────────────────┘    │
│ Common Language Runtime (CLR)      │   C# 1.0, 2.0, 3.0    │
└────────────────────────────────────┴───────────────────────┘

Ответ 4

Просто добавив немного ясности к уже предоставленным отличным ответам.

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

  • Независимость аппаратного обеспечения 2. Общая система типов 3. Интеграция языков

CLR

. DL DL была создана Джим Хьюгунин и была

Динамическое языковое исполнение (DLR) - среда выполнения, которая добавляет набор сервисов для динамических языков в общую среду выполнения CLR). DLR упрощает разработку динамических языков для работы на платформе .NET Framework и добавление динамических функций к статически типизированным языкам.
Динамические языки могут идентифицировать тип объекта во время выполнения, тогда как в статически типизированных языках, таких как С# и Visual Basic (при использовании Option Explicit On) вы должны указывать типы объектов во время разработки. Примерами динамических языков являются Lisp, Smalltalk, JavaScript, PHP, Ruby, Python, ColdFusion, Lua, Cobra и Groovy.

Архитектура DLR
DLR

DLR добавляет набор сервисов в CLR для лучшей поддержки динамических языков. Эти услуги включают следующее: Деревья выражений. DLR использует деревья выражений для представления семантики языка. С этой целью DLR расширяет деревья выражений LINQ, чтобы включить поток управления, назначение и другие узлы моделирования языка. Дополнительные сведения см. В разделе Деревья выражений (С# и Visual Basic). Вызовите сайт кэширования. Динамический сайт вызова - это место в коде, где вы выполняете операцию типа a + b или a.b() для динамических объектов. DLR кэширует характеристики a и b (обычно типы этих объектов) и информацию об операции. Если такая операция была выполнена ранее, DLR извлекает всю необходимую информацию из кеша для быстрой отправки. Динамическая совместимость объектов. DLR предоставляет набор классов и интерфейсов, которые представляют динамические объекты и операции и могут использоваться разработчиками языка и авторами динамических библиотек. Эти классы и интерфейсы включают IDynamicMetaObjectProvider, DynamicMetaObject, DynamicObject и ExpandoObject. DLR использует связующие объекты на сайтах-узлах для связи не только с .NET Framework, но и с другими инфраструктурами и службами, включая Silverlight и COM. Связующие инкапсулируют семантику языка и определяют, как выполнять операции на сайте вызова, используя деревья выражений. Это позволяет использовать динамические и статически типизированные языки, которые используют DLR для обмена библиотеками и получения доступа ко всем технологиям, поддерживаемым DLR.

Примеры

dynamic d = "test";  
Console.WriteLine(d.GetType());  
// Prints "System.String".  

d = 100;  
Console.WriteLine(d.GetType());  
// Prints "System.Int32".    

dynamic d = "test";  

// The following line throws an exception at run time.  
d++;