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 关系,并且这些分支结构内部的代码是完全一致的,那么就可以将这些