3 C# 4與動(dòng)態(tài)語(yǔ)言的集成
由于幾乎所有的編程語(yǔ)言都可以使用抽象語(yǔ)法樹來(lái)表達(dá),因此,在理論上DLR支持無(wú)限多種編程語(yǔ)言間的互操作,在當(dāng)前版本中,可以實(shí)現(xiàn)C#/Visual Basic與IronPython和IronRuby的互操作,相信很快會(huì)出現(xiàn)其他動(dòng)態(tài)編程語(yǔ)言的DLR實(shí)現(xiàn)。
一個(gè)有趣的地方是當(dāng)前基于DLR實(shí)現(xiàn)的動(dòng)態(tài)編程語(yǔ)言都以“Iron”開頭,比如IronRuby和IronPython。IronPython的設(shè)計(jì)者、DLR的架構(gòu)設(shè)計(jì)師Jim Hugunin曾經(jīng)在微軟PDC 2008大會(huì)上解釋說(shuō)主要是為了避免起一個(gè)“Python.NET”或“Python for .NET”之類“微軟味十足”的名字,才有了“IronPython”。他強(qiáng)調(diào):“Iron”系列動(dòng)態(tài)語(yǔ)言將嚴(yán)格遵循動(dòng)態(tài)語(yǔ)言自身的標(biāo)準(zhǔn)和規(guī)范,尊重這些動(dòng)態(tài)語(yǔ)言已有的歷史和積累,不會(huì)引入一些僅限于.NET平臺(tái)的新語(yǔ)言特性,并且這些語(yǔ)言的.NET實(shí)現(xiàn)保持開源。與此同時(shí),Jim Hugunin指出 “Iron”系列語(yǔ)言能很好地與.NET現(xiàn)有類庫(kù)、編程語(yǔ)言和工具集成,并且能“嵌入”到.NET宿主程序中。
(1)動(dòng)態(tài)對(duì)象通訊協(xié)議
由于各種動(dòng)態(tài)編程語(yǔ)言之間的特性相差極大,實(shí)現(xiàn)各語(yǔ)言間的互操作是個(gè)難題。為此DLR采取了一個(gè)聰明的策略,它不去嘗試設(shè)計(jì)一個(gè)“通用的類型系統(tǒng)”(CLR就是這么干的),而是設(shè)計(jì)了一個(gè)“通用的對(duì)象通訊協(xié)議”,規(guī)定所有需要互操作的動(dòng)態(tài)對(duì)象必須實(shí)現(xiàn)IDynamicMetaObjectProvider接口,此接口定義了一個(gè)GetMetaObject()方法,接收一個(gè)語(yǔ)法樹對(duì)象作為參數(shù),向外界返回一個(gè)“動(dòng)態(tài)元數(shù)據(jù)(DynamicMetaObject)”對(duì)象:
DynamicMetaObject GetMetaObject(Expression parameter);
DynamicMetaObject對(duì)象向外界提供了兩個(gè)重要屬性:Restrictions引用一組測(cè)試條件,Expression屬性則引用一個(gè)語(yǔ)法樹。這兩個(gè)屬性組合起來(lái)就是可供動(dòng)態(tài)站點(diǎn)對(duì)象緩存的“規(guī)則(Rule)”。
DLR中的“動(dòng)態(tài)站點(diǎn)綁定對(duì)象(CallSiteBinder)”獲取了DynamicMetaObject對(duì)象之后,它調(diào)用此對(duì)象所提供的各個(gè)方法創(chuàng)建“規(guī)則”,讓“動(dòng)態(tài)站點(diǎn)對(duì)象(CallSite<T>)”的Target屬性引用它,完成動(dòng)態(tài)綁定的工作。
(2)動(dòng)態(tài)語(yǔ)言集成環(huán)境
為了方便地實(shí)現(xiàn)靜態(tài)編程語(yǔ)言與各種動(dòng)態(tài)編程語(yǔ)言間的相互集成,DLR提供了一整套稱為“通用寄宿(Common Hosting)”的組件,其中包容ScriptRuntime、ScriptScope等類型。
下面我們以IronPython為例,介紹如何在C# 4開發(fā)的程序中集成動(dòng)態(tài)編程語(yǔ)言代碼。
首先需要?jiǎng)?chuàng)建一個(gè)ScriptRuntime對(duì)象,它是一個(gè)最頂層的對(duì)象,用于在一個(gè).NET應(yīng)用程序域中“嵌入”一個(gè)特定動(dòng)態(tài)語(yǔ)言的運(yùn)行環(huán)境:
ScriptRuntime pythonRuntime = Python.CreateRuntime();
接著需要?jiǎng)?chuàng)建一個(gè)ScriptEngine對(duì)象,它是動(dòng)態(tài)語(yǔ)言代碼的執(zhí)行引擎:
ScriptEngine engine = pythonRuntime.GetEngine("py");
ScriptScope對(duì)象類似于C#中的命名空間,其中可以通過(guò)定義一些變量向動(dòng)態(tài)代碼傳入數(shù)據(jù),比如下述代碼將一個(gè)C# 創(chuàng)建的ExpandoObject對(duì)象傳給Python代碼:
ScriptScope scope = pythonRuntime.CreateScope(); //C#創(chuàng)建動(dòng)態(tài)對(duì)象 dynamic expando = new ExpandoObject(); expando.Name = "JinXuLiang"; //動(dòng)態(tài)添加一個(gè)字段 //讓IronPython接收C#創(chuàng)建的Expando對(duì)象 scope.SetVariable("ExpandoObject", expando); string pythonCode = "print ExpandoObject.Name"; //IronPython引擎執(zhí)行Python語(yǔ)句 engine.CreateScriptSourceFromString(pythonCode).Execute(scope);
上述示例代碼是直接執(zhí)行Python代碼。在實(shí)際開發(fā)中,更常見的是直接執(zhí)行Python文件中的代碼,假設(shè)有一個(gè)Calculator.py文件,其中定義了一個(gè)Add函數(shù):
def Add(a,b): return a+b
則以下C#代碼可以直接執(zhí)行之:
ScriptRuntime pythonRuntime = Python.CreateRuntime(); dynamic pythonFile = pythonRuntime.UseFile("Calculator.py"); Console.WriteLine(pythonFile.Add(100, 200));
上述示例說(shuō)明在DLR的支持之下,可以讓靜態(tài)編程語(yǔ)言使用動(dòng)態(tài)語(yǔ)言所開發(fā)的庫(kù),反過(guò)來(lái),基于DLR實(shí)現(xiàn)的動(dòng)態(tài)編程語(yǔ)言也能使用為靜態(tài)語(yǔ)言所設(shè)計(jì)的庫(kù),比如標(biāo)準(zhǔn)的.NET基類庫(kù)。
這意味著兩點(diǎn):
(1)我們現(xiàn)在可以將“靜態(tài)”和“動(dòng)態(tài)”編程語(yǔ)言組合起來(lái),開發(fā)出一些具有高度交互性的應(yīng)用程序,使用靜態(tài)編程語(yǔ)言搭建系統(tǒng)框架,使用動(dòng)態(tài)編程語(yǔ)言實(shí)現(xiàn)交互性,這是一個(gè)很值得注意的應(yīng)用領(lǐng)域。
(2)將來(lái)會(huì)出現(xiàn)一些“靜態(tài)”“動(dòng)態(tài)”編程語(yǔ)言同時(shí)適用的庫(kù),向?qū)崿F(xiàn)“無(wú)所不在的復(fù)用”目標(biāo)又前進(jìn)了一步。
Visual Studio 2010為新的.NET編程語(yǔ)言F#提供了專門的項(xiàng)目模板,但沒有為IronPython和IronRuby之類動(dòng)態(tài)語(yǔ)言的開發(fā)提供支持,相信隨著動(dòng)態(tài)語(yǔ)言在.NET平臺(tái)之上的應(yīng)用日趨廣泛,后繼版本的Visual Studio會(huì)直接支持動(dòng)態(tài)語(yǔ)言的開發(fā)。
從C# 1.0~4.0所走過(guò)的路,可以很清晰地看到它的發(fā)展軌跡,得到這樣的一個(gè)結(jié)論:
未來(lái)的編程語(yǔ)言應(yīng)該是多范式的,具有高度的可組合性,在一個(gè)項(xiàng)目或產(chǎn)品中組合多個(gè)編程語(yǔ)言、使用多種編程范式會(huì)變得越來(lái)越普遍。我們可以推斷C#的后繼版本將會(huì)在此條道路上越走越遠(yuǎn)……
原文:http://blog.csdn.net/bitfan/archive/2010/08/18/5821083.aspx
本文鏈接:http://m.95time.cn/tech/program/2010/7921.asp
出處:CSDN
責(zé)任編輯:bluehearts
上一頁(yè) 拓展動(dòng)態(tài)編程的新領(lǐng)域 [4] 下一頁(yè)
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|