前言:想要寫(xiě)出一篇引人入勝的文章?我們特意為您整理了談軟件系統(tǒng)模塊間循環(huán)依賴(lài)識(shí)別范文,希望能給你帶來(lái)靈感和參考,敬請(qǐng)閱讀。
摘要:軟件系統(tǒng)中各平臺(tái)多模塊開(kāi)發(fā)過(guò)程中,若開(kāi)發(fā)人員對(duì)自己模塊扇入、扇出盲目增刪,導(dǎo)致模塊間依賴(lài)變更,容易產(chǎn)生系統(tǒng)級(jí)循環(huán)依賴(lài)。如果模塊間產(chǎn)生循環(huán)依賴(lài)環(huán),代碼在編譯時(shí)若不清除中間生成文件,編譯生成的產(chǎn)品有極大的風(fēng)險(xiǎn)或者采用2次編譯的方法解決。通過(guò)進(jìn)行循環(huán)依賴(lài)分析找出所有依賴(lài)環(huán)的解決辦法。
關(guān)鍵詞:循環(huán)依賴(lài);非法依賴(lài);多模塊;軟件工程;識(shí)別
引言
隨著當(dāng)前軟件系統(tǒng)越來(lái)越復(fù)雜,平臺(tái)越來(lái)越多,平臺(tái)包含的模塊也越來(lái)越多,開(kāi)發(fā)人員在開(kāi)發(fā)代碼的時(shí)候如果對(duì)模塊的依賴(lài)未按照設(shè)計(jì)要求隨意增加,容易導(dǎo)致平臺(tái)級(jí)或系統(tǒng)級(jí)別產(chǎn)生循環(huán)依賴(lài)。賈利敏等提出通過(guò)程序執(zhí)行軌跡,確定數(shù)據(jù)依賴(lài)結(jié)點(diǎn)、控制依賴(lài)結(jié)點(diǎn)和結(jié)點(diǎn)可到達(dá)語(yǔ)句來(lái)計(jì)算變量切片[1];不過(guò)此檢測(cè)方式粒度太細(xì),不利于軟件模塊級(jí)識(shí)別。劉杰等提出基于歸納變量的循環(huán)依賴(lài)分析方法[2],識(shí)別變量級(jí)別的循環(huán)依賴(lài);劉鵬遠(yuǎn)等提出采用提取公共部分方法消除包級(jí)別循環(huán)依賴(lài)[3],若模塊粒度更細(xì)、數(shù)量更大的話(huà),不易實(shí)現(xiàn);丁麗麗等基于GCC5.1針對(duì)分支嵌套循環(huán)的依賴(lài)提出計(jì)算依賴(lài)距離方法能夠快速地分析出該類(lèi)循環(huán)潛在的并行性[4],但此計(jì)算類(lèi)似C語(yǔ)言某幾條語(yǔ)句循環(huán)依賴(lài),不適用于系統(tǒng)內(nèi)模塊查找循環(huán)依賴(lài)。
1依賴(lài)概述
在架構(gòu)設(shè)計(jì)合理,各平臺(tái)的依賴(lài)關(guān)系應(yīng)該是上層平臺(tái)依賴(lài)下層平臺(tái),各模塊的扇入、扇出設(shè)計(jì)合理的前提下,整個(gè)系統(tǒng)所有模塊的依賴(lài)關(guān)系不應(yīng)該存在循環(huán)依賴(lài)。正常情況下平臺(tái)或模塊間的依賴(lài)關(guān)系應(yīng)該是上層平臺(tái)依賴(lài)下層平臺(tái):①上層依賴(lài)下層。②上層對(duì)下層一對(duì)一或一對(duì)多。③最下層不對(duì)本平臺(tái)依賴(lài),但可能會(huì)對(duì)下層級(jí)平臺(tái)有依賴(lài)。④最上層不會(huì)被本平臺(tái)依賴(lài),但會(huì)被上層平臺(tái)依賴(lài)。⑤存在上層跨層依賴(lài)下層。⑥所有模塊都會(huì)被依賴(lài)。⑦所有模塊對(duì)外不重復(fù)。
2循環(huán)依賴(lài)分析與解決方案
2.1分析根因
由于平臺(tái)級(jí)的循環(huán)依賴(lài)根因也是由于各平臺(tái)對(duì)應(yīng)的模塊產(chǎn)生的模塊級(jí)循環(huán)依賴(lài)導(dǎo)致,所以可以把平臺(tái)級(jí)循環(huán)依賴(lài)和模塊級(jí)循環(huán)依賴(lài)看作相同的問(wèn)題。循環(huán)依賴(lài)的根因是縱向依賴(lài)鏈上出現(xiàn)了環(huán):如A依賴(lài)B、B依賴(lài)C、C依賴(lài)A或D依賴(lài)E、E依賴(lài)F、F依賴(lài)G、G依賴(lài)D,這樣就出現(xiàn)依賴(lài)環(huán),當(dāng)然這個(gè)是比較簡(jiǎn)單的環(huán)示例,在實(shí)際情況中,有的環(huán)路節(jié)點(diǎn)有很多個(gè)可以達(dá)到10多個(gè)模塊,如果靠人工計(jì)算,一是計(jì)算工作量比較大,另一個(gè)是容易遺漏。
2.1.1數(shù)學(xué)模型假設(shè)數(shù)學(xué)模型如下。1)假定我們當(dāng)前有一個(gè)平臺(tái)(多個(gè)平臺(tái)檢測(cè)方法類(lèi)似)。2)假定這一個(gè)平臺(tái)一共有n個(gè)模塊{M1,M2,M3,…,Mn}。3)第k個(gè)模塊扇入ik個(gè)。4)第k個(gè)模塊扇出ok個(gè)。
2.1.2計(jì)算方法1)把這n個(gè)模塊所有扇出o1,o2,o3,…,on合并起來(lái),記為AllOutputList[]。2)把這n個(gè)模塊遍歷,扇入不在AllOutputList中的刪除,因?yàn)檫@些刪除的依賴(lài)是從其他平臺(tái)引入的依賴(lài),此步處理完后,所有模塊的扇入只來(lái)源此平臺(tái)的扇出,這樣在后續(xù)計(jì)算時(shí),減少冗余的計(jì)算。3)選擇任意模塊作為當(dāng)前計(jì)算模塊,并檢查此模塊是否有扇入,如果有扇入則把所有扇入的父節(jié)點(diǎn)進(jìn)行統(tǒng)計(jì)并去重,并把此模塊記錄到ParentsList數(shù)組,如某模塊一共有20個(gè)扇入,其中5個(gè)扇入來(lái)源于A模塊、10個(gè)扇入來(lái)源于B模塊、另外5個(gè)扇入來(lái)源于C模塊,則此模塊的Parents數(shù)據(jù)包含A、B、C三個(gè)模塊,此時(shí)Parents里存放A、B、C;如果沒(méi)有扇入,則不計(jì)算。4)遍歷Parents數(shù)組所有成員,如A,則先把A與Par-entsList中所有元素進(jìn)行比較,檢查是否有重復(fù),若有重復(fù),則發(fā)現(xiàn)環(huán),并打印環(huán),然后出棧;若無(wú)重復(fù),則把A模塊視為當(dāng)前計(jì)算模塊,把A模塊進(jìn)行壓棧,并返回到步驟3;等數(shù)組的第一個(gè)成員完成遍歷后,繼續(xù)搜索Parents第二個(gè)成員B,并返回到步驟3,把B模塊視作模塊1進(jìn)行遞歸;如果沒(méi)有重復(fù),則把A壓棧到ParentsList;并返回到步驟3,把A模塊視作模塊1進(jìn)行遞歸,依此類(lèi)推。5)在檢查的過(guò)程中如果發(fā)現(xiàn)當(dāng)前計(jì)算模塊沒(méi)有扇入,則不計(jì)算,直接返回。通過(guò)不斷查詢(xún)數(shù)組中成員數(shù)據(jù)是否包含新模塊名,再對(duì)數(shù)組進(jìn)行壓棧、出棧,再對(duì)比,這樣最終可遍歷到整個(gè)系統(tǒng)所有循環(huán)依賴(lài)環(huán)。經(jīng)過(guò)3、4、5這3步能把所有模塊所有依賴(lài)環(huán)找出來(lái)。但還有另一個(gè)問(wèn)題:多個(gè)依賴(lài)環(huán)有重復(fù)的情形,假設(shè)4個(gè)模塊依賴(lài)環(huán)為:A依賴(lài)B,B依賴(lài)C,C依賴(lài)D,D依賴(lài)A,則搜索出來(lái)的結(jié)果可能出現(xiàn)環(huán)的4種情況分別為:A,B,C,D;B,C,D,A;C,D,A,B;D,A,B,C。碰到這種情形需要對(duì)這幾種環(huán)進(jìn)行去重操作,詳細(xì)處理辦法是把生成環(huán)的所有結(jié)點(diǎn)分別存放到二維數(shù)組以模塊名為單位排序后進(jìn)行比較,如果相同,則表示環(huán)相同,反之則不相同。像首尾相同的模塊:[A—B—C—D—A],這樣的環(huán)?。跘—B—C—D],此去重方法較簡(jiǎn)單,不再贅述。
2.2測(cè)試數(shù)據(jù)來(lái)源
來(lái)源于XX產(chǎn)品XX平臺(tái),測(cè)試模塊220個(gè),扇入、扇出共計(jì)2000多個(gè)。
3實(shí)驗(yàn)結(jié)果與分析
通過(guò)對(duì)數(shù)據(jù)進(jìn)行計(jì)算后展示的結(jié)果如下(只展示部分?jǐn)?shù)據(jù),實(shí)際發(fā)現(xiàn)環(huán)個(gè)數(shù)72個(gè))。從上述結(jié)果可以看出:①單模塊可能會(huì)存在于多個(gè)環(huán)。②可發(fā)現(xiàn)被其他多次循環(huán)依賴(lài)模塊。
4結(jié)語(yǔ)
本文通過(guò)把軟件系統(tǒng)中模塊名視為樹(shù)節(jié)點(diǎn),通過(guò)深度遍歷優(yōu)先算法進(jìn)行查找模塊間依賴(lài)環(huán),不斷對(duì)縱向依賴(lài)鏈進(jìn)行先判斷再壓棧,若對(duì)下層無(wú)依賴(lài)則出棧,遞歸查詢(xún)所有依賴(lài)環(huán),并且給出多種依賴(lài)環(huán)去重的方法,最終發(fā)現(xiàn)所有模塊所有依賴(lài)環(huán)。不過(guò)還有一個(gè)問(wèn)題,當(dāng)前方法查找出來(lái)的依賴(lài)環(huán)不具備給架構(gòu)師詳細(xì)依賴(lài)接口的能力,需要在代碼實(shí)現(xiàn)的時(shí)候壓棧、出棧時(shí)把父子節(jié)點(diǎn)之間的接口關(guān)系也添加上,這個(gè)難度也不大,不再贅述。
參考文獻(xiàn):
[1]賈利敏,張忠林.一種簡(jiǎn)化依賴(lài)關(guān)系的動(dòng)態(tài)程序切片算法[J].鄭州大學(xué)學(xué)報(bào),2009,30(2):84-87.
[2]劉杰,曹琰,魏強(qiáng),等.符號(hào)執(zhí)行中的循環(huán)依賴(lài)分析方法[J].計(jì)算機(jī)工程,2012,38(22):24-33.
[3]劉鵬遠(yuǎn),鄧沌華,李祥.不同粒度循環(huán)依賴(lài)的消去方法[J].信息通信,2013(6):9-10.
[4]丁麗麗,李雁冰,張素平,等.分支嵌套循環(huán)的自動(dòng)并行化研究[J].計(jì)算機(jī)科學(xué),2017,44(5):14-52.
作者:任啟紅 黃輝 周鋒 王永亮 單位:三江學(xué)院計(jì)算機(jī)科學(xué)與工程學(xué)院