Page 86 - 《软件学报》2021年第6期
P. 86

1660                                     Journal of Software  软件学报 Vol.32, No.6,  June 2021

         个模型翻译成等价的 Simulink 模型之后,再对其进行代码生成.这样,在 Simulink 中,模型通过组件的表达情况也
         可以作为重要的参考依据,以表明数据流模型中分支组件的重要性.我们使用相同的实验环境对不同代码生成
         器生成的代码进行编译,之后,为了更好地消除随机性误差,我们在相同的环境下运行 10 000 次编译后的程序,
         得出它们的万次运行时间(ms).实验结果见表 3.
                      Table 3    Comparison between Simulink, PtolemyII, and ours on code generatation
                              表 3   Simulink,PtolemyII 和本文工作在代码生成上的比较
                      模型        组件个数      模型深度      代码生成器     代码行数    代码文件数     运行时间(ms)
                                                     Simulink   512      9         984
                  分支合并情况的      Simulink:14   Simulink:8   PtolemyII   11 556   52   1 718
                   模型(表 2(a))   PtolemyII:6   PtolemyII:6
                                                    本文工作        18       1         812
                                                     Simulink   543      9         937
                  分支嵌套情况的      Simulink:32   Simulink:13   PtolemyII   12 175   60   1 811
                   模型(表 2(b))   PtolemyII:10   PtolemyII:7
                                                    本文工作        28       1         843
                                                     Simulink   725      15        280
                  分支交叉情况的      Simulink:32   Simulink:12   PtolemyII   11 864   56   1 531
                   模型(表 2(c))   PtolemyII:8   PtolemyII:5
                                                    本文工作        20       1         108
                                                     Simulink   541      9         1 286
                  复杂分支情况       Simulink:58   Simulink:21
                 组合的模型(图 4)    PtolemyII:15   PtolemyII:9   PtolemyII  13 940  87  运行时错误
                                                    本文工作        49       1         1 078
                                                     Simulink   580      10        871
                               Simulink:34   Simulink:13
                      平均                            PtolemyII   12 383   63        1 686
                               PtolemyII:9   PtolemyII:6
                                                    本文工作        28       1         710
             本文通过对比 PtolemyII 和 Simulink 构建相同的模型所需的组件个数和模型深度,来说明使用分支组件表
         达模型的效率和复杂度,这里的模型深度表示模型对应的有向无环图的最长路径长度.从表 3 中可以看出:使用
         PtolemyII 建模相比 Simulink 可以节省约 73.5%的组件个数,模型深度可以减少约 53.8%;使用数据流分支组件
         进行建模,可以简化建模难度、提升建模效率.
             另外,更重要的是,本文提出的解决分支组件代码生成的工作相比 PtolemyII 和 Simulink 各自的代码生成器
         都有明显的提升:在生成的代码行数上,相比 Simulink 减少约 95.1%,相比 PtolemyII 减少约 99.7%;在生成代码的
         运行时间上,相比 Simulink 提速约 18.4%,相比 PtolemyII 提速约 57.8%.Simulink 生成的代码会包含很多仿真环
         境的定义、数据及数据类型的定义,而实际上,大部分的定义都是没有被使用的.PtolemyII 会按照事件传递执行
         的方式生成代码,为模型中的每个组件都生成一个单独的代码文件,并且引入了复杂的数据传递的实现代码.显
         然,这种代码很难被用于嵌入式系统.

         6    总结与展望
             本文针对带有复杂数据分支结构的数据流模型,提出了基于分支调度标记的代码生成方法.该方法首先通
         过拓扑排序对模型进行调度分层,然后以分支组件为依据对模型中的各个组件进行分支标记,之后根据分支标
         记生成基于控制流的组件代码生成位置表,最后可直接根据代码生成位置表转化为目标语言代码.本文所提出
         的方法解决了数据流模型中由分支组件带来的建模或者代码生成的约束问题,并且可以生成和数据流模型一
         致的控制逻辑的代码,极大地解放了分支组件在数据流模型中的表达能力.本文中所描述的分支标记算法能够
         有效地避免由于分支嵌套和交叉所带来的代码生成的“分支爆炸”问题,该算法在分支标记过程中对组件的分
         支标记进行化简,使组件所拥有的分支标记数量一直保持最少的水平.同时,本文提出了基于分支标记的插入式
         代码生成方法,通过这样插入式的方法构造的代码生成位置表保证了它的控制逻辑和模型逻辑的一致性,也保
         证了代码中组件的执行顺序不会发生错乱.此外,通过案例实验并对比 PtolemyII 和 Simulink 各自的代码生成器,
         进一步说明了本文工作的价值意义.
             本文的算法可以在构建完代码生成位置表之后做进一步的代码级的优化,当生成多个分支结构的时候,如
         果这些分支结构属于并列的 if 和 else if 关系,并且这些分支结构内部的代码是完全一致的,那么就可以将这些
   81   82   83   84   85   86   87   88   89   90   91