C#のCLRとDLRの違いは何ですか?これらの2つの概念は比較可能ですか?
共通言語ランタイム(CLR)は、.NETによって提供されるサービスのコアセットです。型システム、JIT、ガベージコレクターなどです。これらはすべての.NET言語で使用できるため、「共通」の部分です。
動的言語ランタイム(DLR) はこの上に構築され、動的言語のサービスを提供します:動的型、動的メソッドディスパッチ、コード生成など。アイデアは、それらを均一にし、動的言語間で共有して、CLR上のものがすべての言語にまたがるのと同じように、予測可能かつ類似して機能するようにすることです。
これらに匹敵する方法で、.NETの「通常の」言語はCLRを使用し、動的言語はDLRを使用する必要がありますが、CLRも使用します。これらは、言語間で共通している場合に設計者が優れていると見なした基本的な機能セットです。 IronPythonとIronRubyは、C#4のdynamic
機能と同様に、DLRの上に実装されました。
ポイントを示すために、簡単な図を追加します。
"*** Runtime & Libraries ***" │ "*** Languages ***"
┌────────────────────────────────────┤
│ .NET Libraries │
│ ┌────────────────────────────────┼──────────────────┐
│ │ Dynamic Language Runtime (DLR) │ C# 4.0 'dynamic' ├────┐
├───┴────────────────────────────────┼──────────────────┘ │
│ Common Language Runtime (CLR) │ C# 1.0, 2.0, 3.0 │
└────────────────────────────────────┴───────────────────────┘
すでに与えられた優れた答えに少し明快さを加えるだけです。
最初にCLRです。これは、ユーザーコードと物理ハードウェアの間に位置する抽象化レイヤーです。いくつかの利点があります。
.Net DLRは Jim Hugunin によって作成され、
動的言語ランタイム( [〜#〜] dlr [〜#〜] )は、動的言語用の一連のサービスを共通言語ランタイム(CLR)に追加するランタイム環境です。 DLRを使用すると、.NET Frameworkで実行する動的言語の開発や、静的に型指定された言語への動的機能の追加が容易になります。
動的言語は実行時にオブジェクトのタイプを識別できますが、C#やVisual Basicなどの静的に型付けされた言語(Option Explicit Onを使用する場合)では、設計時にオブジェクトタイプを指定する必要があります。動的言語の例としては、LISP、Smalltalk、JavaScript、PHP、Ruby、Python、ColdFusion、Lua、Cobra、Groovyがあります。
DLRは、動的言語をより適切にサポートするために、CLRに一連のサービスを追加します。これらのサービスには、次のものが含まれます。式ツリー。 DLRは、式ツリーを使用して言語セマンティクスを表します。この目的のために、DLRはLINQ式ツリーを拡張して、制御フロー、割り当て、およびその他の言語モデリングノードを含めました。詳細については、式ツリー(C#および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++;
DLRはCLR上で実行されます。 DLRでは、C#dynamic
変数やその他の動的言語機能を使用できます。