MS_DLR - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki
- 戻る(.NET開発)
動的言語の一連のサービスを共通言語ランタイム (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 ExpandoObject、JObject(Json.NET)型が実行時にしか分からない プラグイン、スクリプト連携 ただし、
- コンパイル時のチェックが効かない、
- リフレクションより速いが、静的呼び出しよりは遅い、
- Native AOT / トリミングと相性が悪い、
という制約があるため、
現在はSystem.Text.JsonのJsonElementや
ソース ジェネレーター(.NETコンパイラ)で
代替できないかを先に検討するのが定石である。
補足(3 つの「動的」の使い分け): 混同しやすいので整理する。
技術 何をするか 速度 Reflection 実行時に型を調べて呼ぶ 遅い(毎回検索) 式木 コードを木として組み立て、コンパイルして委譲にする 速い(初回のみコスト) Reflection.Emit IL を直接生成する 最速だが難しい DLR( dynamic)呼び出しサイトごとにキャッシュ 中間 「リフレクションが遅いので式木でキャッシュする」という高速化は
よく使われる技法で、
列挙型(Enum)の定義 の
「ToString() 高速化」もこの系統の話である。
-
動的言語ランタイムの概要
https://learn.microsoft.com/ja-jp/dotnet/framework/reflection-and-codedom/dynamic-language-runtime-overview -
(プログラミング C# - 翔ソフトウェア (Sho's))
- [C#][.NET] メタプログラミング入門 - 目次
http://blog.shos.info/archives/2013/11/csharp_metaprogramming_indexarticle.html - [C#][.NET] メタプログラミング入門 - 応用編
オブジェクトの文字列変換のメタプログラミング (パフォーマンスのテスト)
http://blog.shos.info/archives/2013/11/csharp_metaprogrammingpraxisperformance.html
- [C#][.NET] メタプログラミング入門 - 目次
Tags: 移行, プログラミング, .NET開発