Staticky zadané jazyky jsou ty, ve kterých byste museli určit typ objektu v době, kdy jej definujete. Mezi příklady staticky zadaných jazyků patří C #, VB a C ++. Naopak v dynamicky zadávaných jazycích je typ objektu určen za běhu - pouze v době, kdy je typu přiřazena hodnota. Python, Ruby a JavaScript jsou příklady dynamicky psaných jazyků.
DLR (Dynamic Language Runtime) běží nad CLR (Common Language Runtime) a přidává dynamiku do spravovaného prostředí .Net - můžete jej použít k implementaci dynamických funkcí ve vaší aplikaci. DLR v podstatě umožňuje interoperabilitu mezi staticky a dynamicky typovanými jazyky v kontextu CLR. DLR můžete použít ke sdílení knihoven a objektů s dynamickými jazyky. V tomto článku bych představil přehled prostředí Dynamic Language Runtime v Microsoft .Net.
Open-source verzi DLR můžete získat od Codeplex.
Co je DLR?
DLR je výsledkem snahy společnosti Microsoft mít služby spuštěné nad CLR a poskytovat interoperabilitu mezi staticky a dynamicky psanými jazyky. Podporu prostředí Dynamic Language Runtime usnadňuje obor názvů System.Dynamic. MSDN uvádí: "Dynamický jazyk runtime (DLR) je prostředí runtime, které přidává sadu služeb pro dynamické jazyky do modulu CLR (Common Language Runtime). Díky DLR je snazší vyvíjet dynamické jazyky pro běh v .Net Framework a přidat dynamické funkce do staticky zadaných jazyků. “
Jak je to užitečné?
Služby poskytované DLR zahrnují podporu pro systém dynamického typu, standardní model hostování a také generování a odesílání dynamického kódu. Mezi výhody, které poskytuje DLR, patří:
- Poskytuje podporu pro dynamické funkce ve staticky zadaných jazycích. Díky DLR na místě můžete vytvářet objekty s dynamickým typem a používat je společně se svými staticky zadanými objekty v aplikaci.
- Umožňuje bezproblémové portování dynamických jazyků do .Net Framework. DLR umožňuje snadno přenášet dynamické jazyky do .Net Framework. Chcete-li využít funkce DLR, vše, co musí váš dynamický jazyk mít, je schopnost vytvářet stromy výrazů a pomocné rutiny za běhu.
- Usnadňuje sdílení knihoven a objektů. DLR umožňuje vytvářet objekty a knihovny v jednom jazyce pro přístup z jiného jazyka.
- Poskytuje podporu pro odesílání a vyvolání dynamických metod. DLR poskytuje podporu pro vyvolání a odeslání dynamické metody pomocí pokročilého polymorfního ukládání do mezipaměti.
Subsystém Dynamic Language Runtime
Subsystém DLR se v zásadě skládá ze tří vrstev. Patří mezi ně následující:
- Stromy výrazů - DLR využívá stromy výrazů k reprezentaci jazykové sémantiky.
- Ukládání do mezipaměti volání - volání metod pomocí dynamických objektů se ukládají do mezipaměti, takže DLR může použít historii mezipaměti pro následná volání stejné metody pro rychlejší odeslání.
- Interoperabilita dynamických objektů - DLR umožňuje interoperabilitu mezi staticky a dynamicky psanými jazyky. DLR obsahuje kolekci typů - tříd a rozhraní v oboru názvů System.Dynamic. Rozhraní IDynamicMetaObjectProvider a třídy DynamicMetaObject, DynamicObject a ExpandoObject můžete využít k vytváření dynamických rozhraní.
Pořadače jazyků
Vazače jazyků v DLR mu pomáhají mluvit s jinými jazyky. Takže pro každý dynamický jazyk byste obvykle měli pořadač, který s ním může komunikovat. Jako příklad uvádíme běžně používaná pojiva v DLR.
- .Net Binder - používá se ke komunikaci s objekty .Net
- Pořadač JavaScriptu - používá se pro komunikaci s objekty vytvořenými v objektech JavaScriptu
- IronRuby Binder - umožňuje DLR mluvit s objekty IronRuby
- IronPython Binder - pomáhá DLR mluvit s objekty IronPython
- COM Binder - pomáhá DLR mluvit s objekty COM
„Dynamické“ klíčové slovo
Pro přístup k dynamickému objektu můžete využít dynamické klíčové slovo. Dynamické klíčové slovo bylo poprvé představeno v .Net Framework 4. Umožňuje vaší aplikaci spolupracovat s dynamickými typy. Můžete tedy použít klíčové slovo dynamic pro přístup k objektu COM nebo k objektu vytvořenému v dynamických jazycích, jako je Python, Ruby nebo JavaScript.
Zde je fragment kódu, který ilustruje, jak lze použít dynamické klíčové slovo.
pomocí System.Dynamic;
dynamic excelObj = System.Runtime.InteropServices.Marshal.GetActiveObject ("Excel.Application");
Už nemusíme používat reflexi pro přístup k objektům COM - váš kód je mnohem čistý bez reflexního kódu, který byste jinak museli psát bez dynamického klíčového slova.
Doporučené hodnoty
//msdn.microsoft.com/en-us/library/dd233052(v=vs.110).aspx