摘要:隨著因特網的普及與發(fā)展,嵌入式軟件得到更多的應用,近年來關于軟件自適應的研究也成為熱點。從程序設計的角度分析軟件的發(fā)展,現(xiàn)在正處于適應性程序設計(Adaptive Programming)時期,該文主要從反射技術的角度分析適應性軟件的前景。
關鍵詞:反射技術;軟件適應性;自適應
Reflection and Software-adaptive
YANG Hui-bo
(Naning Imtitute of Politics, Nanjing 210003, China)
Abstract: With the popularity of the Internet and development of embedded software to get more applications, in recent years, adaptive research on software has become a hot spot. From the programming point of view of the development of software, is now in the adaptive programming design (Adaptive Programming) period, this mainly reflected adaptive software technology point of view of the future.
Key words: reflection; software adaptive; self-Adaptability
1 反射技術概覽
相對來說,反射技術的歷史并不短。20世紀70年代末,Lisp用解釋程序反射其它的特定的解釋程序的語義,這是反射技術的首次出現(xiàn)。80年代初,Smalltalk通過修改編譯器修改語言的語義和控制消息傳遞,將反射概念集成到元類(meta classes)中。然后經過10多年的試驗。80年代后期,CLOS(the Common Lisp Object System)[1]成為第一個開發(fā)了完整的元模型協(xié)議(meta-object protocol,簡稱MOP)的面向對象語言,這個元模型協(xié)議允許修改基于元對象的語言的關鍵特征。
近來,反射技術以其明確分離描述系統(tǒng)自身結構、行為的信息與系統(tǒng)所處理的信息,建立可動態(tài)操縱的因果關聯(lián)以動態(tài)調整系統(tǒng)行為的良好特征,已經從理論和技術研究走向實用化,使得動態(tài)獲取和調整系統(tǒng)行為具備了堅實的基礎。例如,Java的反射機制,具有反射結構的設計模式,以及各種反射式中間件等。
計算反射(computational reflection)[2]是在程序的自身執(zhí)行過程中,程序像數(shù)據(jù)一樣表示程序狀態(tài)的一種處理能力。這種處理包括兩個方面,即自省(introspection)和調解(intercessory)。自省是程序觀察并根據(jù)觀察推導自身狀態(tài)的能力。調解是程序修改自身的執(zhí)行狀態(tài),或改變它的解釋以及改變內涵的能力。通常將計算反射簡稱為反射(reflection)。
通常將反射分為結構反射(Structural Reflection)和行為反射(Behavior Reflection)。結構反射一般指系統(tǒng)的結構能夠動態(tài)的改變,比如給對象增加一個屬性,Introspection可以認為是結構反射的一種;行為反射指動態(tài)的改變系統(tǒng)的語義,比如AOP實際上改變了一個對象方法的語義。換一種方法,又可以分為編譯時反射和運行時反射。
從反射的定義可以知,一個反射系統(tǒng)應當具有自我表示的能力(稱為自身表示,self-representation)。自身表示使該系統(tǒng)能夠回答關于其自身的問題,并支持作用于自身的動作。同時也應該具有系統(tǒng)的因果關聯(lián)(causal connection)能力,因果關聯(lián)是指目標計算的狀態(tài)可以激發(fā)一些作用于系統(tǒng)自身的動作,而系統(tǒng)自身的改變也可以影響日標的當前狀態(tài)與以后的行為。
要實現(xiàn)這樣的目標,反射系統(tǒng)至少分為兩個層次:1)元層(meta level),也稱非功能層。該層次提供系統(tǒng)內部相關的信息,包括類型結構和方法調用機制等。在這一層里面實現(xiàn)對基層結構和行為的觀察與操作。2)基本層 (base level),也稱功能層、應用層。在這一層里面實現(xiàn)應用功能。這一層構建于元層之上,外部系統(tǒng)可以通過元層次提供的信息和操縱方法來動態(tài)改變這一層的行為。
2 程序設計語言的反射機制
自省和調解都需要一種機制,對作為數(shù)據(jù)的執(zhí)行狀態(tài)編碼。提供這種編碼被稱為具體化(reification)。使用反射編程,可以使軟件在運行時通過自省運行需求,使用具體化能力自己調解自己(通俗地說,就是運行時自動修改程序),動態(tài)獲得新的行為能力,即程序可以反省自己,把自己當成數(shù)據(jù),可以自己修改自己。具有反射能力的語言或應用系統(tǒng),能夠把對軟件部分功能的定義延緩到運行時確定,也就是讓最終用戶定制應用程序,這種特性使程序具有了某種生命,使軟件的自我演化成為可能。
所以,語言的反射機制是實現(xiàn)軟件系統(tǒng)反射機制的一個重要基礎,是軟件適應性的基礎。
3 具有反射結構的設計模式
設計模式(Design pattern)[3]設計模式使人們可以更加簡單方便地復用成功的設計和體系結構。將已證實的技術表述成設計模式也會使新系統(tǒng)開發(fā)者更加容易理解其設計思路。設計模式幫助你做出有利于系統(tǒng)復用的選擇,避免設計損害了系統(tǒng)復用性。通過提供一個顯式類和對象作用關系以及它們之間潛在聯(lián)系的說明規(guī)范,設計模式甚至能夠提高已有系統(tǒng)的文檔管理和系統(tǒng)維護的有效性。簡而言之,設計模式可以幫助設計者更快更好地完成系統(tǒng)設計。
所以,按照合適的、好的設計模式設計出的軟件,具有較好的開發(fā)部署適應性。為了支持軟件的動態(tài)適應性,通常系統(tǒng)中需要引入反射機制。如何在設計模式中引入反射結構,從而在設計模式層面上支持反射機制的引入,這方面的研究不多,但這并不是件很難的事。下面以在Visitor模式中引入反射機制為例,說明具有反射結構的設計模式。
Visitor模式有如下優(yōu)點:1)Visitor模式使得增加新的操作變得很容易。如果一些操作依賴于一個復雜的結構對象的話,那么一般而言,增加新的操作會很復雜。而使用訪問者模式,增加新的操作就意味著增加一個新的訪問者類,因此,變得很容易。2)Visitor模式將有關的行為集中到一個訪問者對象中,而不是分散到一個個的節(jié)點類中。3)Visitor模式可以跨過幾個類的等級結構訪問屬于不同的等級結構的成員類。迭代子只能訪問屬于同一個類型等級結構的成員對象,而不能訪問屬于不同等級結構的對象。Visitor模式可以做到這一點。4)Visitor模式可以積累狀態(tài)。每一個單獨的訪問者對象都集中了相關的行為,從而也就可以在訪問的過程中將執(zhí)行操作的狀態(tài)積累在自己內部,而不是分散到很多的節(jié)點對象中。這是有益于系統(tǒng)維護的優(yōu)點。
但是,Visitor模式也存在如下一些缺點:1)增加新的節(jié)點類變得很困難。每增加一個新的節(jié)點都意味著要在抽象訪問者角色中增加一個新的抽象操作,并在每一個具體訪問者類中增加相應的具體操作。2)破壞封裝。Visitor模式要求訪問者對象訪問并調用每一個節(jié)點對象的操作,這隱含了一個對所有節(jié)點對象的要求:它們必須暴露一些自己的操作和內部狀態(tài)。不然,訪問者的訪問就變得沒有意義。由于訪問者對象自己會積累訪問操作所需的狀態(tài),從而使這些狀態(tài)不再存儲在節(jié)點對象中,這也是破壞封裝的。
從反射技術特點中我們看到,如果將反射技術用于Visitor模式,不但可以保留Visitor模式的優(yōu)點,還可以很好地克服它的缺點,即我們可以很方便地利用反射機制動態(tài)添加新的節(jié)點類,并且反射機制可以讓訪問者對象方便地獲得節(jié)點對象的操作,而不破壞節(jié)點對象的封裝。
圖1是增加了反射機制的Visitor模式。
4 反射式中間件
反射中間件(Reflective Middleware)[4],是一種實現(xiàn)了反射機制的中間件系統(tǒng)。同一般的中間件相比,其本質區(qū)別就在于是否在中間件系統(tǒng)中采取反射機制。通過實現(xiàn)反射機制,反射中間件可以克服傳統(tǒng)中間件系統(tǒng)的單一性和不靈活性,從而可以更好的支持新的應用領域。具體說,反射中間件是指在中間件系統(tǒng)工程中采用反射機制,以達到開放性、可配置性(Configurability)和可重配置性(Reconfigurability)要求的體系結構。簡單的說,反射中間件是指,通過適當?shù)囊蚬嗦?lián)的自表示,能夠檢測和調整系統(tǒng)的行為的中間件系統(tǒng)。
由于,反射式中間件具有這些特點,從自適應角度看,關于反射式中間件的研究為自適應的實現(xiàn)提供了非常好的運行平臺。例如,OpenCorba 是一種基于反射式語言NeoClasstalk 的反射式CORBA,通過元類將ORB 內部特征分離并單獨實現(xiàn),從而允許系統(tǒng)在運行過程中監(jiān)測并調整這些內部功能單元,如,監(jiān)視遠程對象調用的行為,在服務器進行類型檢查等[5]。dynamicTAO 是實時ORB 軟件TAO 擴展,其反射能力體現(xiàn)在對系統(tǒng)服務的配置與重配置,即,通過配置管理器將特定的策略(如安全策略、調度策略等)及其實現(xiàn)機制關聯(lián)起來。
5 結論
反射技術強調系統(tǒng)的自省和調解,通過元層來實現(xiàn)對基礎層的控制,從而實現(xiàn)系統(tǒng)的適應性。反射機制的實現(xiàn)可以在不同層面。語言層面的反射是最基本的、粒度最細的;設計模式層面和結構層面的反射具有一定的通用性和復用性;反射式中間件為設計自適應軟件提供了平臺。
參考文獻:
[1] Gabriel R P,White J L,Bobrow D G.CLOS:integrating object-oriented and functional programming[J].Communications of the ACM,1991,34(9):29-38.
[2] Maes P.Concepts and experiments in computational reflection[C].OOPSLA'87,Sigplan Notices,1987:4-8.
[3] GoF.設計模式-可服用的面向對象軟件的基礎[M].北京:機械工業(yè)出版社,2005.
[4] Roman M,Kon F,Cambell R.Reflective Middleware:From Your Desk to Your Hand[M].UIUC Software Research Group,2006.
[5] Ledoux T.OpenCorba:A Reflective Open Broker.In:Cointe,P.ed.the 2nd International Conference on Reflection,LNCS 1616[M].Heidelberg:Springer-Verlag,1999:197-214.