本發(fā)明涉及一種軟件工程項(xiàng)目技術(shù),特別涉及一種基于xtext的軟件工程設(shè)計(jì)方法。
背景技術(shù):
現(xiàn)今,在軟件開(kāi)發(fā)過(guò)程中,隨著軟件開(kāi)發(fā)的規(guī)模越來(lái)越大,復(fù)雜度越來(lái)越高,不同領(lǐng)域都依托著軟件系統(tǒng)的發(fā)展,實(shí)現(xiàn)了從機(jī)械化向信息化的變革。作為系統(tǒng)工程工程領(lǐng)域中的重要方法特定領(lǐng)域語(yǔ)言(domainspecificlanguage,dsl),以其在特定領(lǐng)域工程項(xiàng)目中的高開(kāi)發(fā)效率、低溝通成本、高抽象性和高復(fù)用性著稱。在新型的軟件工程項(xiàng)目中,越來(lái)越多的利用到了dsl。
基于現(xiàn)有的dsl設(shè)計(jì)方案,由于設(shè)計(jì)流程與方式的局限性,使得dsl的構(gòu)建成本過(guò)高。又因?yàn)閐sl定制的不規(guī)范性,大量良莠不齊的dsl誕生,這也使得語(yǔ)言噪聲問(wèn)題嚴(yán)重。最后源于dsl的適用范圍過(guò)窄,一個(gè)軟件環(huán)境的微小變化就可能導(dǎo)致dsl的失效,這使得優(yōu)秀的dsl被過(guò)度的使用,而陷入了語(yǔ)言集中營(yíng)危機(jī)。
技術(shù)實(shí)現(xiàn)要素:
本專利的目的就是提出基于xtext的特定領(lǐng)域語(yǔ)言的軟件工程設(shè)計(jì)方法,解決上述現(xiàn)有技術(shù)的問(wèn)題。
本發(fā)明一種基于xtext的特定領(lǐng)域語(yǔ)言的軟件工程設(shè)計(jì)方法,其中,包括:步驟一、由emf元模型到xtext語(yǔ)義模型的轉(zhuǎn)換;驟二、依據(jù)步驟一得到的初始的dsl語(yǔ)義模型采用拓?fù)鋱D結(jié)構(gòu)對(duì)語(yǔ)義模型進(jìn)行驗(yàn)證和優(yōu)化;步驟三、利用xtext的語(yǔ)法驗(yàn)證模塊編輯驗(yàn)證規(guī)則的方法,對(duì)代碼進(jìn)行驗(yàn)證;步驟四、驗(yàn)證完成后生成c/java代碼。
根據(jù)本發(fā)明的基于xtext的特定領(lǐng)域語(yǔ)言的軟件工程設(shè)計(jì)方法的一實(shí)施例,其中,步驟一具體包括:建立元模型以刻畫某種特定領(lǐng)域建模語(yǔ)言和提供支持元模型的建模工具;采用ecore模型作為刻畫特定領(lǐng)域模型的語(yǔ)言,使用xtext中的ecore模型導(dǎo)入功能,自動(dòng)生成多個(gè)dsl相關(guān)文件夾,包括自動(dòng)生成的xx.xtext,其中,xx為項(xiàng)目人員輸入的文件名,生成初始的dsl語(yǔ)義模型。
根據(jù)本發(fā)明的基于xtext的特定領(lǐng)域語(yǔ)言的軟件工程設(shè)計(jì)方法的一實(shí)施例,其中,步驟二包括:由語(yǔ)言的多個(gè)語(yǔ)義模型,根據(jù)emf元模型,得到語(yǔ)義模型的模塊間邏輯關(guān)系以及模塊的輸入輸出,繪出變量的依賴圖;利用深度優(yōu)先算法,由變量的依賴圖繪出拓?fù)浣Y(jié)構(gòu);此時(shí)的拓?fù)鋱D直觀地反映了該語(yǔ)言語(yǔ)義模型的邏輯關(guān)系等信息,拓?fù)鋱D繪制算法包括:(1)頂點(diǎn)表示活動(dòng),邊表示活動(dòng)間先后關(guān)系的有向圖稱做頂點(diǎn)活動(dòng)網(wǎng),稱aov網(wǎng);(2)在aov網(wǎng)中,選擇一個(gè)入度最小出度為0的頂點(diǎn)并輸出之,如果有多個(gè)入度最小出度為0的頂點(diǎn),則比較入度的權(quán)重和,權(quán)重高的優(yōu)先,若不存在權(quán)重值則比較頂點(diǎn)的序號(hào),序號(hào)小的優(yōu)先;(3)從網(wǎng)中刪除此頂點(diǎn)及所有入邊;(4)重復(fù)步驟(2),直至不存在出度為0的頂點(diǎn)為止,如該步無(wú)法執(zhí)行,則執(zhí)行步驟3。
根據(jù)本發(fā)明的基于xtext的特定領(lǐng)域語(yǔ)言的軟件工程設(shè)計(jì)方法的一實(shí)施例,其中,步驟二中還包括對(duì)dsl的語(yǔ)法模型進(jìn)行修改,包括:1、檢查已有的語(yǔ)法模型是否需要優(yōu)化,如果需要優(yōu)化,則執(zhí)行步驟2,如果不需要優(yōu)化則執(zhí)行步驟三;2、若是進(jìn)行模塊屬性的修改則通過(guò)xx.xtext文件進(jìn)行修改;若是代碼格式的修改,則通過(guò)xxformatting.xtend文件進(jìn)行修改;3、得到項(xiàng)目最終的dsl語(yǔ)法模型。
本發(fā)明基于xtext的特定領(lǐng)域語(yǔ)言的軟件工程設(shè)計(jì)方法,規(guī)范dsl設(shè)計(jì)流程,降低dsl構(gòu)建成本,同時(shí)基于xtext的代碼驗(yàn)證模塊,幫助相關(guān)人員調(diào)式代碼,加強(qiáng)dsl對(duì)軟件環(huán)境的適應(yīng)性。最后,讓dsl代碼自動(dòng)生成c/java代碼,避免了語(yǔ)言噪聲與語(yǔ)言集中營(yíng)問(wèn)題。
附圖說(shuō)明
圖1所示為本發(fā)明基于xtext的特定領(lǐng)域語(yǔ)言的軟件工程設(shè)計(jì)方法的流程圖;
圖2所示為本發(fā)明基于xtext的特定領(lǐng)域語(yǔ)言的軟件工程設(shè)計(jì)方法的修改流程圖;
圖3所示為dsl的c/java代碼生成流程圖。
具體實(shí)施方式
為使本發(fā)明的目的、內(nèi)容、和優(yōu)點(diǎn)更加清楚,下面結(jié)合附圖和實(shí)施例,對(duì)本發(fā)明的具體實(shí)施方式作進(jìn)一步詳細(xì)描述。
圖1所示為本發(fā)明基于xtext的特定領(lǐng)域語(yǔ)言的軟件工程設(shè)計(jì)方法的流程圖,如圖1所示,本發(fā)明基于xtext的特定領(lǐng)域語(yǔ)言的軟件工程設(shè)計(jì)方法包括:
步驟一由emf元模型到xtext語(yǔ)義模型的轉(zhuǎn)換,包括:
元建模方法是建立用以刻畫某種建模語(yǔ)言的元模型,并提供支持元模型圖形化建模工具,包含兩個(gè)要素:建立元模型以刻畫某種特定領(lǐng)域建模語(yǔ)言和提供支持元模型的建模工具。
本實(shí)施例中統(tǒng)一采用ecore模型作為刻畫特定領(lǐng)域模型的語(yǔ)言。ecore模型是完整uml的小型簡(jiǎn)化子集,也可以說(shuō)ecore的源頭就是來(lái)自u(píng)ml,所以ecore模型與uml模型的表述上非常相似。同時(shí),本專利采用eclipse的開(kāi)源工具ecoretools作為元模型建立的開(kāi)發(fā)工具,它可以用于設(shè)計(jì)建模語(yǔ)言。
xtext是一種基于文本的領(lǐng)域特定語(yǔ)言開(kāi)發(fā)框架/工具。使用xtext,可以輕松地創(chuàng)建自己的編程語(yǔ)言和領(lǐng)域特定語(yǔ)言。xtext包含dsl的語(yǔ)義模型編輯、語(yǔ)法模型編輯、代碼驗(yàn)證、快速修正等功能。
本發(fā)明使用xtext中的ecore模型導(dǎo)入功能,自動(dòng)生成多個(gè)dsl相關(guān)文件夾(即org.xtext.example.xx,org.xtext.example.xx.sdk,org.xtext.example.xx.tests和org.xtext.example.xx.ui,其中xx為項(xiàng)目人員鍵入的項(xiàng)目名稱),包括自動(dòng)生成的xx.xtext(xx為項(xiàng)目人員輸入的文件名)文件。這個(gè)文件(轉(zhuǎn)換結(jié)果)就是初始的dsl語(yǔ)義模型。
本發(fā)明的所有步驟都是基于后綴名為.xtext的文件及其對(duì)應(yīng)的語(yǔ)義模型展開(kāi)的。
步驟二dsl的語(yǔ)義及語(yǔ)法模型的優(yōu)化,包括:
依據(jù)步驟一中的轉(zhuǎn)換結(jié)果,得到的初始的dsl語(yǔ)義模型。此時(shí),該模型并不能滿足實(shí)際項(xiàng)目的需求,甚至其中可能還存在錯(cuò)誤,所以需要對(duì)該語(yǔ)義模型進(jìn)行驗(yàn)證、修改或者優(yōu)化。本發(fā)明采用拓?fù)鋱D結(jié)構(gòu)對(duì)語(yǔ)義模型進(jìn)行驗(yàn)證和優(yōu)化,包括:
對(duì)一個(gè)有向無(wú)環(huán)圖(directedacyclicgraph簡(jiǎn)稱dag)g進(jìn)行拓?fù)渑判?,是將g中所有頂點(diǎn)排成一個(gè)線性序列,使得圖中任意一對(duì)頂點(diǎn)u和v,若邊(u,v)∈e(g),則u在線性序列中出現(xiàn)在v之前。通常,這樣的線性序列稱為滿足拓?fù)浯涡?topologicalorder)的序列,簡(jiǎn)稱拓?fù)湫蛄小:?jiǎn)單的說(shuō),由某個(gè)集合上的一個(gè)偏序得到該集合上的一個(gè)全序,這個(gè)操作稱之為拓?fù)渑判?。包括?/p>
1、由該語(yǔ)言的多個(gè)語(yǔ)義模型,根據(jù)emf元模型,得到語(yǔ)義模型的模塊間邏輯關(guān)系、模塊的輸入輸出等,繪出變量的依賴圖;
2、利用深度優(yōu)先算法,由變量的依賴圖繪出拓?fù)浣Y(jié)構(gòu)。此時(shí)的拓?fù)鋱D直觀地反映了該語(yǔ)言語(yǔ)義模型的邏輯關(guān)系等信息,拓?fù)鋱D繪制算法原理如下:
(1)通常認(rèn)為頂點(diǎn)表示活動(dòng)、邊表示活動(dòng)間先后關(guān)系的有向圖稱做頂點(diǎn)活動(dòng)網(wǎng)(activityonvertexnetwork),簡(jiǎn)稱aov網(wǎng);
(2)在aov網(wǎng)中,選擇一個(gè)入度最小出度為0的頂點(diǎn)并輸出之,如果有多個(gè)入度最小出度為0的頂點(diǎn),則比較入度的權(quán)重和,權(quán)重高的優(yōu)先。若不存在權(quán)重值則比較頂點(diǎn)的序號(hào),序號(hào)小的優(yōu)先;
(3)從網(wǎng)中刪除此頂點(diǎn)及所有入邊;
(4)重復(fù)步驟(2),直至不存在出度為0的頂點(diǎn)為止。如該步無(wú)法執(zhí)行,則執(zhí)行步驟3。
3、驗(yàn)證繪出的拓?fù)浣Y(jié)構(gòu)。檢查拓?fù)浣Y(jié)構(gòu)是否有環(huán)。如果有環(huán),則證明元模型中存在錯(cuò)誤,需要修改。修改后的元模型,需要在經(jīng)過(guò)在轉(zhuǎn)換后,繼續(xù)執(zhí)行步驟1。如果無(wú)環(huán),則證明該語(yǔ)義模型邏輯上的正確性。
4、如果拓?fù)浣Y(jié)構(gòu)無(wú)環(huán),則由相關(guān)人員檢查該拓?fù)鋱D是否簡(jiǎn)潔、明確、精細(xì)、合乎規(guī)范。如果需要優(yōu)化,則將拓?fù)鋱D對(duì)應(yīng)的語(yǔ)義模型進(jìn)行修改,然后執(zhí)行步驟1。
5、如果拓?fù)浣Y(jié)構(gòu)不再需要優(yōu)化,則得到最終的dsl語(yǔ)義模型。至此,語(yǔ)義模型已經(jīng)符合項(xiàng)目的要求。
6、在得到簡(jiǎn)潔、明確、精細(xì)、合乎規(guī)范的語(yǔ)義模型之后,此時(shí)的語(yǔ)義模型已經(jīng)可以正確的使用,并產(chǎn)生dsl代碼文件了。
圖2所示為本發(fā)明基于xtext的特定領(lǐng)域語(yǔ)言的軟件工程設(shè)計(jì)方法的修改流程圖,如圖2所示,
在實(shí)際環(huán)境中,代碼文件必須簡(jiǎn)單明了,使項(xiàng)目的工作人員一目了然。所以還需要對(duì)dsl的語(yǔ)法模型進(jìn)行修改,如關(guān)鍵字定制、定制變量顯示、代碼格式等,具體包括:
1、檢查已有的語(yǔ)法模型是否需要優(yōu)化。如果需要優(yōu)化,則執(zhí)行步驟2。如果不需要優(yōu)化則執(zhí)行步驟三。
2、若是進(jìn)行模塊屬性的修改(如關(guān)鍵字的制定、變量與變量的值是否在前臺(tái)顯示、變量間的關(guān)系是否在前臺(tái)顯示、變量的值的顯示格式等)則通過(guò)xx.xtext(xx為項(xiàng)目人員輸入的文件名)文件進(jìn)行修改;若是代碼格式的修改(如代碼間的空行、代碼的縮進(jìn)等),則通過(guò)xxformatting.xtend(xx為項(xiàng)目人員輸入的文件名)文件進(jìn)行修改。
3、得到項(xiàng)目最終的dsl語(yǔ)法模型。
步驟三dsl的c/java代碼生成,包括:
在生成代碼之前,還有其他輔助工作需要完成。由于代碼的不確定性,需要對(duì)dsl代碼進(jìn)行驗(yàn)證。
本發(fā)明一種基于xtext的特定領(lǐng)域語(yǔ)言的軟件工程設(shè)計(jì)方法,采用在xtext自帶的語(yǔ)法驗(yàn)證模塊xxvalidator.xtend(xx為項(xiàng)目人員輸入的文件名)編輯驗(yàn)證規(guī)則的方法,對(duì)代碼進(jìn)行驗(yàn)證,以確保dsl代碼以及生成的c/java代碼的正確性。同時(shí),對(duì)于沒(méi)有通過(guò)驗(yàn)證的代碼字段,應(yīng)當(dāng)給予相應(yīng)的標(biāo)注和提示,以便項(xiàng)目人員第一時(shí)間能夠發(fā)現(xiàn)代碼中的問(wèn)題,并著手解決。對(duì)于標(biāo)注為“注意(warning)”及“錯(cuò)誤(error)”的代碼字段,應(yīng)該盡量提供快速修正的方法。其中,快速修正的方法,在quickfixprovider.xtend文件中進(jìn)行定制。由于快速修正的方法有一定的局限性,即不能提供所有問(wèn)題情況下的快速修正,所以對(duì)于“注意(warning)”及“錯(cuò)誤(error)”的描述信息應(yīng)當(dāng)盡可能的詳細(xì),以便項(xiàng)目相關(guān)人員能夠明確問(wèn)題的因果關(guān)系并解決問(wèn)題。制定“注意(warning)”及“錯(cuò)誤(error)”的描述信息的默認(rèn)文件是xxvalidator.xtend(xx為項(xiàng)目人員輸入的文件名)。代碼生成的模板文件默認(rèn)為generator.xtend。在自動(dòng)生成代碼之前,需要在文件中定制符合項(xiàng)目dsl的代碼生成模板。只有有了正確精準(zhǔn)的dsl代碼之后,才能夠生成符合項(xiàng)目要求的c/java代碼。
完成上述步驟之后,即可自動(dòng)生成c/java代碼,圖3所示為dsl的c/java代碼生成流程圖,如圖3所示,dsl代碼文件將由xxvalidator.xtend(xx為項(xiàng)目人員輸入的文件名)進(jìn)行驗(yàn)證。如果驗(yàn)證不通過(guò),則會(huì)給出錯(cuò)誤信息,再由項(xiàng)目相關(guān)人員選擇手動(dòng)修改或是自動(dòng)修改。修改過(guò)的dsl代碼將再次執(zhí)行步驟1,被驗(yàn)證器再次驗(yàn)證。如果代碼驗(yàn)證通過(guò),dsl代碼將結(jié)合步驟二中的拓?fù)鋱D,由相關(guān)人員依照拓?fù)浣Y(jié)構(gòu)順序定制代碼生成的先后順序。再通過(guò)代碼生成模板,產(chǎn)生邏輯關(guān)系明確的c/java代碼。
本發(fā)明的一種基于xtext的特定領(lǐng)域語(yǔ)言設(shè)計(jì)方法,規(guī)范dsl設(shè)計(jì)流程,降低了dsl構(gòu)建成本。同時(shí)基于xtext的代碼驗(yàn)證模塊,幫助相關(guān)人員調(diào)式代碼,加強(qiáng)dsl對(duì)軟件環(huán)境的適應(yīng)性。最后,讓dsl代碼自動(dòng)生成c/java代碼,避免了語(yǔ)言噪聲與語(yǔ)言集中營(yíng)問(wèn)題。
以上所述僅是本發(fā)明的優(yōu)選實(shí)施方式,應(yīng)當(dāng)指出,對(duì)于本技術(shù)領(lǐng)域的普通技術(shù)人員來(lái)說(shuō),在不脫離本發(fā)明技術(shù)原理的前提下,還可以做出若干改進(jìn)和變形,這些改進(jìn)和變形也應(yīng)視為本發(fā)明的保護(hù)范圍。