999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于活動圖與順序圖的自動代碼生成

2021-09-06 01:48:31文浩,蔣建民,張仕,洪中
軟件工程 2021年8期

文浩,蔣建民,張仕,洪中

摘? 要:在模型驅動開發過程中,為了減輕開發人員的負擔,通常采用自動工具生成代碼框架。本文提出了一種基于活動圖與順序圖自動生成代碼框架的方法,并且基于該方法開發了原型工具。首先,給出了活動圖和順序圖的形式化表達;其次,基于活動圖和順序圖模型提出了三個實現自動代碼生成的算法,該算法是通過活動圖來描述對象內部的活動次序,并且利用順序圖體現對象之間的交互;最后,給出了一個原型工具,實現了模型到代碼框架的自動轉換。該工作可以確保轉換的正確性,并且提高軟件開發效率。

關鍵詞:模型驅動開發;自動代碼生成;形式化方法

中圖分類號:TP311.5? ? ?文獻標識碼:A

Automatic Code Generation based on Activity and Sequence Diagrams

WEN Hao1,2, JIANG Jianmin3, ZHANG Shi1, HONG Zhong1

(1.College of Computer and Cyber Security, Fujian Normal University, Fuzhou 350117, China;

2.Chengdu Institute of Computer Applications, Chinese Academy of Sciences, Chengdu 610041, China;

3.College of Software Engineering, Chengdu University of Information Technology, Chengdu 610225, China)

caswh96@foxmail.com; jjm@cuit.edu.cn; shi@fjnu.edu.cn; fjfzhz@fjnu.edu.cn

Abstract: In the process of model-driven development, automatic tools are usually used to generate code frameworks in order to reduce the burden on developers. This paper proposes a method to automatically generate code framework based on activity diagram and sequence diagram, and a prototype tool is developed based on this method. First, this paper gives a formal expression of activity diagrams and sequence diagrams; secondly, three algorithms for realizing automatic code generation are proposed based on the activity diagram and sequence diagram. The algorithm uses activity diagrams to describe the internal activity sequence of the object and uses the sequence diagram to reflect the interaction between the objects; finally, a prototype tool is given to realize the automatic conversion from the model to the code framework. This work can ensure the correctness of the conversion and improve the efficiency of software development.

Keywords: model-driven development; automatic code generation; formal methods

1? ?引言(Introduction)

在各種開發方法中,模型驅動設計(Model-Driven Design)因其合理與高效已被工業界廣泛運用[1-2]。在模型驅動設計框架下,先對系統進行建模,隨后通過大量的分析與驗證對該模型進行更新與修改,這就使得在設計的早期階段就可以對錯誤進行檢測和糾正。統一建模語言(UML)就是該開發過程中最常用的一種可視化建模工具,它提供了很多不同類型的圖表,分別從不同的視點去建模系統,比如數據、行為、交互、組件架構等機制。

當開發人員用UML完成對系統的建模后,需要進一步將抽象模型轉換為更具體的模型,并最終轉換為可執行代碼。但在過去的大部分轉換過程中,由于沒有完整的自動化方法,導致整個過程的成本較高,并且其中的手工部分因為缺乏形式化方法的支撐,也會造成整個過程容易出錯[3]。近些年來,由于自動生成代碼領域的火熱,關于從UML模型生成對應代碼的研究變得越來越多[4-5]。但遺憾的是,目前大部分的研究都是將單一的UML模型與代碼之間進行關聯,這樣的策略在一定程度上會使得生成的代碼缺失一定的實施細節。為了解決上述問題,本文選擇了UML中的兩種模型,一種是活動圖(Activity Diagram),主要用于對業務流程進行建模;另一種是順序圖(Sequence Diagram),主要用于描述軟件的對象或者進程間的交互行為。基于這兩種不同圖的不同視點,本文提出了一個更加完善的自動代碼生成的方法。

我們依次給出了活動圖和順序圖模型的形式化定義,并基于兩個模型之間的關聯,將模型元素與代碼語句進行了對應,從而實現了代碼生成。本文給出的三個算法,則對應到如何實現代碼生成的自動化或半自動化。

2? ?活動圖和順序圖(Activity diagram and sequence diagram)

活動圖被廣泛運用于建模工作流或模擬業務流程,它在本質上是一種流程圖,著重表現從一個活動到另一個活動的控制流,而順序圖主要是用于顯示對象之間交互的圖。相比于使用單一UML模型,將活動圖與順序圖之間進行關聯后,可以結合不同的視點以及兩種圖不同的特性,使生成的代碼框架更加完整,細節更多,并更實用。在本節中,首先給出了活動圖和順序圖的形式化定義,隨后提出了一個關聯函數,用于描述活動圖與順序圖之間的關系。

活動圖是一種運用節點和邊的組合,可視化描述活動執行過程的UML圖,其中的節點可以分為活動節點、對象節點和控制節點。活動節點是活動圖中最主要的元素之一,它用來表示一個活動;對象節點是用來幫助定義活動中對象流的抽象活動節點;而控制節點則是一種可以協調其他節點之間流的特殊的活動節點。下面給出了一個活動圖抽象語法的定義。

定義1:一個活動圖是一個九元組AD=

Fn,Jn,R,Ia,Fa>,其中:

(1)A=AODnMnFnJnIaFa;

(2)AO,活動節點和對象節點的集合;

(3)Dn,選擇節點的集合;

(4)Mn,合并節點的集合;

(5)Fn,分叉節點的集合;

(6)Jn,匯合節點的集合;

(7)RA×A,活動和節點間關系的集合;

(8)Ia,初始節點的集合;

(9)Fa,終止節點的集合。

對活動圖的形式化定義來自我們目前的工作[6-8]。為了簡化處理,在本文中不區分對象節點和活動節點,即將所有對象節點都視作活動節點。同樣為了方便描述,我們給出了前置集和后置集的定義,即對于任意節點xA,它的前置集和后置集可以分別表示為。x={yA|(y,x)R}和x。={yA|(x,y)R}。

例1:圖1(a)是一個活動圖,可以表示為AD=

Mn,Fn,Jn,R,Ia,Fa>,其中A={i,a,b,p,c,d,e,g,h,j,k,

dn1,dn2,mn1,mn2,fn,jn,f},AO={a,b,p,c,d,e,g,h,j,k},Dn={dn1,dn2},Mn={mn1,mn2},Fn={fn},Jn={jn},R={(i,a),(a,mn1),(mn1,b),(b,dn1),(dn1,p),(p,mn1),(dn1,c),(c,dn2),(dn2,d),(d,mn2),(dn2,e),(e,fn),(fn,g),(fn,h),(g,jn),(h,jn),(jn,j),(j,mn2),(mn2,k),(k,f)},Ia={i},Fa={f}。并且可以很明顯得知,對于A中任意一個元素,比如b,可以得到。b={mn1}和b。={dn1}。

順序圖可視化地描述了對象之間按照時間順序進行信息交互的過程,它將交互展示為一個二維圖表,垂直維度上是一條被稱為生命線的虛線,該虛線繪制在每個對象的下面,用于體現時間與順序;而水平維度上主要體現在對象之間的信息交互,即消息的傳遞。下面給出了一個順序圖抽象語法的定義。

定義2:一個順序圖是一個三元組SD=,其中:

(1)S,信號的集合;

(2)O,對象的集合;

(3)MS×O×O,消息的集合。

在本文中,因為只關注對象之間的交互內容,所以在給出順序圖的形式化定義時,選擇了一種比較簡易的表達方式,該方式能更清晰地描述消息的傳遞過程。

例2:圖1(b)是一個順序圖,可以表示為SD1=

其中S1={c1,c2,c3,c4,c5},O1={AD,x,y},M1={(c1,AD,x),(c2,x,y),(c3,y,x),(c4,x,AD),(c5,AD,y)}。

為了在上述活動圖與順序圖之間建立聯系,本文利用一個關聯函數,將每個順序圖視為活動圖中的某一個活動節點的精化,即活動圖中的每一個活動都可以通過順序圖展開,精化后的活動圖相比于原來的活動圖具有更多的細節。

設為活動節點的集合,為所有順序圖的集合;稱函數map:為“關聯函數”。也就是說,對于所有的xAO,都可以通過關聯函數map得到與之對應的順序圖map(x)=,即通過一次關聯函數,得到的順序圖map(x)是對活動節點x所屬的活動圖AD的一次細節填充。

例3:圖1(a)表示的是一個活動圖AD=

Jn,R,Ia,Fa>,圖1(b)、圖1(c)分別表示的是兩個順序圖SD1和SD2。當c,pAO,分別存在map(c)=SD1,map(p)=SD2,即可以將SD1和SD2視作活動節點c和p所屬的活動圖AD的細節填充,其余的活動節點保持不變。

3? ?代碼生成規則(The rules for code generation)

前面介紹了關聯函數,建立了活動圖與順序圖之間的聯系,基于這種聯系,此部分提出了具體的代碼生成規則。首先,給出了一種代碼生成函數,使活動圖和順序圖中的節點與程序語句間形成對應關系;接著設計了三個算法,用于實現基于活動圖和順序圖的代碼自動生成。

3.1? ?代碼生成函數

把UML圖轉換成代碼框架的核心問題,就是如何使得圖形中的核心元素——節點,與代碼語句一一對應。為了在活動圖和順序圖的節點與Java語句之間建立聯系,下面給出了一個代碼生成函數的定義。

設是活動節點和消息的集合,是構成Java語言的語句集合;稱函數g:為“代碼生成函數”。

當代碼生成函數的輸入分別為活動節點和消息時,可以得到:

(1) xAO,x。Dn:g(x)=boolean x();

(2) xAO,x。A\Dn:g(x)=void x();

(3) xM,x=(s,o1,o2):g(x)=o2.s()。

表1給出了從活動節點和消息到Java代碼的詳細對應關系。當代碼生成函數的輸入是活動圖的活動節點時,可以根據該活動節點的后件進行分類:一種是當活動節點的后件為選擇節點時,因為選擇節點需要一個布爾值的輸入,所以將該活動節點對應的方法的返回值設置成布爾型。另一種是當活動節點的后件為非選擇節點時,因為除了選擇節點,其他的節點并不需要其前件的輸出作為該節點的輸入,所以將該活動節點對應的方法的返回值設置為空。當代碼生成函數的輸入是順序圖的消息時,可以通過識別該消息的發送對象與接收對象生成對應的方法,即該消息的接收對象執行該消息的對應方法。

3.2? ?算法設計

本文的自動代碼生成策略是,通過依次訪問活動圖中的活動節點以及各類節點之間的執行順序來生成代碼框架中的類定義與主函數內部的執行邏輯,再通過識別順序圖對象之間的通信來完善方法的調用。基于關聯函數map和代碼生成函數g,本節提出了算法1Gcd(AD,set1)、算法2Sc(AD)和算法3Gel(AD,set2,lp,AD_code),用于實現從活動圖自動生成代碼。

算法1Gcd(AD,set1)用于生成代碼框架中的類定義,如圖2所示。該算法以活動圖AD和順序圖的集合為輸入,輸出該活動圖AD對應生成的代碼AD_code。下面給出算法的具體解釋。

第1 行是根據輸入的活動圖的名字創建相應的Java包。第2—13 行則是遍歷該活動圖中的所有活動節點。其中,第3—6 行是識別當前活動節點的對象,如果在當前的代碼框架中沒有與該對象名相同的類,則添加對應的類定義;第7 行是向類中添加該活動節點對應的方法;第8—12 行是通過映射函數map尋找到set1中用于精化活動圖節點的對應順序圖,并且識別對應順序圖中所有的消息,生成對應的方法調用。第14—15 行是向代碼框架中添加Main類,并且向其中添加main()方法,最后是輸出生成的Java代碼框架。

算法1執行完成之后,活動圖對應的代碼框架中已經有了類定義的部分,但一個完整的代碼框架除了類定義及方法聲明,其主函數中還應該有具體的執行邏輯。為了準確描述活動圖中順序、選擇、循環、并發這四種不同的情況,下面分別給出了算法2Sc(AD)和算法3Gel(AD,set2,lp,AD_code),用于生成main()方法內具體的程序執行邏輯。

算法2Sc(AD)是為了找出活動圖中的環,識別可能會循環執行的活動節點,如圖3所示。該算法以活動圖AD為輸入,輸出AD所有環中的活動節點的集合lp。以圖1(a)中的活動圖AD為例,算法2的輸出為lp=Sc(AD)={b,q}。下面給出該算法的具體解釋。

第1—2 行分別定義一個集合lp和s,并且令lp和s為空。第3—18 行給出了一個深度優先的遞歸算法,判斷DFS函數中第一個輸入的后置節點是否與該輸入的前置節點,即第二個輸入之間存在連通關系,如果存在,則將存放路徑上的所有節點的集合s賦值給集合lp。第19—22 行是遍歷活動圖中的所有選擇節點,尋找活動圖中的所有環,并且依次將環中的節點存放到集合lp中。第23—24 行是取集合lp中的所有活動節點,最后輸出生成的集合lp。

基于算法1和算法2,算法3Gel(AD,set2,lp,AD_code)可以生成一個完整的代碼框架,如圖4所示。該算法以活動圖AD保存初始節點后件的集合set2,算法2輸出的集合lp和算法1生成的代碼框架為輸入,而輸出則是對應的更新后的代碼框架。下面給出該算法的具體解釋。

第1 行是定義一個集合al,用于存放已經存放的選擇節點。第2—48 行是使用深度優先的策略,從初始節點的后置節點開始,依次訪問活動圖中的每一個節點。其中,在第3—9 行里,當前節點為活動節點時,判斷當前執行的是否為主線程,如果是主線程,則在main()方法內調用該節點對應的方法,否則在run()方法內進行相同的方法調用(run()方法屬于線程類);在第10—17 行中,當前節點為選擇節點并且該節點的后置節點屬于集合lp時,生成對應的while語句,并且將該選擇節點存放到集合al中;在第18—19 行中,當前節點為選擇節點并且該節點屬于集合al時,跳轉至該選擇節點的后置節點;在第20—26 行中,當前節點為選擇節點并且該節點的后置節點不屬于集合lp時,生成對應的if語句;在第27—28 行里,當前節點為合并節點時,跳轉至該合并節點的后置節點;在第29—35 行中,當前節點為分叉節點時,根據當前節點的后置節點數減一的數量創建子線程,并且將子線程和主線程亂序地放入棧中;在第36—44 行里,當前節點為匯合節點時,令棧內位于頂部的線程出棧,如果此時的執行線程不為主線程,則在main()方法內調用對應線程的join()方法(主線程等待該線程執行完成后,再繼續執行),然后再繼續讓棧內的下一個線程出棧,執行上述操作,直至棧內為空;在第45—48 行里,當前節點為終止節點時,跳出所有循環。第49 行是輸出最后更新完的代碼框架。

綜上,算法1主要是根據AO和set1中的元素,生成相應的代碼語句,其時間復雜度為O(a×n),其中a表示AO中的節點個數,n表示set1中與活動節點對應的順序圖的個數。算法2是判斷活動圖中是否有環,并且將環中的活動節點取出,其時間復雜度為O(d×r),其中d表示Dn中的節點個數,r表示活動圖中邊的數量,即R中的元素個數。算法3是通過遍歷活動圖中的所有節點,根據不同的情況生成對應的執行邏輯,其時間復雜度為O(a×r),其中a表示AO中的節點個數,r表示R中的元素個數。在軟件開發的設計階段,因為UML圖是根據需求進行繪制的,所以節點數量及圖的數量都是有限的,開發人員有充分的時間通過這三個算法生成對應的代碼框架。

例4:圖5中的代碼框架就是通過算法1、算法2和算法3生成的,即AD_code=Gel(AD,set2,lp,Gcd(AD,set1)),其中AD為

圖1(a)中的活動圖,set1={map(c),map(p)},即分別對應圖1(b)、圖1(c)中的順序圖SD1和SD2,set2={a}則是對應活動圖AD中初始節點的后置集合,lp=Sc(AD)={b,q}表示AD中可能會循環發生的活動節點的集合。

4? ?原型工具(Prototype tool)

基于開源庫GoJS(https://gojs.net/latest/index.html),我們開發了原型工具codeGeneration(下載鏈接:https://pan.baidu.com/s/1Z1PzWioR2hRcdmFuwxZPMQ,提取碼:wgoc)用于實現UML模型到Java代碼框架的自動轉換。圖6是一個從活動圖轉換成對應代碼框架的實例。

5? ?結論(Conclusion)

基于模型的自動代碼生成與一致性驗證是實現自動化,以及提高軟件可靠性過程中必不可少的一個環節。本文基于UML模型中的活動圖和順序圖,給出了一套完整的Java代碼自動生

成的方法。相比于傳統的單模型轉換方法,我們的方法通過兩種模型間的關聯,可以讓生產的代碼框架具有更多的細節。

我們未來的工作主要包括兩個方面:一是基于這套自動代碼生成理論,對開發過程進行一致性驗證;二是提出一套系統理論,實現從代碼到模型的直接轉換,并且對代碼編碼過程進行分析,希望在轉換過程中不丟失任何細節,進一步研究涉及的一致性問題。

參考文獻(References)

[1] THOMAS A H, JOSEPH S. The embedded systems design challenge[C]//Formal Methods Europe. International Symposium on Formal Methods. Berlin: Springer, 2006:1-15.

[2] LEE E A. What's ahead for embedded software?[J]. Computer, 2000, 33(9):18-26.

[3] BALZER R. A 15 year perspective on automatic programming[J]. IEEE Transactions on Software Engineering, 1985(11):1257-1268.

[4] WANG Y, TALPIN J P, BENVENISTE A, et al. A semantics of UML state-machines using synchronous pre-order transition systems[C]//IEEE ISORC. Proceedings Third IEEE International Symposium on Object-Oriented Real-Time Distributed Computing. New York: IEEE, 2000:96-103.

[5] VAN C P, ANSGAR R, G?IRARD S ?, et al. Complete code generation from UML state machine[C]//MODELSWARD. Proceedings of the 5th International Conference on Model-Driven Engineering and Software Development. New Jersey: Wiley, 2017:208-219.

[6] 林添榮,蔣建民.UML活動圖的一種邏輯語義[J].福建師范大學學報(自然科學版),2010,26(03):26-30,39.

[7] 陳慧峰,余曉菲,蔣建民.UML活動圖的正確性檢測[J].軟件工程,2018,21(03):5-9,4.

[8] CHEN H, JIANG J, HONG Z, et al. Decomposition of UML activity diagrams[J]. Software: Practice and Experience, 2017, 48(1):105-122.

作者簡介:

文? ?浩(1996-),男,碩士生.研究領域:形式化方法.

蔣建民(1972-),男,博士,教授.研究領域:形式化方法.

張? ?仕(1977-),男,博士,副教授.研究領域:軟件工程.

洪? ?中(1979-),男,博士,副教授.研究領域:軟件工程.

主站蜘蛛池模板: 国产微拍精品| 亚洲中久无码永久在线观看软件 | 69视频国产| 久久精品亚洲专区| 精品国产成人a在线观看| 国产成人高精品免费视频| 精品国产三级在线观看| 国产精品亚洲一区二区三区z | 亚洲av综合网| 3344在线观看无码| 久久精品这里只有精99品| 亚洲国产综合精品中文第一| 色屁屁一区二区三区视频国产| 日韩高清成人| 青青久视频| 日韩午夜片| 91丝袜在线观看| 国产精品va| 欧美精品高清| 99精品视频播放| 黄色国产在线| 久久久久亚洲AV成人网站软件| 国产一区在线视频观看| 精品成人一区二区| AV不卡国产在线观看| 欧美中出一区二区| 农村乱人伦一区二区| 一本综合久久| 搞黄网站免费观看| 色综合天天综合| 亚洲美女视频一区| 欧美劲爆第一页| 天天综合网亚洲网站| 国产精品久久自在自2021| 中文字幕精品一区二区三区视频| 中文字幕亚洲另类天堂| 亚洲色图欧美在线| 亚洲婷婷六月| 麻豆精品在线| 国产欧美日韩资源在线观看| 亚洲精品无码成人片在线观看| 国产午夜一级毛片| 欧美激情,国产精品| 无码人妻热线精品视频| 日韩av高清无码一区二区三区| 国产三级精品三级在线观看| 成人中文字幕在线| 久久亚洲国产一区二区| 在线一级毛片| 国产乱人激情H在线观看| 日韩毛片在线视频| 成人国产一区二区三区| 日韩小视频在线播放| 国产精品13页| 99精品国产自在现线观看| 91在线精品免费免费播放| 色哟哟国产精品一区二区| 波多野结衣二区| 伊人成色综合网| 国产成人凹凸视频在线| 国产精品lululu在线观看| 国产AV无码专区亚洲精品网站| 乱色熟女综合一区二区| 久久综合结合久久狠狠狠97色| 成人精品午夜福利在线播放| 欧美精品伊人久久| 2020国产在线视精品在| 欧美啪啪网| 丰满人妻久久中文字幕| 自慰网址在线观看| 国产在线欧美| 亚洲首页国产精品丝袜| 园内精品自拍视频在线播放| 午夜视频日本| 女人爽到高潮免费视频大全| 国产欧美在线观看一区| 亚洲性影院| 97在线观看视频免费| 国产jizz| 亚洲三级视频在线观看| 91区国产福利在线观看午夜| 精品无码国产一区二区三区AV|