一種基于對象實例的行為變體的jcop擴展實現(xiàn)方法
【專利摘要】本發(fā)明公開了一種基于對象實例的行為變體的JCOP擴展實現(xiàn)方法。上下文敏感軟件中引入多線程編程使得上下文觸發(fā)的跨線程行為變化成為常態(tài),其中常見的是同一個類型的多個實例在應對相同上下文時,需要作出不同的行為變化。而現(xiàn)有面向上下文編程語言僅支持以類為單位的行為變體定義,難以滿足此類應用場景的需求。發(fā)明專利申請?zhí)岢隽艘粋€基于對象的行為變體模型,以此為基礎,在JCOP語言中引入相應的語法設施,實現(xiàn)了一個擴展的JCOP語言,在編程模型和編程語言上解決了上述問題。
【專利說明】一種基于對象實例的行為變體的JCOP擴展實現(xiàn)方法
【技術領域】
[0001]本發(fā)明涉及面向上下文編程中行為變體模型及編程語言實現(xiàn)方法,特別是基于對象實例的行為變體模型,擴展了 JCOP編譯器與運行環(huán)境。
【背景技術】
[0002]隨著上下文在軟件系統(tǒng)中發(fā)揮著越來越大的作用,開發(fā)和設計上下文敏感軟件逐漸形成一種趨勢。為了高效地進行上下文敏感軟件的設計與開發(fā),學者們提出了不同抽象級別的方案,其中既有軟件體系架構級別,又有基于組件的設計。面向上下文編程(ContextOriented Programming,COP)方法為開發(fā)上下文敏感軟件提供了語言級別的解決方案。隨著應用場景的復雜化和對運行效率要求的提高,上下文敏感軟件的開發(fā)中大量引入多線程編程,使得上下文觸發(fā)的跨線程行為變化成為常態(tài)。一個典型的需求是,同一類型的多個實例在應對相同上下文時,需要作出不同的行為變化。
[0003]COP方法使用行為變體(behav1ral variat1n)來描述能替代或者改變軟件基本行為的行為。而傳統(tǒng)的COP語言往往擴展自面向對象語言,行為變體是以面向對象編程中的方法/函數(shù)體現(xiàn),即行為變體以類為單位進行定義。此種處理方法,要求開發(fā)人員在定義行為變體時,將對應同一個上下文的行為變體定義在一處(如同用類封裝相關方法)。也導致了程序在運行時刻,激活某個行為變體,同一個類型的多個實例的行為只能發(fā)生相同的改變。
【發(fā)明內容】
[0004]發(fā)明目的:為了解決該問題,要求擴展行為變體的定義方式,使得同類型的不同對象實例在相同的上下文環(huán)境中擁有不同行為,即,上下文敏感軟件的多線程編程中同一個類型的多個實例在應對相同上下文時,需要作出不同的行為變化場景需求。本發(fā)明基于此問題提出了一種基于對象實例的行為變體模型的JCOP擴展實現(xiàn)方法。
[0005]技術方案:一種基于對象實例行為變體的JCOP擴展實現(xiàn)方法,包括如下部分:
[0006]I)基于對象實例的行為變體模型;
[0007]2)實現(xiàn)該行為變體模型的用于擴展JCOP的語言機制;
[0008]3) JCOP擴展語言的編譯器和運行支撐環(huán)境。
[0009]基于對象實例的行為變體模型,行為變體以對象實例為單位進行定義,區(qū)別于傳統(tǒng)COP語言的以類為單位的定義方式。傳統(tǒng)模型中,部分方法描述程序中的行為變化;行為層封裝一組相關的行為變化,即行為層包含一組相關的部分方法。新模型中,行為層引入部分方法組用于描述一個行為變化以及其他備選行為變化,部分方法組被用來定義以對象實例為單位的行為變體。
[0010]基于上述語言模型,本發(fā)明擴展JCOP語言,引入兩類關鍵字group和instancewith/instancewithout0
[0011]a)定義部分方法組group:
[0012]group部分方法簽名({語句塊I}) ({語句塊2})…({語句塊η})
[0013]該語句定義了多個具有相同方法簽名的部分方法,并且這些部分方法(行為變體)依附于同一個類,該語法結構與普通的部分方法一樣,需定義在行為層layer中。
[0014]b)實例激活 instancewith/instancewithout
[0015]instancewith(行為層名layer,{對象實例objl, obj2,…},{行為變體編號i, J.,…})
[0016]該語句在指定的對象實例objl上激活某行為層layer的第i個行為變體,在指定對象實例ob j2上激活某行為層layer的第j個行為變體。
[0017]instancewithout (行為層名 layer, {對象實例 objl, obj2,…})
[0018]該語句在指定對象實例objl、obj2上去活行為層layer。
[0019]COP語言中,用行為層封裝一組相關的行為變體;因而,激活行為行為層與激活行為變體同義。
[0020]所述編譯器采用JastAdd開發(fā)框架實現(xiàn)。編譯器輸入為jcop源代碼文件(.jcop)以及其他java源文件(.java);編譯器首先利用詞法分析器,語法分析器為整個代碼建立抽象語法樹,其次采用抽象語法樹節(jié)點重寫技術實現(xiàn)JCOP節(jié)點到Java節(jié)點的轉化,最后利用原有java編譯器進行編譯;
[0021]所述運行支撐環(huán)境為引入對象級別行為層隊列。新的激活機制,只能影響對象級別行為層隊列。運行支撐環(huán)境不僅保證該行為層隊列優(yōu)先于線程級別的行為層隊列執(zhí)行,而且不同的對象級別行為層隊列不會相互影響。
[0022]編譯器會將支撐環(huán)境代碼與源代碼一起進行編譯,最終生成可被標準Java虛擬機執(zhí)行的class文件。
[0023]有益效果:與現(xiàn)有技術相比,本發(fā)明提供的基于對象實例行為變體的JCOP擴展實現(xiàn)方法,解決了上下文敏感軟件中多線程編程經(jīng)常遇到的問題:同一個類型的多個實例在應對相同上下文時,需要作出不同的行為變化。并且提供了一個可用的編譯器及運行支撐環(huán)境。
【專利附圖】
【附圖說明】
[0024]圖1為同一上下文中多個同類實例的消息分發(fā);
[0025]圖2為編譯器的結構圖;
[0026]圖3為代碼編譯前后,其抽象語法樹節(jié)點的變化情形;
[0027]圖4為兩種行為層隊列執(zhí)行的先后順序;
[0028]圖5為Lego小車在不同上下文中左右輪的行為變化;
[0029]圖6為Lego小車中定義部分方法組以及實例激活機制代碼示例。
【具體實施方式】
[0030]下面結合具體實施例,進一步闡明本發(fā)明,應理解這些實施例僅用于說明本發(fā)明而不用于限制本發(fā)明的范圍,在閱讀了本發(fā)明之后,本領域技術人員對本發(fā)明的各種等價形式的修改均落于本申請所附權利要求所限定的范圍。
[0031]1、基于對象實例的行為變體模型
[0032]傳統(tǒng)COP模型中,行為變體(部分方法)表示改變或者替換軟件基本行為的行為;行為層用于封裝與特定上下文相關的一組行為變體;動態(tài)行為層激活機制則通過運行時刻激活行為層,從而能夠動態(tài)地影響系統(tǒng)行為。
[0033]所述基于對象實例的行為變體模型,在上述模型中引入部分方法組。部分方法組用于描述特定上下文中類的實例擁有的同一行為的多種可能變化。部分方法組被用來定義以對象實例為單位的行為變體。
[0034]引入部分方法組后,在激活含有部分方法組的行為層時,需要知道激活哪一個行為變體,原有激活機制不再適用,因而需要實例激活機制(見運行支撐環(huán)境)。
[0035]從消息分發(fā)角度來看,傳統(tǒng)COP模型如圖Ι-a所示,在上下文C2中,同類實例Y
Y2接收Hi1消息,均執(zhí)Rm1K2方法,同一上下文中多個同類實例的消息分發(fā)結果相同;基于對象實例的行為變體模型如圖l_b所示,在上下文C2中,同類實例Y Y 2接收m凋息,分別執(zhí)行IVK2方法和方法,實現(xiàn)了同一上下文中多個同類實例的差異化消息分發(fā)。
[0036]2、擴展JCOP的語言機制
[0037]本發(fā)明向JCOP語言中添加了兩類關鍵字。
[0038]第一類是group關鍵字,用于定義部分方法組。利用group關鍵字,可在行為層layer中定義一組具有相同方法簽名的部分方法。group關鍵字的用法如下:
[0039]group部分方法簽名({語句塊I}) ({語句塊2})...({語句塊η})
[0040]部分方法組的定義與部分方法存在兩點不同:第一,部分方法組由group關鍵字修飾;第二,部分方法組的方法體有多個,上述用法分別定義了方法體為語句塊1,語句塊2,語句塊3......的多個相同方法簽名的部分方法。
[0041]第二類是instancewith/instanewithout關鍵字,用于實例激活機制。instancewith 關鍵字用于激活,instancewithout 用于去活。instancwith/instancewithout關鍵字的用法如下:
[0042]instancewith(行為層名layer,{對象實例objl, obj2,…},{行為變體編號i, j,…})
[0043]instancewithout (行為層 layer, {對象實例 objl, obj2,...})
[0044]在語法層面,instancewith/instancewithout是一條 JCOP(重寫為 Java)語句。上述用法中,激活過程的效果是在指定的對象實例objl上激活某行為層layer的第i個行為變體,在指定對象實例obj2上激活某行為層layer的第j個行為變體。而去活過程的效果是在指定對象實例objl,obj2上去活行為層layer。
[0045]3、編譯器與運行支撐環(huán)境
[0046]本發(fā)明擴展JCOP編譯器,新的編譯器的結構如圖2所示,它包括詞法分析器,語法分析器,抽象語法樹改寫器,擴展的JCOP運行支撐環(huán)境幾大部分組成。其中,抽象語法樹改寫器負責將JCOP程序轉換成Java程序。
[0047]所述編譯器采用可擴展的JastAdd框架開發(fā)。該框架允許對抽象語法樹進行改寫。編譯器開發(fā)人員只需要負責描述建立抽象語法樹規(guī)則,以及重寫語法樹這兩個部分的功能。
[0048]JastAdd框架中利用.ast文件描述抽象語法樹節(jié)點之間的關系;.flex文件用于描述詞法規(guī)則,.parser文件描述建立抽象語法樹的規(guī)則。這些代碼均由JastAdd整合,組成最終的編譯器。部分方法組(PartialMethodGroupDecl節(jié)點)的建立規(guī)則是:
[0049]I)PartialMethodGroupDecl partial_method_group =
[0050]partial_method_group_header.m method_blocks.1
[0051]2)PartialMethodGroupDecl partial_method_group_header =
[0052]GROUP modifiers, m ? type.retType name_pattern.pattern LPAREN formal_parameter」ist.params ? RPAREN throws, except1ns ?
[0053]3)PartialMethodGroupDecl partial_method_group_header =
[0054]GROUP modifiers, m ? VOID name_pattern.pattern LPAREN formal_parameter_list, params ? RPAREN throws, except1ns ?
[0055]4)List method_blocks =
[0056]method_group_body.bImethod_blocks.1 method_group_body.b
[0057]簡言之,上述規(guī)則將部分方法組視為一個擁有多個方法塊的方法。
[0058]實例激活機制(InstanceLayerActivat1n/InstanceLayerDeactivat1n節(jié)點)對應的規(guī)則是
[0059]5)Access method_invocat1n =
[0060]INSTANCE_LAYER_ACTIVAT1N LPAREN argument_list.1 RPAREN
[0061]6)Access method_invocat1n =
[0062]INSTANCE_LAYER_DEACTIVAT1N LPAREN argument_list.1 RPAREN
[0063]簡言之,上述規(guī)則將實例激活機制的關鍵字視為一類特殊的Access節(jié)點。
[0064]重寫語法樹節(jié)點的代碼由JastAdd采用面向剖面編程(Aspect OrientedProgramming,A0P)的方式編織到最終的編譯器中。抽象語法樹建立后,重寫過程被編譯器自動調用。抽象語法樹在重寫前后的變化如圖3所示。PartialMethodGroupDecl節(jié)點(部分方法組)包含了多個相同簽名的部分方法(行為變體),這些部分方法被改寫為Java抽象語法樹中的不同方法簽名的節(jié)點MethodDecl。此外,InstanceLayerActivat1n節(jié)點被改寫成對運行支撐環(huán)境中JCOP.1nstancewith()方法的調用;InstanceLayerDeactivat1n節(jié)點被改寫成對運行支撐環(huán)境中JCOP.1nstancewithout O方法的調用。
[0065]原JCOP運行支撐環(huán)境,提供了線程級別的行為層隊列來實現(xiàn)線程內上下文變化引起的行為變化,新運行支撐環(huán)境提供的與對象綁定的行為層隊列。運行支撐環(huán)境采用hashmap存儲〈對象,對象級別的行為層隊列 >這樣的鍵值對。instancewith關鍵字(JC0P.1nstancewith方法)會記錄不同實例需要執(zhí)行的是哪一個行為變體,并修改對應的的對象級別行為層隊列,不影響對象所處線程持有的行為層隊列。在執(zhí)行時刻,對象級別的行為層隊列在執(zhí)行的順序上優(yōu)先于與線程級別的行為層隊列(如圖4),從而實現(xiàn)同類實例在相同上下文中互不干擾地執(zhí)行不同行為變體。
[0066]4、使用案例
[0067]圖5描述使用Lego部件拼裝的小車在不同上下文中的行為變化。小車左輪和右輪應該是同一個類Wheel的兩個實例,分別由兩個線程控制轉動。正常上下文時(圖5-a),小車沿著直線行走,也即左輪和右輪在正常下文中的行為都是轉動相同角度。但是前方出現(xiàn)障礙物時(圖5-b),小車需要左拐彎躲避障礙物,處于左拐彎內側的左輪轉動角度要小于右輪轉動角度,也即左輪和右輪的行為在障礙物上下文時不一樣。
[0068]根據(jù)上面的應用需求,我們定義基礎類Wheel表示小車車輪,如圖6_a ;行為層TurnLeftLayer用于封裝左轉彎上下文相關的行為變體。由于左轉彎上下文中,Wheel類的兩個實例IeftWheel,rightWheel需要有不同行為變化,因而在行為層TurnLeftLayer中定義一個部分方法組Wheel, run O,“包含”兩個行為變體,該方法組的代碼如圖6_b。
[0069]在控制小車運動的線程中,檢測到需要左拐彎時,程序中應該使用instancewith關鍵字,為leftWheel,rightffheel實例分別激活TurnLeftLayer中的第O個和第I個行為變體,如圖6-c。左拐彎完成后需要執(zhí)行其他操作,使用instancewithout關鍵字,為leftffheel, rightffheel 去活行為變體,如圖 6_d0
[0070]將上述代碼使用編譯器進行編譯,啟動Lego小車,運行結果符合預期。
[0071]綜上所述,本發(fā)明所述的基于對象實例的行為變體模型的JCOP擴展實現(xiàn)方法,提出了基于對象實例的行為變體模型,解決同一上下文中,同類的不同實例的不同行為變化的需求;而且向現(xiàn)有JCOP語言中增加了兩類語法設施,以及相關編譯器,運行支撐環(huán)境,提供了一個可用的編程方法。
【權利要求】
1.一種基于對象實例行為變體的JCOP擴展實現(xiàn)方法,其主要特征包括如下幾個部分: 1)基于對象實例的行為變體模型; 2)實現(xiàn)該行為變體模型的用于擴展JCOP的語言機制; 3)JCOP擴展語言的編譯器和運行支撐環(huán)境。 其中,所述基于對象實例的行為變體模型,用部分方法組表示某一上下文中的同一行為的多種可能變化; 所述實現(xiàn)該行為變體模型的用于擴展JCOP的語言機制由兩類語法設施組成; 所述JCOP擴展語言的編譯器和運行支撐環(huán)境,編譯器采用JastAdd開發(fā)框架開發(fā),重寫抽象語法樹節(jié)點達到編譯目的;運行支撐環(huán)境引入對象級別行為層隊列,使得同類實例間的執(zhí)行過程互不干涉。
2.根據(jù)權利要求1所述的基于對象實例的行為變體模型的JCOP擴展實現(xiàn)方法,其特征在于,所述行為變體模型中,行為變體以對象實例為單位進行定義,行為層引入部分方法組,描述同一行為的多種可能變化,部分方法組可以用于定義以對象實例為單位的行為變體。
3.根據(jù)權利要求1所述的基于對象實例的行為變體模型的JCOP擴展實現(xiàn)方法,其特征在于,擴展的JCOP語法包括兩類關鍵字:group,以及instancewith/instancewithouto a)定義部分方法組group關鍵字: group部分方法簽名({語句塊1}) ({語句塊2} )...({語句塊η}) 該語句定義了多個具有相同方法簽名的部分方法,它們的方法體分別是語句塊1,語句塊2,語句塊3 ; b)實例激活機制instancewith/instancewithout 關鍵字: instancewith (行為層名layer,{對象實例objl, obj2,...},{行為變體編號i, j,…})該語句在指定的對象實例objl上激活某行為層layer的第i個行為變體,在指定對象實例ob j2上激活某行為層layer的第j個行為變體; instancewithout (行為層 layer,{對象實例 objl, obj2,...}) 該語句在指定對象實例objl,obj2上去活行為層layer ; COP語言中,用行為層封裝一組相關的行為變體;因而,激活行為層與激活行為變體同義。
4.根據(jù)權利要求1所述的基于對象實例的行為變體模型的JCOP擴展實現(xiàn)方法,其特征在于, 所述編譯器采用JastAdd開發(fā)框架實現(xiàn),編譯器輸入為jcop源代碼文件Cjcop)以及其他java源文件(.java);編譯器首先利用詞法分析器,語法分析器為整個代碼建立抽象語法樹,其次采用抽象語法樹節(jié)點重寫技術實現(xiàn)JCOP節(jié)點到Java節(jié)點的轉化,最后利用原有java編譯器進行編譯; 所述運行支撐環(huán)境為引入對象級別行為層隊列,新的激活機制,只能影響對象級別行為層隊列;運行支撐環(huán)境不僅保證該行為層隊列優(yōu)先于線程級別的行為層隊列執(zhí)行,而且不同的對象級別行為層隊列不會相互影響。
【文檔編號】G06F9/44GK104461566SQ201410820282
【公開日】2015年3月25日 申請日期:2014年12月25日 優(yōu)先權日:2014年12月25日
【發(fā)明者】呂建, 徐鋒, 蔣建亮 申請人:南京大學