動的言語ランタイムの概要
動的言語ランタイム (DLR) は、共通言語ランタイム (CLR) に動的言語の一連のサービスを追加するランタイム環境です。 DLR を使用すると、.NET 上で実行する動的言語を開発し、静的に型指定された言語に動的機能を追加することが容易になります。
動的言語は実行時にオブジェクトの型を識別できますが、C# や Visual Basic などの静的に型指定された言語 (Option Explicit On
を使用する場合) では、デザイン時にオブジェクトの種類を指定する必要があります。 動的言語の例としては、Lisp、Smalltalk、JavaScript、PHP、Ruby、Python、ColdFusion、Lua、Cobra、および Packagingy があります。
ほとんどの動的言語は、開発者にとって次の利点を提供します。
- 迅速なフィードバックループ(REPL または 読み取り-評価-出力ループ)を使用する能力。 これにより、複数のステートメントを入力し、すぐに実行して結果を表示できます。
- トップダウン開発と従来のボトムアップ開発の両方をサポートします。 たとえば、トップダウン アプローチを使用する場合は、まだ実装されていない関数を呼び出し、必要に応じて基になる実装を追加できます。
- コード全体で静的な型宣言を変更する必要がないため、リファクタリングとコードの変更が容易になります。
動的言語は、優れたスクリプト言語を作成します。 お客様は、新しいコマンドと機能で動的言語を使用して作成されたアプリケーションを簡単に拡張できます。 動的言語は、Web サイトとテスト ハーネスの作成、サーバー ファームの保守、さまざまなユーティリティの開発、データ変換の実行にも頻繁に使用されます。
DLR の目的は、動的言語のシステムを .NET 上で実行し、.NET の相互運用性を提供できるようにすることです。 DLR は、これらの言語での動的な動作をサポートし、動的言語との相互運用を有効にするために、C# と Visual Basic に動的オブジェクトを追加します。
DLR は、動的操作をサポートするライブラリの作成にも役立ちます。 たとえば、XML または JavaScript Object Notation (JSON) オブジェクトを使用するライブラリがある場合、オブジェクトは DLR を使用する言語に対して動的オブジェクトとして表示できます。 これにより、ライブラリ ユーザーは、オブジェクトを操作したり、オブジェクト メンバーにアクセスしたりするための構文的にシンプルで自然なコードを記述できます。
たとえば、次のコードを使用して、C# の XML でカウンターをインクリメントできます。
Scriptobj.SetProperty("Count", ((int)GetProperty("Count")) + 1);
DLR を使用すると、同じ操作に代わりに次のコードを使用できます。
scriptobj.Count += 1;
CLR と同様に、DLR は .NET の一部です。 GitHub の IronLanguages/dlr リポジトリでダウンロードできます。
IronPython は、DLR を使用して開発された言語の例です。
プライマリ DLR の利点
DLR には、次の利点があります。
.NET への動的言語の移植を簡略化
DLR を使用すると、言語実装者は、構文アナライザー、パーサー、セマンティック アナライザー、コード ジェネレーター、および従来独自に作成する必要があったその他のツールの作成を回避できます。 DLR を使用するには、言語で 式ツリーを生成する必要があります。これは、ツリー型構造の言語レベルのコード、ランタイム ヘルパー ルーチン、および IDynamicMetaObjectProvider インターフェイスを実装するオプションの動的オブジェクトを表します。 DLR と .NET により、多くのコード分析とコード生成タスクが自動化されます。 これにより、言語実装者は固有の言語機能に集中できます。
静的に型指定された言語で動的機能を有効にする
C# や Visual Basic などの既存の .NET 言語では、動的オブジェクトを作成し、静的に型指定されたオブジェクトと共に使用できます。 たとえば、C# と Visual Basic では、HTML、ドキュメント オブジェクト モデル (DOM)、リフレクションに動的オブジェクトを使用できます。
DLR と .NET の将来の利点を提供します
DLR を使用して実装された言語は、将来の DLR と .NET の機能強化の恩恵を受けることができます。 たとえば、ガベージ コレクターが改善された、またはアセンブリの読み込み時間が短縮された新しいバージョンを .NET がリリースした場合、DLR を使用して実装された言語はすぐに同じ利点を得られます。 DLR によってコンパイルの改善などの最適化が追加された場合、DLR を使用して実装されるすべての言語のパフォーマンスも向上します。
ライブラリとオブジェクトの共有を有効にします
1 つの言語で実装されたオブジェクトとライブラリは、他の言語で使用できます。 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 で動的言語の使用を有効にする方法の詳細については、GitHub の IronLanguages/dlr リポジトリのドキュメントを参照してください。
関連項目
.NET