.Netでの動的言語ランタイムの調査

静的に型付けされた言語は、オブジェクトを定義するときにオブジェクトの型を指定する必要がある言語です。静的に型指定された言語の例には、C#、VB、およびC ++が含まれます。逆に、動的に型指定された言語では、オブジェクトの型は実行時に決定されます。つまり、値が型に割り当てられたときにのみ決定されます。Python、Ruby、JavaScriptは、動的に型指定された言語の例です。

DLR(動的言語ランタイム)はCLR(共通言語ランタイム)上で実行され、.Netの管理環境にダイナミズムを追加します。これを使用してアプリケーションに動的機能を実装できます。本質的に、DLRは、CLRのコンテキスト内で、静的に型付けされた言語と動的に型付けされた言語の間の相互運用性を可能にします。DLRを使用して、ライブラリとオブジェクトを動的言語と共有できます。この記事では、Microsoft.Netの動的言語ランタイム環境の概要を説明します。

DLRのオープンソースバージョンはCodeplexから入手できます。

DLRとは何ですか?

DLRは、サービスをCLR上で実行し、静的および動的に型指定された言語間の相互運用性を提供するというMicrosoftの取り組みの成果です。動的言語ランタイム環境のサポートは、System.Dynamic名前空間によって促進されます。MSDNは次のように述べています。「動的言語ランタイム(DLR)は、動的言語の一連のサービスを共通言語ランタイム(CLR)に追加するランタイム環境です。DLRを使用すると、.Netフレームワークで実行する動的言語の開発が容易になります。静的に型付けされた言語に動的機能を追加します。」

それはどのように役立ちますか?

DLRが提供するサービスには、動的型システム、標準ホスティングモデル、および動的コード生成とディスパッチのサポートが含まれます。一見すると、DLRによって提供される利点は次のとおりです。

  1. 静的に型付けされた言語の動的機能のサポートを提供します。DLRを配置すると、動的に型指定されたオブジェクトを作成し、それらをアプリケーションで静的に型指定されたオブジェクトと一緒に使用できます。
  2. 動的言語の.NetFrameworkへのシームレスな移植を可能にします。DLRを使用すると、動的言語を.NetFrameworkに簡単に移植できます。DLR機能を活用するために必要なのは、式ツリーとランタイムヘルパールーチンを生成する機能だけです。
  3. ライブラリとオブジェクトの共有を容易にします。DLRを使用すると、ある言語でオブジェクトとライブラリを作成して、別の言語からアクセスできるようになります。
  4. 動的メソッドのディスパッチと呼び出しをサポートします。DLRは、高度なポリモーフィックキャッシングを使用した動的メソッドの呼び出しとディスパッチのサポートを提供します。

動的言語ランタイムサブシステム

DLRサブシステムは、基本的に3つのレイヤーで構成されています。これらには次のものが含まれます。

  1. 式ツリー-DLRは、式ツリーを使用して言語セマンティクスを表します。
  2. 呼び出しサイトのキャッシュ-動的オブジェクトを使用するメソッド呼び出しはメモリにキャッシュされるため、DLRはキャッシュ履歴を使用して、同じメソッドへの後続の呼び出しを実行し、ディスパッチを高速化できます。
  3. 動的オブジェクトの相互運用性-DLRは、静的および動的に型指定された言語間の相互運用性を可能にします。DLRには、タイプのコレクション(System.Dynamic名前空間のクラスとインターフェイス)が含まれています。IDynamicMetaObjectProviderインターフェイスとDynamicMetaObject、DynamicObject、およびExpandoObjectクラスを活用して、動的フレームワークを作成できます。

言語バインダー

DLRの言語バインダーは、他の言語との会話に役立ちます。したがって、動的言語ごとに、通常、それと相互作用できるバインダーがあります。例として、DLRで一般的に使用されるバインダーを以下に示します。

  • .Netバインダー-これは.Netオブジェクトと通信するために使用されます
  • JavaScriptバインダー-これは、JavaScriptオブジェクトで作成されたオブジェクトと通信するために使用されます
  • IronRubyバインダー-DLRがIronRubyオブジェクトと通信できるようにします
  • IronPythonバインダー-DLRがIronPythonオブジェクトと通信するのに役立ちます
  • COMバインダー-これは、DLRがCOMオブジェクトと通信するのに役立ちます

「動的」キーワード

dynamicキーワードを利用して、動的オブジェクトにアクセスできます。dynamicキーワードは、.Net Framework 4で最初に導入されました。これにより、アプリケーションは動的型と相互運用できます。したがって、dynamicキーワードを使用して、COMオブジェクト、またはPython、Ruby、JavaScriptなどの動的言語で作成されたオブジェクトにアクセスできます。

これは、動的キーワードの使用方法を示すコードスニペットです。

System.Dynamicを使用します。

動的excelObj = System.Runtime.InteropServices.Marshal.GetActiveObject( "Excel.Application");

COMオブジェクトにアクセスするためにリフレクションを使用する必要がなくなりました。動的キーワードを使用せずに記述しなければならなかったリフレクションコードがなければ、コードは非常にクリーンになります。

推奨読書

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