Page 82 - 《软件学报》2021年第6期
P. 82
1656 Journal of Software 软件学报 Vol.32, No.6, June 2021
Inserter 位置,对应到代码片段 2 的第 3 行、第 4 行、第 16 行、第 17 行和第 28 行.D 和 E 组件同理.接下来,第
4 层的 F 和 G 组件分别插入到带有{{0,0B}}和{{0,1B}}分支标记的 Inserter 位置,对应到代码片段 2 的第 5 行
和第 20 行.第 5 层的 H,I,J,K 组件的处理方式同 C 组件.第 6 层的 L 和 M 组件可以直接根据它们的分支标记确
定插入位置.第 7 层的 N 组件和 M 组件类似,只不过在处理{0,0B}分支的时候,要把{0,0B,0F}和{0,0B,1F}对应的
Inserter 删除,对应到代码片段 2 的第 10 行、第 14 行.第 8 层的 O 组件的处理方式同 M.最后,把 CGLT 中的所
有 Inserter 删除.根据代码片段 2 中的代码生成位置表,可以直接翻译为各种主流的编程语言,将 ActorExe 元素
转化为组件对应的执行语句,Branch 元素转化为 if,else if,switch 等流程控制语句即可.
代码片段 2. 由图 2 中模型生成的代码生成位置表.
1: ActorExe:A(⋅) //迭代第 1 层 A 组件时创建
2: ActorExe:B(A) //迭代第 2 层 B 组件时创建
3: Branch({{0,0B}}) //迭代第 3 层 C 组件时创建
4: ActorExe:C(B) //迭代第 3 层 C 组件时创建
5: ActorExe:F(C) //迭代第 4 层 F 组件时创建
6: Branch({{0,0B,0F}}) //迭代第 5 层 H 组件时创建
7: ActorExe:H(F) //迭代第 5 层 H 组件时创建
8: ActorExe:L(H) //迭代第 6 层 L 组件时创建
9: ActorExe:M(H) //迭代第 6 层 M 组件时创建
10: Inserter({{0,0B,0F}}) //迭代第 5 层 H 组件时创建,迭代第 7 层 N 组件时删除
11: Branch({{0,0B,1F}}) //迭代第 5 层 H 组件时创建
12: ActorExe:I(F) //迭代第 5 层 I 组件时创建
13: ActorExe:M(I) //迭代第 6 层 M 组件时创建
14: Inserter({{0,0B,1F}}) //迭代第 5 层 H 组件时创建,迭代第 7 层 N 组件时删除
15: ActorExe:N(M) //迭代第 7 层 N 组件时创建
16: Inserter({{0,0B}}) //迭代第 3 层 C 组件时创建,迭代第 8 层 O 组件时删除
17: Branch ({{0,1B}}) //迭代第 3 层 C 组件时创建
18: ActorExe:D(B) //迭代第 3 层 D 组件时创建
19: ActorExe:E(B) //迭代第 3 层 E 组件时创建
20: ActorExe:G(D) //迭代第 4 层 G 组件时创建
21: Branch({{0,1B,0G}}) //迭代第 5 层 J 组件时创建
22: ActorExe:J(G) //迭代第 5 层 J 组件时创建
23: ActorExe:N(J) //迭代第 7 层 N 组件时创建
24: Inserter({{0,1B,0G}}) //迭代第 5 层 J 组件时创建,迭代第 8 层 O 组件时删除
25: Branch ({{0,1B,1G}}) //迭代第 5 层 J 组件时创建
26: ActorExe:K(G) //迭代第 5 层 K 组件时创建
27: ActorExe:N(K) //迭代第 7 层 N 组件时创建
28: Inserter({{0,1B,1G}}) //迭代第 5 层 J 组件时创建,迭代第 8 层 O 组件时删除
29: Inserter({{0,1B}}) //迭代第 3 层 C 组件时创建,迭代第 8 层 O 组件时删除
30: ActorExe:O(N) //迭代第 8 层 O 组件时创建
31: Inserter({{0}}) //算法开始时创建,算法结束时删除
5 案例实验及对比
由于 Ptolemy-II 构建的带有复杂分支的数据流模型看起来更直观些,我们使用 Ptolemy-II 构建 3 种不同分