2011-12-07 86 views
2

要使用DLR,應該將動態語言轉換爲表達式樹。當我執行使用動態語言開發的應用程序時發生了什麼。表達式樹的執行

例如hello world應用程序。在運行時執行表達式樹代碼會發生什麼。表達式樹與OS的通信實際上如何工作?

回答

2

表達式樹只是構建一系列IL指令的另一種方式。來自表達式樹的IL將被編譯爲原生硬件指令,就像從C#或IL編譯爲IL的其他源語言一樣。

+0

AFAIK,表達式樹是**沒有爲DLR編譯...?事實上,考慮到這些對象的動態特性,這看起來好像不能工作。 –

+0

你的意思是說,無論我寫在我的動態語言將轉換爲IL和JIT編譯在運行時? – Hukam

+0

我的理解是DLR,LINQ,C#和其他人使用表達式樹API作爲指定可執行邏輯比發送IL操作碼更簡單的方法。請參閱Microsoft文檔(http://msdn.microsoft.com/zh-cn/library/bb397951.aspx)若要使用表達式樹,請構造一系列節點,然後調用Expression.Compile()。這就是IL發射的地方,表達式變成JIT'able和可執行的地方。如果表達式樹只是解釋的數據圖,那麼C#lambda表達式的性能成本將是可怕的。 DLR可能使用表達式樹來即時重寫代碼。 – dthorpe

0

理解,其可以被限制(我不是專家DLR)是在使用表達式的情況下,表達式樹走了如MemberExpression節點,並且每個部件的名稱/方法/ etc被用來與每個對象的提供者進行交談。這可能意味着使用IDynamicMetaObjectProvider接口,傳入表達式。關鍵節點的表達式與LINQ提供者等技術非常相似,除了在許多方面更簡單(因爲有更直接的映射 - 不必用外部語言(如SQL)重新表達)。

動態對象的執行被確定由動態對象,但可以然後意味着從值的內部字典中查找的值(例如,ExpandoObject),或者可以是在所有任何東西(例如,DynamicObject的一些臨時小類,或者從第一主體IDynamicMetaObjectProvider實現)。

在這種情況下,一個類型不實現IDynamicMetaObjectProvider(即浮在一個動態的世界非動態對象),則典型地反射將被用作回退,緩存機制來做到這一點(可能的,因爲反射是不是動態的,不能被猴子修補等)。