在今後的數月和數年內動態語言將成為NET平台上越來越重要的角色微軟在動態語言和CLR之間的集成作了大量的投資
在我們進入集成工作之前需要花點時間來討論一下開源在NET平台上最重要的動態語言是IronPython和IronRuby這兩種語言都采用的是開源協議它們並不按照正常的計劃修改語言所有由微軟支持的開源語言都有兩個發布周期針對開源項目會有發布前/發布的通常計劃這會有許多的展示版本與此同時還會有正式的微軟首選的進行過深入測試的版本公司和開發人員可以選擇任一種發布方式的版本它們都是基於同樣的代碼
至於集成都是圍繞著IDynamicObject接口這種方法作為一個方法綁定器以允許每個對象使用的這些語言的語義開箱即用的語言包括IronPythonIronRubyJScript和COM是的COM被認為是後期綁定和動態方法調用方面的一門動態語言
在特定的語言綁定器之外開發人員可以在單一的類上使用特別規則最簡單的方法是從使用抽象類DynamicObject開始下面是可以被重寫自定義行為的動作清單你看這個清單的時候你會發現你所使用的語言的語法並不支持某些動作
GetMember
SetMember
DeleteMember
UnaryOperation
BinaryOperation
Convert
InvokeMember
Invoke
CreateInstance
GetIndex
SetIndex
DeleteIndex
開發人員並不需要實現所有的這些方法例如它們可以只通過支持SetMember和GetMember來創建一個屬性包正是這樣設計的方式一個真正動態的類可以用任何語言來編寫甚至是像C#那樣靜態類型的語言
IronPython在最初是有它自己語言特定的語言抽象語法樹在DLR的開發過程中發現在不同語言之間的差異事實上是很小的最後確定LINQ表達式樹(LINQ Expression)是任何動態語言所需要的東西
將在NET 上增加所缺少的特性是分配流程控制(循環和goto)以及動態調度節點動態調度節點是語言特定和用於方法調用和重載決策的特定於語言的規則
特定於語言語義的一個示例是乘以億的結果如果表達式樹表達IronRuby或者IronPython的語義它將返回億使用C#的默認語義將會溢出以及VB的語義將拋出一個異常也許想知道為什麼IronRuby和IronPython在可能發生溢出的時候會自動轉換Int到BigInteger
為了提高性能DLR使用一種新的call site機制DLR中的Call sites是動態調用基於委托的靜態類型化的表示由於創建委托的開銷是很大的委托被緩存到一個列表中對於每一個調用從列表中找到一個匹配的如果看到一個之前沒見過的類型一個新的基於共享抽象語法樹的類型被添加到列表中
要確定一個參數類型是否看到過每個語言需要提供一個MetaObject這用於檢查參數類型是否與過去所見過的類型匹配以及如果類型匹配的話如何處理
創建新的MetaObject的能力允許開發人員替換掉昂貴的基於哈希表的名稱而去查找代表了被調用的方法的實際表達式樹這取決於它是如何編寫的甚至可以超過靜態語言世界中所看到的性能
From:http://tw.wingwit.com/Article/program/net/201311/15446.html