一種避免行為層組合時(shí)行為變體重復(fù)編織的處理方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及一種面向上下文編程中避免行為層組合時(shí)行為變體重復(fù)編織的處理方法,特別是避免JCOP聲明式行為層組合的行為變體重復(fù)編織,基于抽象語(yǔ)法樹(shù)結(jié)構(gòu)構(gòu)造源程序的靜態(tài)調(diào)用關(guān)系圖,進(jìn)一步采用基于調(diào)用關(guān)系圖的調(diào)用關(guān)系檢測(cè)方法,檢測(cè)方法之間是否存在調(diào)用關(guān)系,從而決定是否插入監(jiān)控語(yǔ)句,最終避免行為變體的重復(fù)編織,降低對(duì)現(xiàn)有JCOP運(yùn)行支撐環(huán)境的影響。
【背景技術(shù)】
[0002]隨著上下文在軟件系統(tǒng)中發(fā)揮著越來(lái)越大的作用,開(kāi)發(fā)和設(shè)計(jì)上下文敏感軟件逐漸形成一種趨勢(shì)。為了高效地進(jìn)行上下文敏感軟件的設(shè)計(jì)與開(kāi)發(fā),學(xué)者們提出了不同抽象級(jí)別的方案,其中既有軟件體系架構(gòu)級(jí)別,又有基于組件的設(shè)計(jì)。面向上下文編程(ContextOriented Programming, COP)方法為開(kāi)發(fā)上下文敏感軟件提供了語(yǔ)言級(jí)別的解決方案。
[0003]JCOP語(yǔ)言采用基于塊結(jié)構(gòu)的激活機(jī)制,是面向上下文編程中的主流語(yǔ)言之一。為了解決行為層激活語(yǔ)句在程序中散布(scattering)的問(wèn)題,JCOP引入了聲明式行為層組合。聲明式行為層組合中,開(kāi)發(fā)人員只需定義何時(shí)應(yīng)該進(jìn)行激活,以及激活哪個(gè)行為層。JCOP編譯器以面向剖面編程的方式將激活語(yǔ)句插入到程序中的指定位置。
[0004]通常情況下,激活語(yǔ)句的插入位置是指定的方法調(diào)用前。JCOP語(yǔ)言也支持對(duì)程序中多個(gè)方法調(diào)用前編織行為層激活語(yǔ)句。然而,當(dāng)兩個(gè)方法之間在運(yùn)行時(shí)刻存在調(diào)用關(guān)系時(shí),現(xiàn)有編織方法會(huì)造成一條激活語(yǔ)句的重復(fù)編織。進(jìn)一步地,激活語(yǔ)句中的行為變體對(duì)應(yīng)的方法可能會(huì)重復(fù)執(zhí)行,程序不能按照程序員預(yù)期的方式運(yùn)行,發(fā)生不可預(yù)期的錯(cuò)誤。
[0005]為了解決該問(wèn)題,需要對(duì)現(xiàn)有編織方法進(jìn)行修改,保證在運(yùn)行時(shí)刻可能存在調(diào)用關(guān)系的方法之間不會(huì)重復(fù)編織同一條激活語(yǔ)句,從而保證程序按照開(kāi)發(fā)人員的預(yù)期運(yùn)行。
【發(fā)明內(nèi)容】
[0006]發(fā)明目的:針對(duì)現(xiàn)有技術(shù)中存在的問(wèn)題與不足,本發(fā)明提供一種面向上下文編程中避免行為層組合時(shí)行為變體重復(fù)編織的處理方法。
[0007]技術(shù)方案:一種面向上下文編程中避免行為層組合時(shí)行為變體重復(fù)編織的處理方法,包括如下部分:
[0008]I)避免行為層組合時(shí)行為變體重復(fù)編織的解決方案;
[0009]2)基于抽象語(yǔ)法樹(shù)結(jié)構(gòu)的調(diào)用關(guān)系圖構(gòu)造方法;
[0010]3)基于調(diào)用關(guān)系圖的調(diào)用關(guān)系檢測(cè)方法。
[0011]在抽象語(yǔ)法樹(shù)上構(gòu)造源程序的調(diào)用關(guān)系圖,進(jìn)而檢測(cè)行為變體對(duì)應(yīng)的方法之間的調(diào)用關(guān)系。面向剖面編程支持監(jiān)控運(yùn)行時(shí)刻控制流的關(guān)注點(diǎn),借助面向剖面編程的這個(gè)功能,根據(jù)是否存在調(diào)用關(guān)系決定是否插入監(jiān)控語(yǔ)句,避免激活語(yǔ)句的重復(fù)編織引起的行為層重復(fù)激活的問(wèn)題。
[0012]靜態(tài)調(diào)用關(guān)系圖建立在程序的抽象語(yǔ)法樹(shù)中,是抽象語(yǔ)法樹(shù)的一部分,可通過(guò)抽象語(yǔ)法樹(shù)的根節(jié)點(diǎn)進(jìn)行訪問(wèn)。靜態(tài)調(diào)用關(guān)系圖基于類(繼承)結(jié)構(gòu)分析的結(jié)果,借助JastAdd框架的屬性文法實(shí)現(xiàn):利用綜合屬性收集調(diào)用關(guān)系圖的入口信息,利用非終結(jié)屬性構(gòu)建調(diào)用關(guān)系圖中的節(jié)點(diǎn),利用非終結(jié)屬性以及JastAddJ編譯器現(xiàn)有的名字分析(NameAnalysis)建立表示方法調(diào)用關(guān)系的有向邊。
[0013]調(diào)用關(guān)系檢測(cè)方法,使用傳遞閉包算法,以廣度優(yōu)先遍歷為基礎(chǔ),逐步求解調(diào)用關(guān)系圖中節(jié)點(diǎn)的傳遞閉包;利用節(jié)點(diǎn)的傳遞閉包,可以判別節(jié)點(diǎn)之間是否可達(dá),也即方法之間是否存在調(diào)用關(guān)系。若不存在調(diào)用關(guān)系,則不必插入監(jiān)控控制流的語(yǔ)句,避免引入不必要的加在JCOP運(yùn)行支撐環(huán)境上的負(fù)擔(dān);若存在,則繼續(xù)插入相應(yīng)的監(jiān)控語(yǔ)句。
[0014]有益效果:與現(xiàn)有技術(shù)相比,本發(fā)明提供的避免行為層組合時(shí)行為變體重復(fù)編織的解決方案,該方案首先基于抽象語(yǔ)法樹(shù)結(jié)構(gòu)構(gòu)造源程序的調(diào)用關(guān)系圖,并在此基礎(chǔ)上提供調(diào)用關(guān)系檢測(cè)方法,通過(guò)對(duì)有調(diào)用關(guān)系的行為變體相應(yīng)語(yǔ)句中插入面向剖面編程的監(jiān)控語(yǔ)句,從而高效地解決行為層組合時(shí)行為變體重復(fù)編織的問(wèn)題。
【附圖說(shuō)明】
[0015]圖1為避免行為變體重復(fù)編織的解決方案的整體模塊圖;
[0016]圖2為ClassDecl等節(jié)點(diǎn)的starter O屬性計(jì)算過(guò)程;
[0017]圖3為MethodDecl節(jié)點(diǎn)的callees()屬性計(jì)算過(guò)程;
[0018]圖4 為 Block、WhileStmt、TryStmt 節(jié)點(diǎn)的 callees O 屬性計(jì)算過(guò)程;
[0019]圖5為Assign節(jié)點(diǎn)的屬性callees O計(jì)算過(guò)程;
[0020]圖6 為 ClassInstanceExpr、AbstractDot 節(jié)點(diǎn)的 callees O 屬性計(jì)算過(guò)程;
[0021]圖7為一個(gè)簡(jiǎn)單的代碼樣例;
[0022]圖8為代碼樣例的簡(jiǎn)單抽象語(yǔ)法樹(shù)與調(diào)用關(guān)系圖;
[0023]圖9為節(jié)點(diǎn)可達(dá)性算法;
[0024]圖10為簡(jiǎn)單下載器的核心代碼;
[0025]圖11為JCOP編譯器和解決方案產(chǎn)生的關(guān)注點(diǎn)代碼。
【具體實(shí)施方式】
[0026]下面結(jié)合具體實(shí)施例,進(jìn)一步闡明本發(fā)明,應(yīng)理解這些實(shí)施例僅用于說(shuō)明本發(fā)明而不用于限制本發(fā)明的范圍,在閱讀了本發(fā)明之后,本領(lǐng)域技術(shù)人員對(duì)本發(fā)明的各種等價(jià)形式的修改均落于本申請(qǐng)所附權(quán)利要求所限定的范圍。
[0027]1、避免行為層組合時(shí)行為變體重復(fù)編織的解決方案
[0028]為了解決行為層激活語(yǔ)句在程序中散布的問(wèn)題,JCOP語(yǔ)言引入聲明式行為層組合。聲明式行為層組合在指定方法前激活某個(gè)行為層。JCOP語(yǔ)言也支持對(duì)程序中多個(gè)方法調(diào)用前編織行為層激活語(yǔ)句。然而,如果兩個(gè)方法之間存在調(diào)用關(guān)系,便會(huì)造成行為變體的重復(fù)編織。為了解決這個(gè)問(wèn)題,可利用面向剖面編程中的Cflow關(guān)注點(diǎn)(poincut)。如果運(yùn)行時(shí)刻,方法之間不存在調(diào)用關(guān)系,即使沒(méi)有Cflow關(guān)注點(diǎn),程序仍然能夠正確執(zhí)行。Cflow關(guān)注點(diǎn)監(jiān)控運(yùn)行時(shí)刻的控制流,存在額外開(kāi)銷。為了消除不必要的Cflow關(guān)注點(diǎn)引入的額外開(kāi)銷,本解決方案基于抽象語(yǔ)法樹(shù)構(gòu)造源程序的靜態(tài)調(diào)用關(guān)系圖,借此來(lái)預(yù)估運(yùn)行時(shí)刻的方法之間的調(diào)用關(guān)系,從而舍棄部分Cflow關(guān)注點(diǎn),消除不必要的運(yùn)行開(kāi)銷。
[0029]JCOP編譯器基于JastAdd框架進(jìn)行開(kāi)發(fā),JastAdd框架的核心數(shù)據(jù)結(jié)構(gòu)是抽象語(yǔ)法樹(shù)。本發(fā)明的解決方案在抽象語(yǔ)法樹(shù)上進(jìn)行擴(kuò)展,由三個(gè)模塊組成(如圖1):調(diào)用關(guān)系圖構(gòu)造模塊,調(diào)用關(guān)系檢測(cè)模塊,監(jiān)控語(yǔ)句編織模塊。
[0030]調(diào)用關(guān)系圖構(gòu)造模塊,在抽象語(yǔ)法樹(shù)上增加新節(jié)點(diǎn)和必要屬性,構(gòu)造調(diào)用關(guān)系圖。
[0031]調(diào)用關(guān)系檢測(cè)模塊,基于構(gòu)造好的調(diào)用關(guān)系圖,采用有向圖中頂點(diǎn)的傳遞閉包算法,判斷方法之間是否調(diào)用關(guān)系。
[0032]監(jiān)控語(yǔ)句編織模塊,根據(jù)調(diào)用關(guān)系檢測(cè)模塊的結(jié)果,決定是否插入Cflow關(guān)注點(diǎn)。
[0033]2、基于抽象語(yǔ)法樹(shù)結(jié)構(gòu)的調(diào)用關(guān)系圖構(gòu)造方法
[0034]調(diào)用關(guān)系圖是一種表示程序中各個(gè)方法調(diào)用關(guān)系的有向圖。其中,圖中頂點(diǎn)i表示程序中的某一個(gè)方法i,而邊(i,j)表示方法i調(diào)用了方法j。調(diào)用關(guān)系圖與一般有向圖的不同之處在于,調(diào)用關(guān)系圖中存在一個(gè)(多個(gè))入口節(jié)點(diǎn),這些入口節(jié)點(diǎn)表示程序中調(diào)用關(guān)系的起點(diǎn)。
[0035]調(diào)用關(guān)系圖的入口節(jié)點(diǎn)
[0036]為了構(gòu)造調(diào)用關(guān)系圖,需要知道調(diào)用圖的入口,也即每個(gè)線程的最開(kāi)始執(zhí)行的方法。
[0037]不管是單線程程序還是多線程程序,整個(gè)程序的入口都只能是main方法。main方法是主線程的開(kāi)始方法。多線程程序中,其他線程的開(kāi)始方法一般是run方法。因而,線程的開(kāi)始方法有兩類,一類是main方法,另一類是run方法。
[0038]為了獲取線程開(kāi)始方法,我們需要在抽象語(yǔ)法樹(shù)的節(jié)點(diǎn)上定義一些屬性。第一類屬性指明了哪些樹(shù)節(jié)點(diǎn)是線程開(kāi)始方法,顯然這些屬性應(yīng)該定義在表示方法的樹(shù)節(jié)點(diǎn)上。在MethodDecl節(jié)點(diǎn)上定義綜合屬性isMainO和isRunO,這兩個(gè)屬性的默認(rèn)值為假。isMainO屬性表示的是該節(jié)點(diǎn)是否為前文提到的main方法,即驗(yàn)證方法簽名是否一致。isRun O屬性表示的是該節(jié)點(diǎn)是否為前文提到的run方法,這時(shí)需要驗(yàn)證兩點(diǎn):
[0039]1.方法簽名是否一致;
[0040]2.該方法所在類是否繼承自java.lang.Thread或其子類,或者實(shí)現(xiàn)了 java.lang.Runnable 或其子接口。
[0041]第二類屬性的作用是從MethodDecl節(jié)點(diǎn)開(kāi)始向抽象語(yǔ)法樹(shù)根(Program節(jié)點(diǎn))傳遞線程開(kāi)始方法這一信息。一般而言,從MethodDecl節(jié)點(diǎn)回溯到抽象語(yǔ)法樹(shù)根節(jié)點(diǎn),依次經(jīng)過(guò)ClassDecl節(jié)點(diǎn),Compilat1nUnit節(jié)點(diǎn),最后到達(dá)Proram節(jié)點(diǎn)。在這些節(jié)點(diǎn)上定義綜合(聚集)starter O屬性,如圖2。Program節(jié)點(diǎn)將其所有孩子