專利名稱:基于語(yǔ)法重構(gòu)的代碼級(jí)構(gòu)件組裝方法
技術(shù)領(lǐng)域:
本發(fā)明涉及軟件工程技術(shù)領(lǐng)域,尤其是指軟件開發(fā)中基于語(yǔ)法重構(gòu)的代碼級(jí)構(gòu)件組裝方法。
背景技術(shù):
構(gòu)件是指具有相對(duì)獨(dú)立功能和可復(fù)用的軟件模塊,它使得軟件開發(fā)人員在開發(fā)新系統(tǒng)時(shí) 能夠充分利用過(guò)去的經(jīng)驗(yàn)和功能模塊,而不必重復(fù)"制造輪子",從而避免了軟件開發(fā)中的重 復(fù)勞動(dòng)。隨著CBSE(Component-Based Software Engineering,基于構(gòu)件的軟件工程)成為一種 重要的中間件技術(shù)以來(lái),在金融、教育、電子商務(wù)、電子政務(wù)、醫(yī)療衛(wèi)生等應(yīng)用領(lǐng)域中得到 了大量應(yīng)用,為提高軟件利用程度和軟件開發(fā)的效率發(fā)揮了很好的作用。
作為基于構(gòu)件的軟件開發(fā)的核心技術(shù),構(gòu)件組裝技術(shù)的研究已得到了廣泛開展。構(gòu)件組 裝方法一般分為"黑盒"、"白盒"、"灰盒"三種,其中"灰盒"組裝方法一直備受關(guān)注。其研究重 點(diǎn)主要集中在基于框架的方法、基于連接子的方法和基于膠合代碼的方法等,本發(fā)明提出的 基于語(yǔ)法重構(gòu)的代碼級(jí)構(gòu)件組裝方法與其中的膠合代碼的方法相近。
在軟件開發(fā)過(guò)程中,選擇使用哪種程序語(yǔ)言往往是依據(jù)領(lǐng)域需求而定。例如,在流程處 理較為明顯的軟件系統(tǒng)中,通常使用面向過(guò)程的語(yǔ)言(如C,Pascal, COBOL等)來(lái)編程,而 在信息處理較為常見的軟件系統(tǒng)中,則多數(shù)采用面向?qū)ο蟮恼Z(yǔ)言(如0++, Java等)。程序語(yǔ) 言的分類不只這兩種,但目前存在的大多數(shù)程序語(yǔ)言普遍都有一個(gè)缺陷,那就是不支持代碼 的構(gòu)件化和組裝,而這將大大阻礙代碼片斷的復(fù)用。而今,許多粗粒度構(gòu)件的復(fù)用已經(jīng)得到 了大量的研究,而程序語(yǔ)言缺乏內(nèi)建的可重用和可組裝機(jī)制這一缺憾,無(wú)疑阻礙了針對(duì)細(xì)粒 度的代碼級(jí)構(gòu)件的復(fù)用研究。
發(fā)明內(nèi)容
為解決以上問題,本發(fā)明提出了一種靈活,開放,且獨(dú)立于各類語(yǔ)由的基于語(yǔ)法重構(gòu)的 代碼級(jí)構(gòu)件組裝方法。
一種基于語(yǔ)法重構(gòu)的代碼級(jí)構(gòu)件組裝方法,包括如下步驟
1) 將程序語(yǔ)言的語(yǔ)法規(guī)范進(jìn)行擴(kuò)展,建立使該語(yǔ)言可構(gòu)件化、可組裝化的新語(yǔ) 法規(guī)范;
2) 對(duì)依據(jù)所述新語(yǔ)法規(guī)范創(chuàng)建的代碼級(jí)構(gòu)件進(jìn)行組裝。 進(jìn)一步的,所述步驟l)具體包括以下步驟
3(1) 從程序語(yǔ)言的語(yǔ)法規(guī)范中分離出抽象語(yǔ)法和具體語(yǔ)法;
(2) 在任一個(gè)語(yǔ)法項(xiàng)目添加可用來(lái)作為之后構(gòu)件組裝時(shí)的插入口的新的語(yǔ)法子 項(xiàng),成為新的語(yǔ)法項(xiàng)目,并針對(duì)新的語(yǔ)法項(xiàng)目,分別編寫其抽象語(yǔ)法與具體語(yǔ)法。
(3) 根據(jù)擴(kuò)展后的語(yǔ)法規(guī)范,創(chuàng)建其語(yǔ)法識(shí)別及分析器。
更進(jìn)一步的,所述抽象語(yǔ)法是對(duì)語(yǔ)法樹的層次和語(yǔ)法節(jié)點(diǎn)間的關(guān)聯(lián)關(guān)系進(jìn)行描述;所述 具體語(yǔ)法是編譯器可用的語(yǔ)法規(guī)則。
進(jìn)一步的,所述步驟2)具體包括以下步驟
① 建立符合所述新語(yǔ)法規(guī)范的代碼級(jí)構(gòu)件;
② 進(jìn)行圖形化的構(gòu)件組裝;
③ 在組裝腳本的執(zhí)行階段中根據(jù)組裝構(gòu)件的特性生成組裝結(jié)果。 更進(jìn)一步的,所述步驟②屮圖形化的構(gòu)件組裝,包括各個(gè)構(gòu)件的關(guān)聯(lián)和對(duì)各個(gè)構(gòu)件類型
進(jìn)行匹配驗(yàn)證。
木發(fā)明提出了一種在現(xiàn)有的程序語(yǔ)言中添加可構(gòu)件化以及可復(fù)用性的方法,對(duì)程序語(yǔ)言 的固有語(yǔ)法進(jìn)行拓展,從而能夠依據(jù)此新語(yǔ)法,創(chuàng)建并組裝代碼級(jí)構(gòu)件,增加代碼片斷的可 重用性,快速生成新的程序。首先對(duì)程序語(yǔ)言的語(yǔ)法模型進(jìn)行擴(kuò)展,建立一套促進(jìn)該語(yǔ)言可 構(gòu)件化、可組裝化的新語(yǔ)法規(guī)范,進(jìn)而對(duì)依據(jù)新語(yǔ)法規(guī)范創(chuàng)建的代碼級(jí)構(gòu)件進(jìn)行組裝,保證 代碼級(jí)構(gòu)件的可復(fù)用性。
本發(fā)明的方法,同一個(gè)構(gòu)件在不同應(yīng)用中復(fù)用時(shí),只要擁有相同的程序語(yǔ)言拓展基礎(chǔ), 就能方便地起到構(gòu)件復(fù)用的效果;在保持組裝圖形不修改的情況下,只要構(gòu)件名稱和類型未 經(jīng)改動(dòng),其他構(gòu)件內(nèi)的變更都可實(shí)時(shí)反映到組裝結(jié)果中,這對(duì)于程序的開發(fā)、集成、演化具 有十分重大的意義。本發(fā)明具有語(yǔ)言獨(dú)立的優(yōu)點(diǎn),可用于各類領(lǐng)域中的軟件復(fù)用。結(jié)合領(lǐng)域 構(gòu)件庫(kù),可支持不同應(yīng)用領(lǐng)域的業(yè)務(wù)流程集成、復(fù)用,以及面向用戶的個(gè)性化服務(wù)的定制和 集成。
圖1為本發(fā)明所述的組裝方法整體方案圖 圖2為本發(fā)明一實(shí)施例的組裝過(guò)程示意圖
具體實(shí)施例方式
以下結(jié)合附圖和具體實(shí)例對(duì)本發(fā)明進(jìn)行詳細(xì)說(shuō)明。
一種基于語(yǔ)法重構(gòu)的代碼級(jí)構(gòu)件組裝方法,如圖l,包括兩大步驟, 一是對(duì)程序語(yǔ)言的語(yǔ) 法進(jìn)行抽象和拓展,二是通過(guò)語(yǔ)法重構(gòu)的方式對(duì)代碼級(jí)構(gòu)件進(jìn)行組裝。其中,前者是后者得以成功進(jìn)行的基礎(chǔ),后者則體現(xiàn)了前者的功用。
由于本方法具有語(yǔ)言獨(dú)立的優(yōu)點(diǎn),在本實(shí)例中,我們暫以流行的Java語(yǔ)言為例,將其語(yǔ) 法進(jìn)行拓展后,針對(duì)Java語(yǔ)言的代碼級(jí)構(gòu)件實(shí)現(xiàn)組裝。
接下來(lái),依序?qū)Ρ緦?shí)例的各個(gè)步驟進(jìn)行說(shuō)明。
Java語(yǔ)言語(yǔ)法拓展部分
步驟一、抽象出Java語(yǔ)言的語(yǔ)法規(guī)范,分別列出其抽象語(yǔ)法與具體語(yǔ)法。 由于Java語(yǔ)言的語(yǔ)法結(jié)構(gòu)相當(dāng)龐大,本例中僅抽取其中較為簡(jiǎn)單的語(yǔ)法片斷為例子,對(duì) 其進(jìn)行拓展。以類的成員變量聲明語(yǔ)法片斷為例,我們抽取出其相對(duì)應(yīng)的抽象語(yǔ)法和具體語(yǔ)
法分別如下:_
AttributeDeclaration = modifier-Modifier*, type: Identifier, name: Identifier;
Identifier = value: String;__
如上是成員變量聲明(AttributeDeclaration)的抽象語(yǔ)法,其中Modifier類型是一個(gè)語(yǔ)法 終結(jié)符,即各類修飾符,如public, private, protected, final, static等;Identifier是一般字符
串類型。_
AttributeDeclaration ::= modifier* type name ";"; Identifier ::= value[('a'..'zTA'..'Z') 0'..'2'|'八'.."'0'..'9')*];
如上是以EBNF規(guī)范表達(dá)的具體語(yǔ)法,以正則表達(dá)式的方式確定了 AttributeDeclaration 的具體書寫規(guī)范。
歩驟二、針對(duì)AttributeDeclaration這一節(jié)點(diǎn),我們對(duì)其進(jìn)行擴(kuò)展。首先在其下增加一個(gè)新
的語(yǔ)法子項(xiàng)AttributeSlot,作為組裝時(shí)的插槽,并為之編寫相應(yīng)的抽象和具體語(yǔ)法。
AttributeSlot ==> java.AttributeDeclaration; AttributeSlot => metaModel.Slot; AttributeSlot = name:Identifier, type:Type;
Type = value:String;_
如上是AttributeSlot的抽象語(yǔ)法,表明AttributeSlot同時(shí)繼承自Java語(yǔ)法(先前定義的Java
語(yǔ)法)中的AttributeDeclaration屬性以及一個(gè)Slot屬性(本方法己內(nèi)建了 Slot語(yǔ)法的定義)。 AttributeSlot ::= "<<" name ":" type " ";
Type ::= value[('a'..'zTA'..'Z') ('a'..'z'rA'..'ZT0'..'9')*] "."construct[('a'..'zTA'..'Z') ('a'..,z'rA'..'Z'|'0,..'9')*];_
如上是AttributeSlot的具體語(yǔ)法,要求其在代碼中書寫為"<< name : type >>"形式。 步驟三、從拓展后的語(yǔ)法生成相應(yīng)的語(yǔ)言解析器,此步驟可通過(guò)一些編譯器框架實(shí)現(xiàn)。 在本例中我們采用了 ANTLR框架實(shí)現(xiàn)。 Java代碼級(jí)構(gòu)件組裝部分步驟四、創(chuàng)建符合新的Java語(yǔ)法規(guī)范的代碼構(gòu)件。在語(yǔ)法完備的情況下,所有的Java文 件應(yīng)該都可以作為新規(guī)范的代碼級(jí)構(gòu)件。但根據(jù)組裝的需要,我們?cè)贘ava構(gòu)件中添加了相應(yīng) 的Slot語(yǔ)法,作為組裝時(shí)的插槽,如下即是一個(gè)相對(duì)簡(jiǎn)單的Java構(gòu)件片斷,用作組裝時(shí)的宿
主構(gòu)件:_
public class Car {
private String name)
《myAttribute : java.AttributeDecIaration》
public void startEngine() { engine, start();
j_
其中,《myAttribute :』3¥&汍《1^1^06(;1虹&11011 句便是符合AttributeSIot規(guī)范的一個(gè)組裝 插槽定義,并且規(guī)定了可插入此處的代碼必須符合AttributeDeclaration語(yǔ)法規(guī)范。
接下來(lái),準(zhǔn)備一個(gè)符合AttributeDeclaration規(guī)范的代碼片斷,如下所示 private Engine engine;_
步驟五、對(duì)兩個(gè)代碼級(jí)構(gòu)件進(jìn)行組裝。根據(jù)本發(fā)明,可以設(shè)計(jì)出多種不同的組裝方法,
從最基本的插入組裝,到可依據(jù)用戶需求定制的其他組裝(抽取、聲明、調(diào)用等)均可實(shí)現(xiàn)。 以下我們介紹最基本的插入組裝,此類組裝要求將一個(gè)代碼級(jí)構(gòu)件插入到一個(gè)指定類型的 Slot中(即前者的代碼類型與后者Slot中指定的類型相同)。
出于用戶操作便利性的考慮,本發(fā)明中提供了圖形化的組裝方式,以組裝節(jié)點(diǎn)的形式展 示構(gòu)件,以連接線的形式展示組裝過(guò)程。
如圖2所示,從代碼級(jí)構(gòu)件Engine指向Car構(gòu)件中的MyAttribute這個(gè)Slot,即構(gòu)成了我 們的插入組裝,并且將組裝后的Car輸出到一個(gè)NewCar文件中。
第六步、針對(duì)相應(yīng)的組裝圖形,后臺(tái)自動(dòng)生成組裝腳本,腳本的內(nèi)容是依照組裝圖形自
動(dòng)轉(zhuǎn)換的。如上圖中,相應(yīng)的組裝腳本如下-composition program
fragmentlist java.CompilationUnit Car=/Car,rjava;
fragmentlist java.AttributeDecIaration Engine=/Engine, rjava;
bind myAttribute on Car with Engine;
print Carto /NewCar Java;
執(zhí)行組裝腳本后,即進(jìn)行組裝,最終的組裝結(jié)果如下:
public class Car {
private String name;
6private Engine engine;
public void startEngine() { engine.start();
j_
權(quán)利要求
1. 一種基于語(yǔ)法重構(gòu)的代碼級(jí)構(gòu)件組裝方法,其特征在于包括如下步驟1)將程序語(yǔ)言的語(yǔ)法規(guī)范進(jìn)行擴(kuò)展,建立使該語(yǔ)言可構(gòu)件化、可組裝化的新語(yǔ)法規(guī)范;2)對(duì)依據(jù)所述新語(yǔ)法規(guī)范創(chuàng)建的代碼級(jí)構(gòu)件進(jìn)行組裝。
2. 根據(jù)權(quán)利要求1所述的基于語(yǔ)法重構(gòu)的代碼級(jí)構(gòu)件組裝方法,其特征在于所 述步驟l)具體包括以下步驟(1) 從程序語(yǔ)言的語(yǔ)法規(guī)范中分離出抽象語(yǔ)法和具體語(yǔ)法;(2) 在任一個(gè)語(yǔ)法項(xiàng)目添加可用來(lái)作為之后構(gòu)件組裝時(shí)的插入口的新 的語(yǔ)法子項(xiàng),成為新的語(yǔ)法項(xiàng)目,并針對(duì)新的語(yǔ)法項(xiàng)目,分別編寫其抽象語(yǔ) 法與具體語(yǔ)法。(3) 根據(jù)擴(kuò)展后的語(yǔ)法規(guī)范,創(chuàng)建其語(yǔ)法識(shí)別及分析器。
3. 根據(jù)權(quán)利要求2所述的基于語(yǔ)法重構(gòu)的代碼級(jí)構(gòu)件組裝方法,其特征在于 所述抽象語(yǔ)法是對(duì)語(yǔ)法樹的層次和語(yǔ)法節(jié)點(diǎn)間的關(guān)聯(lián)關(guān)系進(jìn)行描述;所述具體 語(yǔ)法是編譯器可用的語(yǔ)法規(guī)則。
4. 根據(jù)權(quán)利要求1所述的基于語(yǔ)法重構(gòu)的代碼級(jí)構(gòu)件組裝方法,其特征在于 所述步驟2)具體包括以下步驟① 建立符合所述新語(yǔ)法規(guī)范的代碼級(jí)構(gòu)件;② 進(jìn)行圖形化的構(gòu)件組裝;③ 在組裝腳本的執(zhí)行階段中根據(jù)組裝構(gòu)件的特性生成組裝結(jié)果。
5. 根據(jù)權(quán)利要求4所述的基于語(yǔ)法重構(gòu)的代碼級(jí)構(gòu)件組裝方法,其特征在于 所述步驟②中圖形化的構(gòu)件組裝,包括各個(gè)構(gòu)件的關(guān)聯(lián)和對(duì)各個(gè)構(gòu)件類型進(jìn)行 匹配驗(yàn)證。
全文摘要
本發(fā)明涉及軟件工程技術(shù)領(lǐng)域,尤其是指軟件開發(fā)中基于語(yǔ)法重構(gòu)的代碼級(jí)構(gòu)件組裝方法。一種基于語(yǔ)法重構(gòu)的代碼級(jí)構(gòu)件組裝方法,包括如下步驟1)將程序語(yǔ)言的語(yǔ)法規(guī)范進(jìn)行擴(kuò)展,建立使該語(yǔ)言可構(gòu)件化、可組裝化的新語(yǔ)法規(guī)范;2)對(duì)依據(jù)所述新語(yǔ)法規(guī)范創(chuàng)建的代碼級(jí)構(gòu)件進(jìn)行組裝。本發(fā)明具有語(yǔ)言獨(dú)立的優(yōu)點(diǎn),可用于各類領(lǐng)域中的軟件復(fù)用。結(jié)合領(lǐng)域構(gòu)件庫(kù),可支持不同應(yīng)用領(lǐng)域的業(yè)務(wù)流程集成、復(fù)用,以及面向用戶的個(gè)性化服務(wù)的定制和集成。
文檔編號(hào)G06F9/44GK101446895SQ20081016339
公開日2009年6月3日 申請(qǐng)日期2008年12月18日 優(yōu)先權(quán)日2008年12月18日
發(fā)明者健 吳, 吳朝暉, 尹建偉, 瑩 李, 琳 趙, 鄧水光 申請(qǐng)人:浙江大學(xué)