MS_DLR - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki

動的言語ランタイム (DLR)

概要

動的言語の一連のサービスを共通言語ランタイム (CLR) に追加するランタイム環境

補足(CLR と DLR の関係): .NET は静的型付けを前提に設計されており、
メソッド呼び出しはコンパイル時に解決される。
DLR は、その上に実行時に解決する層を足したものである。

【CLR】  コンパイル時に型とメソッドが決まる(静的ディスパッチ)
           ↑ 速い。型安全

【DLR】  実行時に決める(動的ディスパッチ)
           ↑ Python / Ruby のような言語を .NET に載せられる
           ↑ C# の dynamic キーワードもここを使う

C# の dynamic は DLR の上に実装されており、
呼び出しのたびに解決するのではなく
呼び出しサイト キャッシュで 2 回目以降を高速化する、
という仕組みを持つ(後述の「迅速な動的ディスパッチ」)。

詳細

利点

  • 動的言語の .NET への移植を簡略化
  • 移植された動的言語が .NET の将来的な利点を活用可能
  • 静的に型指定された言語での動的機能を使用が可能
  • ライブラリとオブジェクトの言語間での共有が可能
  • 迅速な動的ディスパッチと呼び出しの実現

補足(現在の位置づけ): DLR が想定していた
IronPython / IronRuby は、いずれも Microsoft の手を離れて
コミュニティ主導になっており、勢いは大きくない。

一方、dynamic キーワード自体は現在も有効で、
次のような場面で使われる。

用途
COM 相互運用 Excel / Word の操作(型情報が煩雑なため)
動的な JSON ExpandoObjectJObject(Json.NET)
型が実行時にしか分からない プラグイン、スクリプト連携

ただし、

  • コンパイル時のチェックが効かない
  • リフレクションより速いが、静的呼び出しよりは遅い
  • Native AOT / トリミングと相性が悪い

という制約があるため、
現在は System.Text.JsonJsonElement
ソース ジェネレーター.NETコンパイラ)で
代替できないかを先に検討するのが定石である。

関連

補足(3 つの「動的」の使い分け): 混同しやすいので整理する。

技術 何をするか 速度
Reflection 実行時に型を調べて呼ぶ 遅い(毎回検索)
式木 コードを木として組み立て、コンパイルして委譲にする 速い(初回のみコスト)
Reflection.Emit IL を直接生成する 最速だが難しい
DLR(dynamic 呼び出しサイトごとにキャッシュ 中間

「リフレクションが遅いので式木でキャッシュする」という高速化は
よく使われる技法で、
列挙型(Enum)の定義
「ToString() 高速化」もこの系統の話である。

参考


Tags: 移行, プログラミング, .NET開発

⚠️ **GitHub.com Fallback** ⚠️