楊 曦,李 彤
1.福州大學 陽光學院,福州 350015 2.云南大學 軟件學院,昆明 650091
動態增量式AOP框架的研究與實現
楊 曦1,李 彤2
1.福州大學 陽光學院,福州 350015 2.云南大學 軟件學院,昆明 650091
軟件是對現實世界問題空間與解空間的具體描述,是客觀事物的一種反映,是人類思維的外化產物[1]。由于人類思維的多樣性和易變性,導致軟件也在不停地“運動”、“變化”。尤其互聯網成為主流計算環境之后,軟件變化性、復雜性更是進一步增強,導致軟件工業的危機頻頻發生。鑒于此,人們紛紛從不同視角對軟件理論、技術和方法進行研究(例如從軟件形態方面提出了網構軟件[2]的概念;從網絡資源整合角度,提出了網格計算、普適計算、云計算等;從計算模式方面,提出了自治計算[3]、自適應軟件、SOA等)??v觀所有這些新的概念、思想和理論,都牽涉到一個共同的問題:開放計算環境下軟件系統的動態演化理論和應用研究。而開放計算環境下軟件系統的動態演化[4]理論和應用的研究尚處于起步階段,相關研究成果在理論基礎(例如對條件超圖文法[6]等的研究缺少堅實的理論基礎)、覆蓋面(例如Gilgul只能解決有限的軟件動態演化問題,Walter Czaaola提出的反射元模型[7]僅支持預設的演化)、實現難易度(例如反射技術、動態指派技術、K-Commponent[8]等都有較大的實現難度)等方面都存在著不足。另一方面,關注點分離的思想在解決軟件危機方面起到了至關重要的作用。而AOP(Aspect-Oriented Programming,面向方面的編程)對橫貫多個功能模塊的非功能性維度(橫切關注點)能進行有效封裝,實現了多維度的關注點分離,是OOP方法的合理補充。但如何提高編織效率也是AOP面臨的重要挑戰。本文在基于C++的面向方面的編程框架中引入Bigraph圖論[9]的動態演化思想,解決了系統演化行為一致性和相容性的問題,同時使用增量式編織機制實現了方面的高效編織,某種程度上對AOP技術和動態演化的發展有著重要的促進作用。
多年來,許多研究人員都致力于研究新的更符合人類認知行為的、趨于多維度思想的模塊化機制,以解決因為關注點分離不足而導致的諸多問題。而新的關注點分離思想的關鍵點在于如何克服單維度思想的功能性主體在OOP設計及實現中的專制性,從而對橫切關注點實現高內聚、低耦合的有效封裝。AOP思想由此應運而生,早在1997年歐洲召開的面向對象編程大會上,Gregor等就首次提出了AOP的概念[10]。AOP保留了面向對象的抽象增強、模塊化和代碼重用等目標,依據信息隱蔽性的原則,允許開發者動態修改面向對象模型,實現更高程度的關注點分離。作為一種思維形態,AOP本身并未規定具體的實現形式。為順應定義上的標準,本文參考了AspectJ的相關概念和原理,其中包括Aspect(方面)、Joint Point(連接點)、Pointcut(切入點)、Advice(通知)、Inter-type declaration(類型間聲明)、Weave(編織)等。
另一方面,C++作為傳統類型上的OOP語言,在很多領域尤其是嵌入式系統,有著不可替代的地位。國內外關于C++的AOP研究雖有所發展,如C++模版技術[11-12]是根據參數類型生成通用類和通用函數,某種程度上實現了軟件復用;Aspect C++用C++語言實現了AspectJ,還有宏編程[13]等,但這些都無法支持AOP架構的動態演化,并且在編織效率上也有所欠缺,從而只是片面實現了AOP概念[14]。本文提出一種動態AOP編程框架——AODF[15](Aspect-Oriented Dynamic Framework),是支持C++語言擴展(Language Extension)的方面編程環境。圖1為AODF的總體結構??梢钥闯?,AODF事實上是方面代碼到標準C++源碼的前端轉換系統,從語言層提供對方面的支持,無需改動語言本身任何結構及特性,就可以實現遺留系統面向方面的擴展。而且支持自編制和可配置兩種類型的方面,并可配置為標準組件入庫,實現方面的重用。AODF的動態演化性主要由方面配置管理器的“動態演化設置”模塊實現(第3章),而基于日志技術的增量式編織機制由方面配置管理器的“增量式編織”模塊實現(第4章)。AODF的原理及具體實現將在第5章詳述。
動態演化是網格計算、普適計算、云計算等開放計算環境的基礎,近年來逐漸成為學術界研究的熱點。動態演化的研究主要集中于語言、模型和運行環境三個方面,而軟件體系結構(Software Architecture,SA)對動態演化的支持,也體現為以體系結構為核心的應用模式和軟件框架的研究。例如:J.Dowling等人設計的 K-Commponent[8]框架元模型通過提供體系結構元模型和適配契約(Adaptation Contracts)來支持系統動態配置。Walter Czaaola提出由拓撲元對象和策略元對象形成體系結構反射元模型,但也僅支持預設的演化[7]。國內徐洪珍等提出用約束超圖表示SA,用條件超圖文法建模SA的動態演化過程[6],但未能解決SA動態演化行為一致性的問題。本文基于Bigraph的圖形化理論將動態演化的思想結合到AOP的軟件體系結構中,試圖解決軟件系統演化的行為一致性和相容性問題。
AODF的動態演化特性主要由動態演化設置模塊實現,該模塊的設計基于Bigraph理論。Bigraph具有完備的公理系統,其直觀的圖形化表述不僅方便SA建模,而且還有相關的項語言(term language)[15]對系統性質進行推理和演繹。另一方面,Bigraph理論為軟件演化的一致性和相容性等問題也提供了理論基礎。
3.1 Bigraph反應系統

圖1 AODF系統框架
為建模方面SA的動態演化,對Bigraph靜態結構的定義進行了擴展,使其能夠描述AODF編程框架。然后運用BRS(Bigraph反應系統)的反應規則表示AODF的動態演化操作,將動態演化操作轉換為BRS上的操作。以銀行的ATM系統為例,核心關注點有取款和登錄模塊等,橫切關注點主要有用戶驗證,所以把用戶驗證模塊提取為方面(AsV)。當執行取款操作時,ATM系統需再行驗證用戶的取款權限,所以取款模塊執行之前要切入“取款權限驗證”方面(AsAu),這就需要對系統進行演化操作。圖2為ATM系統動態演化前后的Bigraph圖形及項語言。上半部分為ATM演化前的Bigraph圖及項語言,在Bigraph反應系統中使用反應規則,將取款(W)節點動態插入(演化操作)新的方面節點AsAu,使其轉換為Bigraph ATM'(圖的下半部分),實現了取款之前進行權限驗證的動態演化操作。

圖2 ATM動態演化前后的Bigraph圖及項語言
Bigraph從軟件體系結構層面支持動態演化,從而可以把AODF看成一個Bigraph,這樣對體系結構的演化操作可通過對Bigraph進行轉換來實現。BRS中的反應規則可以表示動態重配置,則AODF的動態演化過程就可以映射為BRS中一個Bigraph通過反應規則轉換為另外一個Bigraph的過程。用Bigraph的圖形表述軟件體系結構的演化更加直觀,項語言的形式化理論有利于下一步對軟件演化特性的驗證。
3.2 Bigraph演化的完整性
Bigraph靜態和動態特性所基于的范疇論,其中最為重要的IPO(Idem Pushout)和RPO(Relative Pushout)的數學性質,可以證明在BRS中,當存在RPO和最小轉換時,Bigraph之間的互模擬事實上是相合(Congruence)的。針對現有動態演化研究無法解決行為一致性和相容性問題,本文基于Bigraph為動態演化的形式化規約和性質驗證提供一種有效解決途徑。
Bigraph反應系統S=<R,r,R′>:R→R′,R和 R′都為Bigraph,分別為反應物和生成物,r為反應規則。
定理1(Bigraph演化相容性)當R和r滿足系統約束的條件下,則通過該反應規則生成的R′也應滿足系統的約束條件。
證明 設R為反應物Bigraph,R′為生成物Bigraph,r為反應規則。假設R和r均滿足系統約束條件關系C。根據Bigraph項語言操作語義可知,從R中可分離出Bigraph G,因為R滿足C,則G也應滿足C,于是R=G°r。從反應系統的遷移規則推導,可得出R′=G°r,又因為合成操作滿足滿射的數學特征,所以在G與r滿足系統約束條件C的情況下,G′也滿足系統的約束條件,命題得證。
同理可以得到推論1:
推論1反應物Bigraph集和反應規則集合ri(i=1,2,…,n)滿足系統約束,則通過ri集合轉換的生成物Bigraph集也同樣滿足系統的約束條件。
故可以得出結論,基于Bigraph完備性理論構建的演化系統具有完整性。
3.3 Bigraph演化的一致性和相容性
基于Bigraph完整性的基礎,可以考慮演化的一致性和相容性。所謂一致性,可以是行為的一致,即生成物能完成反應物的任何行為;而相容性主要指系統演化前后行為的正確性,生成物不會導致死鎖等問題。
定理2假設給定系統環境E及其構件c1、c2,對于反應規則集合 ri(i=1,2,…,n),存在相應標簽序列 Li,使得,則稱c1與c2相容。
證明 根據Bigraph理論的標簽轉換系統LTS[16]以及異步π演算原理[17]可知指構件c1、c2在上下文環境E中,針對r存在對應標簽使構件間同步交互,并能正常終止的過程。根據相容性的定義,定理2得證。
引理 安全BRS中,若最小轉換的等價互模擬相合,即x~y,則對任意活動上下文z,有 z°x~z°y[12]。
定理3 BRS中存在RPO和最小轉換時,則互模擬是同構的,即若x~y,則對任意活動上下文z,有z°x~z°y,同時x可以保持一致性演化至y。
證明 由引理可知,若最小轉換的等價互模擬相合,即x~y,則構件x在任何上下文環境中,均能演化至y,根據行為等價性和互模擬性的定義可知,x可以保持一致性演化至y。
AODF的動態演化性是基于Bigraph理論的,故AODF的行為演化滿足了一致性和相容性。
3.4 示例驗證
如圖3所示,某軟件系統由客戶端C、服務器端S及C與S之間通信連接件CN,系統未實施演化前,基于Bigraph圖論解析出來的系統軟件體系結構的Bigraph圖為圖3(a)。

圖3 C/S軟件架構的動態演化示例圖
該系統主要演化行為是:AddService(當軟件應用滿足不了客戶端功能和性能時,需在服務器端增加服務)和SendData(在客戶端、服務器端之間傳遞數據的行為),根據這兩種演化行為的反應規則,可以得到如下反應前后的項語言:

可以看到,圖3(a)中客戶端(C)的數據可以通過通信連接件(CN)傳送至服務器端(S),經服務器端處理完后發送出去。顯然圖3(b)也能實現這一行為,即基于Bigraph理論演化后的系統可以模擬演化前的所有操作,并且反應規則均維持通信連接件的單一性。由定理2可知,該動態演化保證了C/S體系結構的完整性,因此可以驗證該系統的演化是一致和完整的。
由于編織效率對軟件性能影響較大,若對所有組件都采用簡單的完全編織策略,勢必導致編織效率低下。AODF采用增量式編織機制,結合方面的動態演化設置,可以實現更高效的編織。增量式編織機制主要由方面配置管理器的“增量式編織”模塊實現。實施增量式編織最核心的問題是演算編織狀態的改變量。計算出方面狀態的改變量,則只需對修改部分進行編織,而無需針對整個aspect進行完全編織,從而能夠較好提升編織效率。增量式編織的原理如圖4所示。
為了方便編織,AODF方面組件庫中的組件都被賦于如圖4所示的四種屬性值,若最近編織時間為0,則需要完全編織,根據“連接點設置”模塊生成的編織匹配集進行源代碼的織入,具體織入規則參看5.3節。若“最近編織時間-最近修改時間”大于等于0說明方面無變更,則無需編織;若小于0,則需要進行增量式編織。實現增量式編織的重點是計算編織狀態的改變量,即圖4中的?weave,先對方面進行量化的結構描述及匿名切入點命名轉化后,將其存儲模型定義為三個集合:切入點集、連接點集、通知集。以切入點為中心組成線性鏈表,鏈表中每個節點包含3個指針域和一個鍵值域,指針分別指向連接點集、通知集及下一節點,每個連接點及通知均設置了標志位,可標示新增狀態、刪除狀態和初始態。通過對連接點、通知狀態的判定,很容易計算出編織狀態改變量,從而實現增量式編織。
AODF基于日志系統來構建增量編織機制,創建了三種日志,IndexLog用于索引編織日志(WeaveLog),目的是加快檢索編織狀態,每個日志項是一個三元組〈Slant(記錄方面編織狀態信息在WeaveLog中的相對偏移量),Count(記錄方面編織次數),AspectID(方面標識號,關鍵字)>;WeaveLog記錄了方面的編織歷史及更新歷史,其日志項為四元組〈AspectID,CurrentWeaveStatus(當前編織狀態),LastWeave(最后一次編織時間),LastUpdate(最后一次更新時間)>;SysLog存放一些系統全局信息,日志項是一個兩元組〈AspectID,Count>。IndexLog用哈希表存儲,每個關鍵字AspectID對應一個存放著aspect信息的哈希桶,當aspect被編織或重編織時,將編織計數值Count及偏移量Slant存入桶中,則最新的方面狀態索引項總處于哈希桶的頂部。采用哈希表的存儲結構的目的是讓索引時間復雜度降為O(1),避免了對整個索引日志的遍歷,從而提高AOP的效率。
AODF主要由源碼轉換器、方面組件生成器和方面配置管理器組成,下面將分別闡述。
5.1 源碼轉換器
源碼轉換器主要包括源碼掃描、語法分析、語義分析三個模塊。

圖4 增量式編織原理
源碼掃描模塊的主要任務是對源程序從前到后逐個字符掃描,經解析后,依次讀取、判斷源代碼文件中的每一個符號,包括標識符、關鍵字、運算符、常量、分隔符和注釋等,得到源代碼文件的標識符集合,保存在指定的Token鏈表中。
語法分析模塊的任務是在源碼掃描基礎上,根據C++的語法規則判斷輸入串語法正確與否,若無錯誤就能正確生成語法樹,以語法樹的形式將符號token序列分解成各類語法單位。這里選擇Lemon來輔助完成語法分析工作,根據C++標準語法規則生成的C++語法分析器,輔助語法分析模塊生成語法樹。該模塊的輸入為標識符流,輸出為語法樹根節點,用于連接點查找及進一步的語義分析。
AODF中的語義分析模塊對語法分析模塊生成的語法樹進行簡單掃描,用指針鏈表的形式存儲語法樹中的類及函數的相關信息(包括類和函數名、屬性列表、方法列表、函數所屬類、參數列表、返回值類型等),生成符號倉庫用于連接點設置,所以無需進行完整的C++語義解析。
5.2 方面組件生成器
方面組件生成器負責掃描程序員按方面語法規則編寫的aspect代碼,按規定格式將方面的名字、屬性和方法,切入點的屬性和類型,通知的類型和代碼等提取出來,輸出到方面配置管理器的織入模塊。方面組件有兩種情況:一種是自編制的方面組件,即可以重新定義切入點、連接點、通知等,生成新的、獨立的方面組件,經方面組件生成器解析后,提取放入到方面組件庫待用;另一種是可配置方面組件,通過配置文件,可以像使用庫函數一樣來使用方面,直接讀取到方面配置管理器中進行動態演化設置、連接點匹配及最終的代碼織入。
5.3 方面配置管理器
方面配置管理器一方面對方面組件進行有效配置與管理,另一方面基于正確的連接點匹配,代碼織入模塊負責將方面組件編織進標識符流的相應位置,完成最終代碼編織工作,方面配置管理器的工作流程如圖5所示,主要有以下幾個步驟:
(1)連接點查找
連接點查找模塊主要對源碼轉換器生成的語法樹和符號倉庫依據連接點類型定義進行搜索,把源碼中所有可能連接點找出,以鏈表形式保存在相應參數中。
(2)動態演化設置
C++構件、連接件經基于Bigraph公理系統的“SA析構模塊”解析生成系統軟件體系結構(SA)的Bigraph圖,作為動態演化設置模塊的輸入,經動態演化設置模塊解析為相應的項語言,根據反應規則,方面組件的織入行為轉化為對Bigraph圖及項語言的演化,經BRS反應系統演化后的生成物Bigraph和項語言交由連接點匹配模塊進行進一步的連接點設置。
(3)連接點匹配
該模塊根據動態演化設置模塊傳輸過來的生成物Bigraph和項語言分析其織入行為,對每一個方面組件的CppAdvice對象分析切入點表達式,若與連接點查找模塊生成的鏈表中的連接點標識符相匹配,則讀取CppJointPoint類與符號倉庫ClassDB進行匹配運算,若都滿足條件,則需進一步判斷連接點的類型并對其設置WeaveAction類屬性。最后將設置好編織動作的連接點置入到匹配集鏈表jpweaveset中,供代碼織入模塊調用。
(4)增量式編織
增量式編織模塊根據連接點編織匹配集,進行源代碼的動態編織動作,而無需為了使用aspect而改動任何C++源代碼。增量式編織關鍵要解決,編織狀態的改變量(第4章)及不同類型的連接點織入到語法樹位置的問題。AODF設定了如下編織規則:
①對于CALL類型的連接點:如果代碼為_wrapper_code或_call_code型,則織入到語法樹節點jpweaveset->caller_func的左兄弟節點所指的token之后;對于_replace_code型代碼,織入到語法樹節點jpweaveset->callnode的左兄弟節點所指的token之后,并刪除callnode對應的整個子樹的token序列。
②對于EXCUTION類型的連接點:將Before代碼插入到語法樹節點jpweaveset->func_info左兄弟節點所指的token之后;將After代碼插入到語法樹節點jpweaveset-> func_info右兄弟節點所指的token之后;最后將jpweaveset-> func_info所指的token重命名。
③對CLASS類型的連接點:直接將ClassCode代碼插入到語法樹節點jpweaveset->classrefNode所指的token之后。

圖5 方面配置管理器工作流程
5.4 實驗情況概述
為驗證AODF編程框架能否實現設計的初衷——正確、高效、動態地織入方面代碼,AOP的性能是否帶來負面效應,都需要通過實驗來驗證。實驗環境如表1所示。

表1 實驗環境參數表
把編寫好的aspect文件won.as和C++源代碼文件main.cc存放在before目錄下,after為編織后的代碼保存路徑,對編織前的代碼before/main.cc和編織后的代碼after/ main.cc進行測試對比,結果表明,aspect代碼能準確織入到C++程序的相應位置,并正確地轉化為標準C++語法,交由GC++、Visual C++等C++編譯器可進一步編譯執行。編織后的代碼量相應增大,但編譯時間僅略微增加。
為了分析AOP語言的執行性能,對AOP及OOP的編織、編譯進行了多次實驗,實驗數據統計如圖6所示。從實驗結果可以看出,AOP編織時間比OOP的編譯時間略大一些,因為AOP是構筑于OOP之上的,性能與效率肯定會受影響。但從實驗結果可以看到,AOP的編織時間與OOP的編譯時間相差僅毫秒級,這點差異與當前的計算機處理速度相比,幾乎可以忽略。由此可以得出,AODF是一種有效的面向方面編程框架,能較好地對C++代碼進行面向方面的擴展,實現多維度分離關注點的目的。對自行編制的aspect源碼可設置為AODF的標準方面組件,既達到了對原有系統動態增加橫切關注點這一非功能性主體的目的,又實現了方面的重用。使得源代碼的可讀性、易擴展性、可維護性更強。

圖6AOP與OOP性能對比實驗
在互聯網技術成為主流計算環境的形式下,軟件已逐步走向開放、動態和難以預測。人類思維的多變與不可控注定了軟件的動態與復雜,而為軟件開發提出有效的結構性框架已成為軟件科學與技術面臨的挑戰性問題。本文提出一種基于C++的面向方面動態編程框架AODF,其作為一種語言擴展,使得C++遺留系統不必為使用aspect做任何變更;另一方面,增量式動態編織機制不僅使得編織效率得到提高,還使得AODF具有動態演化能力,而基于Bigraph理論的演化解決了行為一致性和相容性問題。但AODF還有許多需要改進的地方,比如,僅支持“織入”行為,未能實現“織入”行為的逆工程(比如動態刪除方面、更新方面等)。下一步工作主要是提高連接點查找效率,改善編織算法,進一步研究對演化行為的后期度量及評審、對AODF耦合度的評估、對編程過程的形式化驗證等。
[1]楊芙清.軟件工程技術發展思索[J].軟件學報,2005,16(1):1-7.
[2]梅宏,黃罡,趙海燕,等.一種以軟件體系結構為中心的網構軟件開發方法[J].中國科學:E卷,2006,36(10):1100-1126.
[3]陶麗,張自力.基于面向自治計算的Agent系統動態重構模型[J].計算機科學,2007,34(5):147-151.
[4]Lehman M M,Rail J F.Software evolution-background,theory,practice[J].Inf Process Lett,2003,88(1/2):33-44.
[5]Casanova M,Van-Der Straeten R,Jonckers V.Supporting evolution in component-based developmentusing component libraries[C]//Proceedingsof7th European Conference on Software Maintenance and Reengineering,2003:123-132.
[6]Xu Hongzhen,Zeng Guosun,Chen Bo.Conditional hypergraph grammars and its analysis of dynamic evolution of software architectures[J].Journal of Software,2011,22(6):1210-1223.
[7]Cazzola W,Pini S,Ghoneim A,et al.Co-evolving application code and design models by exploiting meta-data[C]// Proceedings of the 12th Annual ACM Symposium on Applied Computing(SAC’07),Seoul,South Korea,2007:1275-1279.
[8]Dowling J,Cahill V.The K-component architecture meta-model for self-adaptive software[C]//Proceedings of the 2001 Symposium on Software Reusability:Putting Software Reuse in Context,Toronto,Ontario,Canada,2001:41-50.
[9]Jensen O H,Milner R.Bigraphs and mobile processes(revised),UCAM-CL-TR-580[R].Cambridge:Computer Laboratory,University of Cambridge,2004.
[10]Kiczales G.Aspect-oriented programming[C]//Proceedings of ECOOP,Finland,1997:220-242.
[11]Czarnecki K,Dominick L,Eisenecker U W.Aspect-oriented programming in C++[Z].2001.
[12]Czarnecki K,Eisenecker U W.Generative programming:methods,tools,and applications[M].New York:ACM Press,2000.
[13]Dounence R,Fradet P,Südholt M.Composition,reuse and interaction analysis of stateful aspects[C]//Aspect-Oriented Software Development(AOSD),2004:141-150.
[14]Elrad T,Filman R E,Bader A.Aspect-oriented programming[C]// CACM,2001:29-32.
[15]楊曦,李彤.一種支持動態演化的AOP框架[J].計算機工程,2012,38(19):52-55.
[16]Jensen O H,Milner R.Bigraph and transition[C]//POPL’03 Proceedings of the 30th ACM SIGPLAN-SIGACT,2003,38(1):38-49.
[17]Amadio R M,Castellani I,Sangiorgi D.On bisimulations for the asynchronous π-calculus[J].TheoreticalComputer Science,1998,195:291-324.
YANG Xi1,LI Tong2
1.College of Sunshine,Fuzhou University,Fuzhou 350015,China 2.School of Software,Yunnan University,Kunming 650091,China
On the basis of AOP principles research,it proposes an aspect-oriented programming framework AODF,which introduces incremental weaving mechanisms based on log technology,not only improves the weaving efficiency,but also supports dynamic evolution based on the Bigraph theory and achieves behavior consistency and compatibility.On the other side,it provides the aspects with support from language layer,without changing any structure and characteristics of the language itself.Furthermore,the self_organizational aspect configurated by AODF can be added in the framework as the standard components so that the further system can reuse them.So the legacy system obtains aspect extended by AODF but no need to make any changes. Key words:Aspect-Oriented Programming(AOP);Aspect-Oriented Dynamic Framework(AODF);aspect-oriented;dynamic evolution;Bigraph theory
在研究AOP原理的基礎上,提出一種面向aspect的編程框架AODF,采用基于日志技術的增量式編織機制,不僅提高了編織效率,而且基于Bigraph理論的AODF支持方面的動態演化,實現了行為的一致性與相容性。另外,AODF從語言層提供對方面的支持,無需改動語言本身任何結構及特性,而且可以把自行編制的aspect配置為標準組件入庫,實現方面的重用。從而使得遺留系統無需變更就可以獲得面向方面的擴展。
面向方面的編程(AOP);面向方面的動態框架(AODF);面向方面;動態演化;Bigraph理論
A
TP311
10.3778/j.issn.1002-8331.1305-0466
YANG Xi,LI Tong.Research and implementation of AOP framework based on incremental dynamic evolution.Computer Engineering and Applications,2013,49(23):39-44.
國家自然科學基金(No.60963007);福建省教育廳科技項目(No.JB11251)。
楊曦(1977—),女,講師,CCF會員,研究領域為軟件動態演化、構件選擇優化;李彤(1963—),男,博士,教授,博士生導師,研究領域為軟件演化、形式化方法。E-mail:Yangxi@fzu.edu.cn
2013-06-03
2013-08-26
1002-8331(2013)23-0039-06